<?xml version="1.0" encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" 
      xmlns:app="http://www.w3.org/2007/app"
      xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">

    <title type="html">Search for [grails] in weblog rd</title>
    <subtitle type="html">Search results for [grails] within weblog Raible Designs</subtitle>
    <id>https://raibledesigns.com/rd/feed/entries/atom?q=grails</id>

    <link rel="self" type="application/atom+xml" 
        href="https://raibledesigns.com/rd/feed/entries/atom?q=grails" />

    <link rel="alternate" type="text/html" 
        href="https://raibledesigns.com/rd/search?q=grails" />

    <link rel="search" type="application/opensearchdescription+xml" 
        href="https://raibledesigns.com/roller-services/opensearch/rd" />
    <opensearch:Query role="request" searchTerms="grails" startPage="1" />

    <link rel="first" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?q=grails" />
    <link rel="next" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?q=grails&amp;page=1" />
    <updated>2026-05-09T04:29:55-06:00</updated>
    <generator uri="http://roller.apache.org" version="5.0.3 (1388864191739:dave)">Apache Roller</generator>

        <entry>
        <id>https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at</id>
        <title type="html">A Fantastically Fun February at Jfokus 2020 and the Rocky Mountain JUGs</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_fantastically_fun_february_at"/>
        <published>2020-03-15T14:24:25-06:00</published>
        <updated>2020-03-16T18:20:47-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="utahjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jfokus2020" scheme="http://roller.apache.org/ns/tags/" />
        <category term="denverjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bouderjug" scheme="http://roller.apache.org/ns/tags/" />
        <category term="skiing" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jfokus" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;Jfokus is one of my favorite conferences in the world. It takes place in Stockholm, Sweden, during one of the coldest months of the year. As a native Montanan, I love the winter season and skiing. It was with great pleasure that I returned to Jfokus as a speaker this year, after skipping the last couple of years.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4_c.jpg&quot; title=&quot;Made it to Stockholm!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662000118/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4.jpg&quot; width=&quot;500&quot; alt=&quot;Made it to Stockholm!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;True story: the last time I was at Jfokus was 2017, and Okta had just acquired Stormpath. I negotiated my Okta employment terms in the Radisson Blu lobby!&lt;/p&gt;

&lt;p&gt;I gave three talks this year: two on the main stage during Jfokus and one at Jforum Stockholm on Tuesday evening.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;Jfokus is one of my favorite conferences in the world. It takes place in Stockholm, Sweden, during one of the coldest months of the year. As a native Montanan, I love the winter season and skiing. It was with great pleasure that I returned to Jfokus as a speaker this year, after skipping the last couple of years.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4_c.jpg&quot; title=&quot;Made it to Stockholm!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662000118/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662000118_bf765664e4.jpg&quot; width=&quot;500&quot; alt=&quot;Made it to Stockholm!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;True story: the last time I was at Jfokus was 2017, and Okta had just acquired Stormpath. I negotiated my Okta employment terms in the Radisson Blu lobby!&lt;/p&gt;

&lt;p&gt;I gave three talks this year: two on the main stage during Jfokus and one at Jforum Stockholm on Tuesday evening.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662828892_27e1eed875_c.jpg&quot; title=&quot;The Main Stage&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662828892/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662828892_27e1eed875_m.jpg&quot; width=&quot;240&quot; alt=&quot;The Main Stage&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662550446_2a6a6d2fbf_c.jpg&quot; title=&quot;Crowd at JForum (Stockholm JUG)&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662550446/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662550446_2a6a6d2fbf_m.jpg&quot; width=&quot;240&quot; alt=&quot;Crowd at JForum (Stockholm JUG)&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  You can find my presentations below.&lt;/p&gt;
&lt;table style=&quot;margin: 0 auto&quot;&gt;
  &lt;tr&gt;
    &lt;td&gt;
      &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;0b32783ee80c4ad69075affe48551383&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
    &lt;/td&gt;
    &lt;td&gt;
      &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;1f40e53acdf7441895e526dc19468ae1&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td colspan=&quot;2&quot;&gt;
      &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;7bed076e8b6e46c1950decd07fcba13c&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
  Jfokus also published recordings of my main-stage sessions on YouTube.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; style=&quot;max-width: 100%&quot; src=&quot;https://www.youtube.com/embed/DLQqJg393wM&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; style=&quot;max-width: 100%&quot; src=&quot;https://www.youtube.com/embed/CCf0224_XBI&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;After Jfokus, the organizers planned a speaker&apos;s conference at &lt;a href=&quot;https://www.skistar.com/en/ski-destinations/trysil/ski-area/&quot;&gt;Trysil Ski Area&lt;/a&gt;. There wasn&apos;t a ton of snow, but the groomers were fast, and they had a 45&#176; double black!&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662014628_42965e5213_c.jpg&quot; title=&quot;Trysil Ski Resort&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662014628/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662014628_42965e5213_q.jpg&quot; width=&quot;150&quot; alt=&quot;Trysil Ski Resort&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662835872_9a9a41638f_c.jpg&quot; title=&quot;The Jfokus 2020 Ski Team!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662835872/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662835872_9a9a41638f_q.jpg&quot; width=&quot;150&quot; alt=&quot;The Jfokus 2020 Ski Team!&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662836782_1f3aec2f11_c.jpg&quot; title=&quot;The 45&#176; ??&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662836782/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662836782_1f3aec2f11_q.jpg&quot; width=&quot;150&quot; alt=&quot;The 45&#176; ??&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I had my GoPro and shot some footage of the fun. &lt;/p&gt;

&lt;div style=&quot;text-align: center&quot;&gt;
  &lt;iframe src=&quot;https://player.vimeo.com/video/397652628&quot; width=&quot;640&quot; height=&quot;360&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; fullscreen&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;The beer tasting and dinner that evening at Kveik Restaurant &amp;amp; Brewpub was excellent!&lt;/p&gt;

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;no&quot; dir=&quot;ltr&quot;&gt;Beer tasting at Kveik Restaurant &amp;amp; Brewpub in Trysil, Norway. ?? &lt;a href=&quot;https://twitter.com/hashtag/jfokus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jfokus&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/speakerconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#speakerconf&lt;/a&gt; &lt;a href=&quot;https://t.co/CR8t2fjmR6&quot;&gt;pic.twitter.com/CR8t2fjmR6&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1225507738677063680?ref_src=twsrc%5Etfw&quot;&gt;February 6, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
  Friday was a gorgeous day on the slopes, and Saturday was the opposite.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Yesterday versus today. &lt;a href=&quot;https://twitter.com/hashtag/whiteout?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#whiteout&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/skiing?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#skiing&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/jfokus?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jfokus&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/speakerconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#speakerconf&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/day15?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#day15&lt;/a&gt; &lt;a href=&quot;https://t.co/L7ynGv0Umt&quot;&gt;pic.twitter.com/L7ynGv0Umt&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1226062130316599296?ref_src=twsrc%5Etfw&quot;&gt;February 8, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
  I had a marvelous time at &lt;a href=&quot;https://jfokus.se&quot;&gt;Jfokus&lt;/a&gt; 2020! Thanks to
  &lt;a href=&quot;https://twitter.com/matkar&quot;&gt;Mattias Karlsson&lt;/a&gt; and crew for a exquisite experience! &amp;#x1F44C;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662551551_9cf7cae2fa_c.jpg&quot; title=&quot;Dressed up with Mattias for the Jfokus party!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662551551/in/album-72157713496655132/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662551551_9cf7cae2fa.jpg&quot; width=&quot;500&quot; alt=&quot;Dressed up with Mattias for the Jfokus party!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;font-size: .9em;font-style: italic;text-align: right;margin-top: -15px !important;width: 500px;margin: 0 auto;&quot;&gt;For more photos see my &lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157713496655132&quot;&gt;Jfokus 2020 album&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&quot;rocky-mountain-jug-tour&quot;&gt;Rocky Mountain JUG Tour with Ray Tsang&lt;/h3&gt;
&lt;p&gt;
  I flew back to Denver on Sunday, February 9th. The next day, I woke up early for a &lt;a href=&quot;https://www.meetup.com/dev-ski-days/events/267834183/&quot;&gt;Developer Ski Day at Eldora&lt;/a&gt;. Stout the Syncro was not a big supporter of the event.
&lt;/p&gt;
&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Doh! Just when I thought my Syncro Westy was doing great, something breaks. Loud thump like I&amp;#39;d run over something, then a knocking while driving. I&amp;#39;m guessing it&amp;#39;s a ball joint in the front.&lt;br&gt;&lt;br&gt;Currently waiting for a tow from AAA.&lt;br&gt;&lt;br&gt;Heckuva start to &lt;a href=&quot;https://twitter.com/hashtag/DevSkiDay?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#DevSkiDay&lt;/a&gt;! &lt;a href=&quot;https://twitter.com/hashtag/VanLife?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#VanLife&lt;/a&gt; &lt;a href=&quot;https://t.co/2KMUZSTdtX&quot;&gt;pic.twitter.com/2KMUZSTdtX&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Raible (@mraible) &lt;a href=&quot;https://twitter.com/mraible/status/1226878533714292738?ref_src=twsrc%5Etfw&quot;&gt;February 10, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
  Once I made it on the slopes, we had a ball with Christina, Ben, Robert, and Joel.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49521529932_d9623d5318_c.jpg&quot; title=&quot;The inaugural crew!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49521529932/in/album-72157713068403413/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49521529932_d9623d5318_m.jpg&quot; width=&quot;240&quot; alt=&quot;The inaugural crew!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49526258492_1697766cf4_c.jpg&quot; title=&quot;Ray, Christina, and Ben&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49526258492/in/album-72157713068403413/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49526258492_1697766cf4_m.jpg&quot; width=&quot;240&quot; alt=&quot;Ray, Christina, and Ben&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div style=&quot;font-size: .9em;font-style: italic;text-align: right;margin-top: -15px !important;width: 500px;margin: 0 auto;&quot;&gt;&lt;a href=&quot;https://www.flickr.com/photos/mraible/albums/72157713068403413&quot;&gt;More photos &amp;#x2192;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
  On Tuesday, Ray and I prepared for our Rocky Mountain JUG Tour consisting of stops in Boulder, Denver, and Salt Lake City. I met him at a Google Boulder office and delighted in the VW decorations.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662120773_4d38d18c2d_c.jpg&quot; title=&quot;Lunch at Google in Boulder with Ray Tsang. I dig the VW Bus in the lobby!&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662120773/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662120773_4d38d18c2d.jpg&quot; width=&quot;500&quot; alt=&quot;Lunch at Google in Boulder with Ray Tsang. I dig the VW Bus in the lobby!&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662941707_4f3fedf91e_c.jpg&quot; title=&quot;A great quote with VW parts on the wall at Google  Boulder.&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662941707/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662941707_4f3fedf91e.jpg&quot; width=&quot;500&quot; alt=&quot;A great quote with VW parts on the wall at Google  Boulder.&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Our talk was titled &lt;b&gt;Choose Your Own Adventure with JHipster and Kubernetes&lt;/b&gt;. We used JHipster to build and deploy whatever technologies the audience chose. We let them choose the database, the build tool, the JVM language, the web framework, and the architecture (monolith vs microservices). After we created the apps, I showed them running, and made them work with Okta. Ray took it from there and used JHipster&apos;s Kubernetes generator to add (or exclude) Istio and deploy everything to Google Cloud. When all worked on the first try at the Denver JUG, &lt;a href=&quot;https://youtu.be/SolTvAXhaVc?t=4337&quot;&gt;we were pretty pumped&lt;/a&gt;! &amp;#x1F64C;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662122783_135d871c02_c.jpg&quot; title=&quot;Stop 1: Boulder JUG&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662122783/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662122783_135d871c02_q.jpg&quot; width=&quot;150&quot; alt=&quot;Stop 1: Boulder JUG&quot; style=&quot;border: 1px solid black;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662944032_f06872ba97_c.jpg&quot; title=&quot;Stop 2: Denver JUG&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662944032/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662944032_f06872ba97_q.jpg&quot; width=&quot;150&quot; alt=&quot;Stop 2: Denver JUG&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
  &lt;a href=&quot;https://live.staticflickr.com/65535/49662664076_e174fa7882_c.jpg&quot; title=&quot;Stop 3: Utah JUG&quot; rel=&quot;lightbox[jfokus2020]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/49662664076/&quot;&gt;&lt;img src=&quot;https://live.staticflickr.com/65535/49662664076_e174fa7882_q.jpg&quot; width=&quot;150&quot; alt=&quot;Stop 3: Utah JUG&quot; style=&quot;border: 1px solid black; margin-left: 15px;&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  Interesting trends: we had a lot of enthusiasm for Grails in Colorado and all audiences chose microservices. You can skim through our presentation below.&lt;/p&gt;
&lt;p style=&quot;text-align: center; padding: 20px&quot;&gt;
  &lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;e19bd9dc6911471a9bdaf2d2c6654987&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;
  On Friday, we hit the slopes for &lt;a href=&quot;https://www.meetup.com/dev-ski-days/events/267834234/&quot;&gt;another developer ski day&lt;/a&gt;.
&lt;/p&gt;

&lt;div style=&quot;max-width: 500px; margin: 0 auto&quot;&gt;
  &lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned data-instgrm-permalink=&quot;https://www.instagram.com/p/B8jsREGF3PZ/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; data-instgrm-version=&quot;12&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/B8jsREGF3PZ/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; height=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns&lt;img src=&quot;https://raibledesigns.com/images/smileys/love.gif&quot; class=&quot;smiley&quot; alt=&quot;:x&quot; title=&quot;:x&quot; /&gt;link=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt; View this post on Instagram&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/B8jsREGF3PZ/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot;&gt;?It&amp;#39;s a #HappyFriday at @snowbird with @saturnism2 and @brettgpalmer! ?#DevSkiDay&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;A post shared by &lt;a href=&quot;https://www.instagram.com/vwsforlife/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot;&gt; Matt Raible&lt;/a&gt; (@vwsforlife) on &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2020-02-14T18:40:07+00:00&quot;&gt;Feb 14, 2020 at 10:40am PST&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;

&lt;p&gt;Thanks to all the fine folks who joined our ski days and came to the JUG meetups! We loved the energy and community vibe from each location. &amp;#x2764;&amp;#xFE0F;&amp;#x1F603;&lt;/p&gt;

&lt;p&gt;Ray and I had a Rocky Mountain adventure with JHipster, and you can too! From the comfort of your own home, you can install &lt;a href=&quot;https://jhipster.tech&quot;&gt;JHipster&lt;/a&gt; and choose your own adventure. Good luck, and please let us know if you have any questions. &lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/grails_angular_vs_jhipster</id>
        <title type="html">Grails + Angular vs. JHipster</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/grails_angular_vs_jhipster"/>
        <published>2015-07-14T08:02:01-06:00</published>
        <updated>2015-07-14T14:02:01-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;I recently received an email from a long time follower of my comparing web frameworks research and presentations. He asked some interesting questions:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I am starting on a new venture to build a direct to consumer web application. I am planning to leverage Cloud services to build my CI/CD pipeline. I am very strong with Java Backend/middleware and learning Javascript Front-end frameworks. I love Spring and SOFEA. Having said that, I am wondering if I should use Grails + Angular or JHipster? My primary concern with JHipster is there is hardly any &#8216;community&apos;, there is Julien and whatever he says/thinks goes! Can you give me some pointers?
&lt;/a&gt;
&lt;p&gt;I imagine there&apos;s other JVM developers with similar questions, so I figured I&apos;d publish my response for all to see.&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
JHipster may have a smaller community than Grails, but remember that it&apos;s built on Spring Boot and AngularJS. Both have huge communities. In fact, Grails 3 is built on Spring Boot, just like JHipster. 
&lt;/p&gt;
&lt;p&gt;
Even though JHipster generates your code in Java, there&apos;s nothing preventing you from writing your code in Groovy or Scala. I dig JHipster, but I&apos;ve also worked with AngularJS and Spring Boot for a couple years. The fact that someone put these technologies together and makes it easy to work with them is awesome. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
I like JHipster so much, I decided to write a book on it. I hope to finish it in the next couple months and have it published in the fall. It&apos;ll be a free download from InfoQ. Learn more at &lt;a href=&quot;http://www.jhipster-book.com/&quot;&gt;http://www.jhipster-book.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Yes, I&apos;m probably a bit biased since I&apos;m writing a JHipster book. However, it&apos;s been easy for me to introduce and use Spring Boot at my last few clients. They were already using Spring, so the transition to using a Spring simplifier was a no-brainer. I haven&apos;t had as much luck getting clients to adopt Grails, even though I&apos;ve suggested it. That could change now that it&apos;s based on Spring Boot.&lt;/p&gt;
&lt;p&gt;What&apos;s your experience? Would you recommend Grails + Angular over JHipster? If so, why?</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/getting_hip_with_jhipster_at</id>
        <title type="html">Getting Hip with JHipster at Denver&apos;s Java User Group</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/getting_hip_with_jhipster_at"/>
        <published>2015-04-09T08:31:54-06:00</published>
        <updated>2015-04-09T19:20:43-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring-boot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="html5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yeoman" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;Last night, I had the pleasure of &lt;a href=&quot;http://www.meetup.com/DenverJavaUsersGroup/events/220309287/&quot;&gt;speaking at Denver&apos;s Java User Group Meetup about JHipster&lt;/a&gt;. I&apos;ve been a big fan of &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; ever since I started using it last fall. I developed a quick prototype for a client and wrote about &lt;a href=&quot;//raibledesigns.com/rd/entry/getting_started_with_jhipster_on&quot;&gt;solving some issues I had with it on OS X&lt;/a&gt;. I like the project because it encapsulates the primary open source tools I&apos;ve been using for the last couple of years: &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;, &lt;a href=&quot;https://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; and &lt;a href=&quot;http://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt;. I also wrote about its &lt;a href=&quot;http://www.infoq.com/news/2015/01/jhipster-2.0&quot;&gt;2.0 release&lt;/a&gt; on InfoQ in January.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;https://farm9.staticflickr.com/8820/16900780428_7093ff1754_c.jpg&quot; rel=&quot;lightbox[jhipsterdjug]&quot; data-href=&quot;https://www.flickr.com/photos/mraible/16900780428&quot; title=&quot;My Hipster Getup by Matt Raible, on Flickr&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8820/16900780428_7093ff1754_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;My Hipster Getup&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
To add some humor to my talk, I showed up as a well-dressed Java Developer. Like a mature gentleman might do, I started the evening with a glass of scotch (Glenlivet 12). Throughout the talk I became more hip and adjusted my attire, and beverage, accordingly. As you might expect, my demos had failures. The initial project creation stalled during Bower&apos;s &lt;em&gt;download all JavaScript dependencies&lt;/em&gt;. Luckily, I had a backup and was able to proceed. Towards the end, when I tried to deploy to Heroku, I was presented with a lovely message that &quot;Heroku toolbelt updating, please try again later&quot;. I guess auto-updating has its downsides. &lt;/p&gt;
&lt;p&gt;After finishing the demo, I cracked open a cold PBR to ease my frustration.&lt;/p&gt;
&lt;p&gt;I did two live coding sessions during this presentation; standing on the shoulders of giants to do so. I modeled Josh Long&apos;s &lt;a href=&quot;http://www.joshlong.com/jl/blogPost/tech_tip_geting_started_with_spring_boot.html&quot;&gt;Getting Started with Spring Boot&lt;/a&gt; to create a quick introduction to Spring Boot. IntelliJ IDEA 14.1 has a &lt;a href=&quot;http://blog.jetbrains.com/idea/2015/03/develop-spring-boot-applications-more-productively-with-intellij-idea-14-1/&quot;&gt;nice way to create Spring Boot projects&lt;/a&gt;, so that came in handy.  For the JHipster portion, I created a blogging app and used relationships and business logic similar to what Julien Dubois did in his &lt;a href=&quot;https://spring.io/blog/2015/03/31/webinar-replay-jhipster-for-spring-boot&quot;&gt;JHipster for Spring Boot Webinar&lt;/a&gt;. Watching Josh and Julien&apos;s demos will give you a similar experience to what DJUG attendees experienced last night, without the download/deployment failures.
&lt;/p&gt;
&lt;p&gt;You can click through my presentation below, download it from &lt;a href=&quot;//raibledesigns.com/rd/page/publications&quot;&gt;my
    presentations page&lt;/a&gt;, or &lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster&quot;&gt;view it on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/46814366&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You might notice my &lt;a href=&quot;http://www.slideshare.net/mraible/get-hip-with-jhipster/32&quot;&gt;announcement on slide #32&lt;/a&gt; that I&apos;ve signed up to write a book on JHipster.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://farm9.staticflickr.com/8825/17062597206_60a5bd6e19_c.jpg&quot; data-href=&quot;https://www.flickr.com/photos/mraible/17062597206&quot; rel=&quot;lightbox[jhipsterdjug]&quot; title=&quot;The JHipster Mini-Book by Matt Raible&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8825/17062597206_60a5bd6e19.jpg&quot; width=&quot;500&quot; alt=&quot;The JHipster Mini-Book&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I haven&apos;t started writing the book yet, but I have been talking with &lt;a href=&quot;http://infoq.com&quot;&gt;InfoQ&lt;/a&gt; and other folks about it for several months. I plan to use &lt;a href=&quot;https://github.com/asciidoctor/asciidoctor-gradle-examples&quot;&gt;Asciidoctor and Gradle&lt;/a&gt; as my authoring tools. If you have experience writing a book with these tools, I&apos;d love to hear about it. If you&apos;ve developed an application with JHipster and have some experience in the trenches, I&apos;d love to hear your stories too. 
&lt;/p&gt;
&lt;p&gt;
As I told DJUG last night, I plan to be done with the book in a few months. However, if you&apos;ve been a reader of this blog, you&apos;ll know I&apos;ve been planning to be done with my &apos;66 VW Bus in &lt;em&gt;just a few more months&lt;/em&gt; for quite some time, so that phrase has an interesting meaning for me. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/converting_an_application_to_jhipster</id>
        <title type="html">Converting an Application to JHipster</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/converting_an_application_to_jhipster"/>
        <published>2015-02-12T09:28:59-07:00</published>
        <updated>2015-02-12T15:29:50-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jhipster" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dosug" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://jhipster.github.io/&quot;&gt;&lt;img src=&quot;http://jhipster.github.io/images/logo-jhipster.png&quot; class=&quot;picture&quot; width=&quot;94&quot;&gt;&lt;/a&gt;
I&apos;ve been intrigued by &lt;a href=&quot;http://jhipster.github.io/&quot;&gt;JHipster&lt;/a&gt; ever since I first tried it &lt;a href=&quot;http://raibledesigns.com/rd/entry/getting_started_with_jhipster_on&quot;&gt;last September&lt;/a&gt;. I&apos;d worked with AngularJS and Spring Boot quite a bit, and I liked the idea that someone had combined them, adding some nifty features along the way. When I &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_art_of_angularjs_in&quot;&gt;spoke about AngularJS&lt;/a&gt; earlier this month, I included &lt;a href=&quot;http://www.slideshare.net/mraible/the-art-of-angularjs-in-2015/67&quot;&gt;a few slides on JHipster&lt;/a&gt; near the end of the presentation.&lt;/p&gt;
&lt;p&gt;This week, I received an email from someone who attended that presentation. &lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;Hey Matt,&lt;br&gt;
We met a few weeks back when you presented at DOSUG. You were talking about JHipster which I had been eyeing for a few months and wanted your quick .02 cents.&lt;/p&gt;
&lt;p&gt;
I have built a pretty heavy application over the last 6 months that is using mostly the same tech as JHipster. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Spring&lt;/li&gt;
&lt;li&gt;JPA&lt;/li&gt;
&lt;li&gt;AngularJS&lt;/li&gt;
&lt;li&gt;Compass&lt;/li&gt;
&lt;li&gt;Grunt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
It&apos;s ridiculously close for most of the tech stack. So, I was debating rolling it over into a JHipster app to make it a more familiar stack for folks. My concern is that it I will spend months trying to shoehorn it in for not much ROI. Any thoughts on going down this path?
What are the biggest issues you&apos;ve seen in using JHipster?
It seems pretty straightforward except for the entity generators. I&apos;m concerned they are totally different than what I am using. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
The main difference in what I&apos;m doing compared to JHipster is my almost complete use of groovy instead of old school Java in the app. I would have to be forced into going back to regular java beans...
Thoughts?&lt;/p&gt; 
&lt;/blockquote&gt;
&lt;p&gt;I replied with the following advice:&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
JHipster is great for starting a project, but I don&apos;t know that it buys you much value after the first few months. I would stick with your current setup and consider JHipster for your next project. I&apos;ve only prototyped with it, I haven&apos;t created any client apps or put anything in production. I have with Spring Boot and AngularJS though, so I like that JHipster combines them for me.
&lt;/p&gt;
&lt;p&gt;
JHipster doesn&apos;t generate Scala or Groovy code, but you could still use them in a project as long as you had Maven/Gradle configured properly. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
You might try generating a new app with JHipster and examine how they&apos;re doing this. At the very least, it can be a good learning tool, even if you&apos;re not using it directly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Java Hipsters: Do you agree with this advice? Have you tried migrating an existing app to JHipster? Are any of you using Scala or Groovy in your JHipster projects?&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_reduced</id>
        <title type="html">AppFuse, Reduced</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_reduced"/>
        <published>2014-12-16T06:03:31-07:00</published>
        <updated>2014-12-17T16:39:14-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maintenance" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lessxml" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
In November, I had some time off between clients. To occupy my time, I exercised my body and brain a bit. I spent a couple hours a day exercising and a few hours a day working on
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. AppFuse isn&apos;t used to start projects nearly as much as it once was. This makes sense since there&apos;s been a ton of innovation on the JVM and there&apos;s lots of
&lt;em&gt;get-started-quickly&lt;/em&gt; frameworks now. Among my favorites are Spring Boot, JHipster, Grails and Play.
&lt;p&gt;
    You can see that AppFuse&apos;s community activity has decreased quite a bit over the years by looking at its mailing list
    traffic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://appfuse.markmail.org/&quot;
       title=&quot;AppFuse Mailing List Traffic, December 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7525/15825430580_0531875e59.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Mailing List Traffic, December 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Even though there&apos;s not a lot of users talking on the mailing list, it still seems to get quite a few downloads from
    Maven Central.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/16011987392&quot;
       title=&quot;AppFuse Maven Central Stats, November 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7534/16011987392_442236433b.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Maven Central Stats, November 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I think the biggest value that AppFuse provides now is a learning tool for those who work on it. Also, it&apos;s a good place to
    show other developers how they can evolve with open source frameworks (e.g. Spring, Hibernate, JSF, Tapestry, Struts) over several years. Showing how
    we migrated to Spring MVC Test, for example, might be useful. The upcoming move to Spring Data instead of our
    Generic DAO solution might be interesting as well. 
&lt;/p&gt;
&lt;p&gt;
    Regardless of whether AppFuse is used a lot or not, it should be easy to maintain. Over the several weeks, I made some
    opinionated changes and achieved some pretty good progress on simplifying things and making the project easier to
    maintain. The previous structure has a lot of duplicate versions, properties and plugin configurations between
    different projects. I was able to leverage Maven&apos;s inheritance model to make a number of improvements:
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
In November, I had some time off between clients. To occupy my time, I exercised my body and brain a bit. I spent a couple hours a day exercising and a few hours a day working on
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. AppFuse isn&apos;t used to start projects nearly as much as it once was. This makes sense since there&apos;s been a ton of innovation on the JVM and there&apos;s lots of
&lt;em&gt;get-started-quickly&lt;/em&gt; frameworks now. Among my favorites are Spring Boot, JHipster, Grails and Play.
&lt;p&gt;
    You can see that AppFuse&apos;s community activity has decreased quite a bit over the years by looking at its mailing list
    traffic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://appfuse.markmail.org/&quot;
       title=&quot;AppFuse Mailing List Traffic, December 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7525/15825430580_0531875e59.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Mailing List Traffic, December 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Even though there&apos;s not a lot of users talking on the mailing list, it still seems to get quite a few downloads from
    Maven Central.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/16011987392&quot;
       title=&quot;AppFuse Maven Central Stats, November 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7534/16011987392_442236433b.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Maven Central Stats, November 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I think the biggest value that AppFuse provides now is a learning tool for those who work on it. Also, it&apos;s a good place to
    show other developers how they can evolve with open source frameworks (e.g. Spring, Hibernate, JSF, Tapestry, Struts) over several years. Showing how
    we migrated to Spring MVC Test, for example, might be useful. The upcoming move to Spring Data instead of our
    Generic DAO solution might be interesting as well. 
&lt;/p&gt;
&lt;p&gt;
    Regardless of whether AppFuse is used a lot or not, it should be easy to maintain. Over the several weeks, I made some
    opinionated changes and achieved some pretty good progress on simplifying things and making the project easier to
    maintain. The previous structure has a lot of duplicate versions, properties and plugin configurations between
    different projects. I was able to leverage Maven&apos;s inheritance model to make a number of improvements:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Changed AppFuse&apos;s parent to be based on the &lt;a
        href=&quot;http://www.infoq.com/news/2014/07/springio-platform&quot;&gt;Spring IO Platform&lt;/a&gt;. This project
        is a dependency manager that defines version numbers for open source projects that work well with Spring.
    &lt;/li&gt;
    &lt;li&gt;Defined plugins, their versions and configurations in &lt;code&gt;&amp;lt;pluginManagement&gt;&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Defined dependencies, their versions and exclusions in &lt;code&gt;&amp;lt;dependencyManagement&gt;&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Simplified archetypes so new projects have minimal dependencies. For example, here&apos;s a basic project&apos;s &lt;code&gt;pom.xml&lt;/code&gt;:
    &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;

    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;com.company&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;springmvc-project&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;AppFuse Spring MVC Application&amp;lt;/name&amp;gt;

    &amp;lt;parent&amp;gt;
        &amp;lt;groupId&amp;gt;org.appfuse&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;appfuse-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;3.5.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;/parent&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;de.juplo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;hibernate4-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;dbunit-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;build-helper-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.appfuse&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;appfuse-${web.framework}&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${appfuse.version}&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;amp.genericCore&amp;gt;true&amp;lt;/amp.genericCore&amp;gt;
        &amp;lt;amp.fullSource&amp;gt;false&amp;lt;/amp.fullSource&amp;gt;
        &amp;lt;dao.framework&amp;gt;hibernate&amp;lt;/dao.framework&amp;gt;
        &amp;lt;db.name&amp;gt;mydatabase&amp;lt;/db.name&amp;gt;
        &amp;lt;web.framework&amp;gt;spring&amp;lt;/web.framework&amp;gt;

        &amp;lt;!-- Framework/Plugin versions --&amp;gt;
        &amp;lt;appfuse.version&amp;gt;3.5.0-SNAPSHOT&amp;lt;/appfuse.version&amp;gt;
        &amp;lt;java.version&amp;gt;1.7&amp;lt;/java.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;profiles&amp;gt;
        &amp;lt;profile&amp;gt;
            &amp;lt;id&amp;gt;itest&amp;lt;/id&amp;gt;
            &amp;lt;build&amp;gt;
                &amp;lt;plugins&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.codehaus.cargo&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;cargo-maven2-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;webtest-maven-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                &amp;lt;/plugins&amp;gt;
            &amp;lt;/build&amp;gt;
        &amp;lt;/profile&amp;gt;
    &amp;lt;/profiles&amp;gt;

    &amp;lt;reporting&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;webtest-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/reporting&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
    span.diffstat {
        white-space: nowrap;
        text-align: right;
        font-family: Helvetica, arial, freesans, clean, sans-serif, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;
        color: #666;
        font-weight: bold;
        font-size: 12px;
        cursor: default;
    }

    span.diffstat .lines-added, span.diffstat .lines-deleted {
        display: inline-block;
        margin-left: 3px;
        font-weight: bold;
    }
&lt;/style&gt;
&lt;p&gt;
    The pull request for these changes says it all:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/appfuse/appfuse/pull/20&quot;&gt;AppFuse&lt;/a&gt; &lt;span class=&quot;diffstat&quot;&gt;
          &lt;span class=&quot;lines-added&quot; style=&quot;color: #55a532&quot;&gt;
            &lt;span class=&quot;diffstat-icon&quot;&gt;+&lt;/span&gt;4,822
          &lt;/span&gt;
          &lt;span class=&quot;lines-deleted&quot; style=&quot;color: #bd2c00&quot;&gt;
            &lt;span class=&quot;diffstat-icon&quot;&gt;-&lt;/span&gt;14,369
          &lt;/span&gt;
        &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/appfuse/appfuse-light/pull/1&quot;&gt;AppFuse Light&lt;/a&gt; &lt;span class=&quot;diffstat&quot;&gt;
              &lt;span class=&quot;lines-added&quot; style=&quot;color: #55a532&quot;&gt;
                &lt;span class=&quot;diffstat-icon&quot;&gt;+&lt;/span&gt;776
              &lt;/span&gt;
              &lt;span class=&quot;lines-deleted&quot; style=&quot;color: #bd2c00&quot;&gt;
                &lt;span class=&quot;diffstat-icon&quot;&gt;-&lt;/span&gt;4,687
              &lt;/span&gt;

            &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s right, I was able to eliminate a good chunk of code without affecting any of AppFuse&apos;s functionality&lt;sup&gt;&lt;a
    href=&quot;http://raibledesigns.com/rd/entry/appfuse_reduced#footnote1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.
    I think we can all agree that less code == easier maintenance. This theme will continue as we work on future
    releases.
&lt;/p&gt;

&lt;p&gt;Other improvements include migrating all tests to use JUnit4, integrating Spring MVC Test, and configuring the
    surefire plugin to run tests in parallel. I also The &lt;a href=&quot;http://mojo.codehaus.org/build-helper-maven-plugin/&quot;&gt;build-helper-maven-plugin&lt;/a&gt;
    is now used to find open ports for Cargo to run and a lot of testing was done to ensure you can build/test multiple
    AppFuse-derived projects at the same time. Finally, I migrated to the &lt;a href=&quot;http://juplo.de/hibernate4-maven-plugin/&quot;&gt;hibernate4-maven-plugin&lt;/a&gt; and upgraded to Tapestry 5.4.&lt;/p&gt;

&lt;p&gt;In the next version of AppFuse, I plan to remove as
    much XML as possible - moving all of the configuration to Spring&apos;s JavaConfig. We&apos;ll also be moving to Java 8 as a
    minimum. I&apos;m even considering getting rid of all the pom.xml files in favor of another build language that requires
    less code. &lt;/p&gt;
&lt;p&gt;In other words, the upcoming 3.5 release will be the last release that supports Java 7 and uses Spring&apos;s XML for configuration. AppFuse 4.0 will strive for #NoXML.
   &lt;a href=&quot;http://appfuse.org/display/APF/Roadmap&quot;&gt;The project&apos;s roadmap&lt;/a&gt; has more details on additional
    hopes and dreams.&lt;/p&gt;

&lt;p&gt;We&apos;d love to hear your feedback on these change. Do you like the simplification theme? Are you OK with having AppFuse
    as a parent in your projects?
&lt;/p&gt;
&lt;p class=&quot;footnotes&quot; style=&quot;border-top: 1px dotted silver; padding-top: 5px; font-size: .9em&quot;&gt;
    &lt;a name=&quot;footnote1&quot;&gt;&lt;/a&gt;1. For project
    and code stats, see &lt;a href=&quot;https://www.openhub.net/p/appfuse/analyses/latest/languages_summary&quot;&gt;AppFuse on Open
    Hub&lt;/a&gt;.
&lt;/p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea</id>
        <title type="html">Why I prefer IntelliJ IDEA over Eclipse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/why_i_prefer_intellij_idea"/>
        <published>2014-07-21T13:33:55-06:00</published>
        <updated>2014-11-06T20:03:50-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <category term="intellij" scheme="http://roller.apache.org/ns/tags/" />
        <category term="idea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="eclipse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;Over the last couple months, I&apos;ve received a few emails asking why I prefer &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IntelliJ IDEA&lt;/a&gt; over &lt;a href=&quot;https://www.eclipse.org/&quot;&gt;Eclipse&lt;/a&gt;. They usually go something like this:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I keep seeing you recommending IntelliJ. I keep trying it intermittently with using Eclipse, but I feel like I&apos;m missing something obvious that makes so many people think it&apos;s better. 
Granted having the usual plugins incorporated is nice, but other things like the build process and debugger sometimes seems a step back from Eclipse. Could you please blog a &apos;10 reasons why I love IntelliJ&apos; or point me to something that would clue me in?
&lt;/p&gt;
&lt;p&gt;
I grew to love IntelliJ for a few reasons. It all started in 2006 when I decided to migrate &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; from Ant to Maven. Before that, I was a huge Eclipse fan (2002 - 2006). Before Eclipse, I used HomeSite, an HTML Editor to write all my Java code (1999-2002). Eclipse was the first IDE that didn&apos;t hog all my system&apos;s memory and was pleasant to work with.
&lt;/p&gt;
&lt;p&gt;
The reason I started using IntelliJ in 2006 was because of it&apos;s multi-module Maven support. Eclipse&apos;s Maven support was terrible, and m2e hasn&apos;t gotten a whole lot better in recent years AFAIK. 
&lt;/p&gt;
&lt;p&gt;
Back then, I used to think everything should be built and run from the command line. A couple years later, I realized it was better to run tests and debug from an IDE. Now I&apos;m more concerned with the ability to run tests and debug in an IDE than I am from the build system.
&lt;/p&gt;
&lt;p&gt;
In 2009, I started doing a lot more front-end work: writing HTML, CSS and JavaScript. I also started digging into alternate languages for these: Jade, GWT, CoffeeScript, LESS, SASS - even Scala. I found IntelliJ&apos;s support, and plugins, to be outstanding for these languages and really enjoyed how it would tell me I had invalid JavaScript, HTML and CSS. 
&lt;/p&gt;
&lt;p&gt;
My original passion in software was HTML and JavaScript and I found that hasn&apos;t changed in the last 15 years. AFAIK, Eclipse still has terrible web tools support; it excels at Java (and possibly C++ support). Even today, I write most of my HTML code (&lt;a href=&quot;http://www.infoq.com/author/Matt-Raible&quot;&gt;for InfoQ&lt;/a&gt; and this blog) in IntelliJ.
&lt;/p&gt;
&lt;p&gt;
In reality, it probably doesn&apos;t matter which IDE you use, as long as you&apos;re productive with it. Once you learn one IDE well, the way others do things will likely seem backwards. I&apos;m so familiar with debugging in IntelliJ, that when I tried to use Eclipse&apos;s debugger a few weeks ago, it seemed backwards to me. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In a nutshell: the technologies I&apos;ve worked with have been better embraced by IntelliJ. Has this happened to you? Have certain technologies caused you to use one IDE over another?&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at</id>
        <title type="html">Comparing JVM Web Frameworks at vJUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at"/>
        <published>2014-02-06T10:54:17-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;A couple months ago, I was invited to &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/153096902/&quot;&gt;speak at Virtual JUG&lt;/a&gt; - an online-only Java User Group organized by the &lt;a href=&quot;http://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; folks. They chose my Comparing JVM Web Frameworks presentation and we agreed I&apos;d speak yesterday morning. They used a combination of Google Hangouts, live streaming on YouTube and IRC to facilitate the meeting. It all went pretty smoothly and produced a comfortable speaking environment. To practice for vJUG, I delivered the same talk on Tuesday night at the &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/155080452/&quot;&gt;Denver Open Source Users Group&lt;/a&gt;.
&lt;p&gt;
The last time I delivered this talk was at &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Devoxx France&lt;/a&gt; in March 2013. I didn&apos;t change any of the format this time, keeping with referencing the Paradox of Choice and encouraging people to define constraints to help them make their decision. I did add a few new slides regarding RebelLabs&apos; &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/&quot;&gt;Curious Coder&#8217;s Java Web Frameworks Comparison: Spring MVC, Grails, Vaadin, GWT, Wicket, Play, Struts and JSF&lt;/a&gt; and &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/&quot;&gt;The 2014 Decision Maker&#8217;s Guide to Java Web Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also updated all the pretty graphs (which may or may not have any significance) with the latest stats from Dice.com, LinkedIn, StackOverflow and respective mailing lists. Significant changes I found compared to one year ago:&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;A couple months ago, I was invited to &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/153096902/&quot;&gt;speak at Virtual JUG&lt;/a&gt; - an online-only Java User Group organized by the &lt;a href=&quot;http://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; folks. They chose my Comparing JVM Web Frameworks presentation and we agreed I&apos;d speak yesterday morning. They used a combination of Google Hangouts, live streaming on YouTube and IRC to facilitate the meeting. It all went pretty smoothly and produced a comfortable speaking environment. To practice for vJUG, I delivered the same talk on Tuesday night at the &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/155080452/&quot;&gt;Denver Open Source Users Group&lt;/a&gt;.
&lt;p&gt;
The last time I delivered this talk was at &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Devoxx France&lt;/a&gt; in March 2013. I didn&apos;t change any of the format this time, keeping with referencing the Paradox of Choice and encouraging people to define constraints to help them make their decision. I did add a few new slides regarding RebelLabs&apos; &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/&quot;&gt;Curious Coder&#8217;s Java Web Frameworks Comparison: Spring MVC, Grails, Vaadin, GWT, Wicket, Play, Struts and JSF&lt;/a&gt; and &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/&quot;&gt;The 2014 Decision Maker&#8217;s Guide to Java Web Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also updated all the pretty graphs (which may or may not have any significance) with the latest stats from Dice.com, LinkedIn, StackOverflow and respective mailing lists. Significant changes I found compared to one year ago:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job Listings on Dice.com
&lt;ul&gt;
&lt;li&gt;Play Framework job listings increased almost 4x&lt;/li&gt;
&lt;li&gt;Tapestry jobs are 1/3 of what they were a year ago&lt;/li&gt;
&lt;li&gt;Wicket jobs are 1/2 of what they were a year ago&lt;/li&gt;
&lt;li&gt;JavaScript framework jobs are up quite a bit: Ember.js up ~300%, AngularJS up 900%, Backbone up 160%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn Skills
&lt;ul&gt;
&lt;li&gt;Rails down ~30%&lt;/li&gt;
&lt;li&gt;Grails up 25%&lt;/li&gt;
&lt;li&gt;Play Framework up 200%&lt;/li&gt;
&lt;li&gt;Spring Roo up 40%&lt;/li&gt;
&lt;li&gt;Ember.js up 300%&lt;/li&gt;
&lt;li&gt;AngularJS up 840%&lt;/li&gt;
&lt;li&gt;Backbone up 200%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can tell from these findings, AngularJS has gained quite a bit of mindshare in the last year. There&apos;s a lot of companies looking for JavaScript skills and quite a few folks have added JavaScript frameworks to their LinkedIn profiles.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://www.youtube.com/watch?v=ygW8fJVlDxQ&quot;&gt;watch the recording on YouTube&lt;/a&gt; or click play in the embedded video below.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/ygW8fJVlDxQ&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;You can also quickly browse the slide deck below, &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Comparing_JVM_Web_Frameworks_February2014.pdf&quot;&gt;download the PDF&lt;/a&gt; or &lt;a href=&quot;http://www.slideshare.net/mraible/comparing-jvm-web-frameworks-february-2014&quot;&gt;view it on SlideShare&lt;/a&gt;.&lt;/li&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/30861557?rel=0&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt; &lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;Thanks to all the folks who attended these talks. And thanks to &lt;a href=&quot;http://twitter.com/dosug&quot;&gt;@dosug&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/virtualjug&quot;&gt;@virtualjug&lt;/a&gt; for giving me the opportunity to speak.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/2013_a_year_in_review</id>
        <title type="html">2013 - A Year in Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/2013_a_year_in_review"/>
        <published>2014-01-31T08:53:10-07:00</published>
        <updated>2014-07-26T21:11:02-06:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yearinreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="2013" scheme="http://roller.apache.org/ns/tags/" />
        <category term="blogging" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;2013 was an amazing year:
    Trish and I got married, celebrated on a &apos;round-the-world honeymoon and invested in a new 4x4 VW Bus. I finally
    achieved my goal of vacationing 25% and I got to spend more than two months in the presence of my wonderful parents.
&lt;/p&gt;
&lt;p&gt;
    For this Year in Review post, I&apos;ll use the same format as I did &lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review&quot;&gt;last
        year&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#professional&quot;&gt;Professional&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#speaking&quot;&gt;Speaking&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#projects&quot;&gt;Projects&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#personal&quot;&gt;Personal&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#2014&quot;&gt;2014&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;professional&quot;&gt;Professional&lt;/h2&gt;
&lt;p&gt;
    For the last few years, I&apos;ve generally had one client per year. That changed this year when my contract with Oracle
    ended in May. Fortunately, I had the opportunity to develop a cool dashboard application before I finished. I
    wrote about it in a four-part series.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;2013 was an amazing year:
    Trish and I got married, celebrated on a &apos;round-the-world honeymoon and invested in a new 4x4 VW Bus. I finally
    achieved my goal of vacationing 25% and I got to spend more than two months in the presence of my wonderful parents.
&lt;/p&gt;
&lt;p&gt;
    For this &lt;a href=&quot;http://raibledesigns.com/rd/tags/yearinreview&quot;&gt;Year in Review&lt;/a&gt; post, I&apos;ll use the same format as I did &lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review&quot;&gt;last
        year&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#professional&quot;&gt;Professional&lt;/a&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#speaking&quot;&gt;Speaking&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#projects&quot;&gt;Projects&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#personal&quot;&gt;Personal&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2013_a_year_in_review#2014&quot;&gt;2014&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;professional&quot;&gt;Professional&lt;/h2&gt;
&lt;p&gt;
    For the last few years, I&apos;ve generally had one client per year. That changed this year when my contract with Oracle
    ended in May. Fortunately, I had the opportunity to develop a cool dashboard application before I finished. I
    wrote about it in a four-part series.&lt;/p&gt;
&lt;ul&gt;

    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_i&quot;&gt;Developing with AngularJS - Part I:
        The Basics&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_ii&quot;&gt;Developing with AngularJS - Part
        II: Dialogs and Data&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_iii&quot;&gt;Developing with AngularJS - Part
        III: Services&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_iv&quot;&gt; Developing with AngularJS - Part
        IV: Making it Pop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    I engaged in a month-long contract with &lt;a href=&quot;http://www.travelport.com/&quot;&gt;Travelport&lt;/a&gt;
    to keep me busy in June. They hired me to develop a portal consolidation prototype, which I did with AngularJS,
    Grails and LDAP. I showcased &lt;a href=&quot;http://vimeo.com/80314102&quot;&gt;that application&lt;/a&gt; at Devoxx in November.
&lt;/p&gt;
&lt;p&gt;In September, I started a new gig with &lt;a href=&quot;http://www.johnmuirhealth.com/&quot;&gt;John Muir Health&lt;/a&gt;. I was hired
    to help with their mobile architecture, and spent my first couple months doing front-end optimizing and helping get
    their MyJMH product released. Once the release was complete, I proposed a mobile architecture and started assisting
    with the development of their mobile application.
&lt;/p&gt;
&lt;p&gt;
    We&apos;re developing the Mobile API with &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;. I wrote about
    my initial experience in &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_webapp_makeover_with_spring&quot;&gt;A Webapp Makeover
    with Spring 4 and Spring Boot&lt;/a&gt;. My contract with John Muir Health is through the end of March and I hope to
    start something new shortly after.
&lt;/p&gt;
&lt;p&gt;In October, I started &lt;a href=&quot;http://raibledesigns.com/rd/entry/writing_for_infoq&quot;&gt;Writing for InfoQ&lt;/a&gt; and I&apos;ve
    really enjoyed it so far. You can see the articles I&apos;ve written on &lt;a
            href=&quot;http://www.infoq.com/author/Matt-Raible&quot;&gt;my author page&lt;/a&gt; or by clicking the links below:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.infoq.com/articles/javaone2013-roundup&quot;&gt;JavaOne 2013 Roundup: Java 8 is Revolutionary, Java
        is back&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2013/11/netty4-twitter&quot;&gt;Netty 4 Reduces GC Overhead by 5x at Twitter&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2013/12/spring4&quot;&gt;Spring 4 Enhances Support for Java 8, Java EE 7, REST and
        HTML5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;speaking&quot;&gt;Speaking&lt;/h3&gt;
&lt;p&gt;I spoke at five events in 2013:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Denver JUG on &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_modern_java_web_developer&quot;&gt;The Modern Java Web
        Developer and Java Web Security&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Devoxx France on &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Comparing JVM Web
        Frameworks and Play vs. Grails&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;HTML5 Denver on &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_bootstrap_presentation_from_html5&quot;&gt;Bootstrap&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;JavaOne: I &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2013 JavaOne 2013&quot;&gt;spoke for the first time&lt;/a&gt;
        and &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2013_videos_of_presentations&quot;&gt;received a Rock Star
            Award&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;Devoxx and a Nordic Countries Speaking Tour on &lt;a
            href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;The Modern Java Web Developer&lt;/a&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It seems that folks liked my presentations since they were in &lt;a href=&quot;http://www.slideshare.net/yearinreview/mraible/ycEAAA&quot;&gt;the top 1% of most viewed on SlideShare in 2013&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
    Trish took many &lt;a href=&quot;http://raibledesigns.com/rd/entry/paris_and_iceland_a_photographers&quot;&gt;beautiful
    photos&lt;/a&gt; as part of our trip to Devoxx France.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8615035109/&quot;
       href=&quot;http://farm9.staticflickr.com/8108/8615035109_cb5d88a4ed_c.jpg&quot;
       title=&quot;Our Lady Liberty and Eiffel Tower by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8108/8615035109_cb5d88a4ed_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Our Lady Liberty and Eiffel Tower&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8615047387/&quot;
       href=&quot;http://farm9.staticflickr.com/8384/8615047387_93155b7fcc_c.jpg&quot;
       title=&quot;R&#233;cipon Quadrigas France by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8384/8615047387_93155b7fcc_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;R&#233;cipon Quadrigas France&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;


    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616147874/&quot;
       href=&quot;http://farm9.staticflickr.com/8543/8616147874_8e0de9d7aa_c.jpg&quot;
       title=&quot;Boats Seine River Eiffel Tower by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8543/8616147874_8e0de9d7aa.jpg&quot; width=&quot;500&quot;
            alt=&quot;Boats Seine River Eiffel Tower&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616151686/&quot;
       href=&quot;http://farm9.staticflickr.com/8266/8616151686_89d7bfdf75_c.jpg&quot;
       title=&quot;Statue Of LaFayette Cours La Reine Paris Frances by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8266/8616151686_89d7bfdf75.jpg&quot;
                                             width=&quot;500&quot;
                                             alt=&quot;Statue Of LaFayette Cours La Reine Paris Frances&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    We stopped in Iceland on the way home to see the &lt;a
        href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157633161145490/&quot;&gt;Northern
    Lights&lt;/a&gt;.

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8617531184/&quot;
       href=&quot;http://farm9.staticflickr.com/8262/8617531184_a688cb0f88_c.jpg&quot;
       title=&quot;Northern Lights 19 by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8262/8617531184_a688cb0f88.jpg&quot; width=&quot;500&quot; alt=&quot;Northern Lights 19&quot;
            style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&quot;projects&quot;&gt;Projects&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AppFuse:&lt;/strong&gt; I released &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_2_2_1&quot;&gt;AppFuse Light
    2.2.1&lt;/a&gt; in January and
    switched AppFuse from JSF&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to&quot;&gt;MyFaces to
        PrimeFaces&lt;/a&gt; in February. I blogged about &lt;a
            href=&quot;http://raibledesigns.com/rd/entry/integrating_gwt_into_appfuse&quot;&gt;AppFuse&apos;s GWT integration&lt;/a&gt; in March
    and
    celebrated the project&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_10_year_appfuse&quot;&gt;10 year anniversary in
        April&lt;/a&gt;. AppFuse 3.0 was released &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_3_0_released&quot;&gt;just before
        Christmas&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;Roller:&lt;/strong&gt; I didn&apos;t contribute any code to the Roller project in 2013, but I did &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/responsive_design_with_css_media&quot;&gt;make this site responsive with CSS
    media queries&lt;/a&gt;.
&lt;/p&gt;
&lt;h2 id=&quot;personal&quot;&gt;Personal&lt;/h2&gt;
&lt;p&gt;
    Trish and I started our world travels in March with a trip to &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/magnificent_mexico&quot;&gt;Magnificent Mexico&lt;/a&gt;. We had a wonderful time
    playing with old friends and renting a house on the beach.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mraible/8491989219/&quot;
       href=&quot;https://farm9.staticflickr.com/8096/8491989219_5150a05565_c.jpg&quot; title=&quot;The Pool by mraible, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8096/8491989219_5150a05565_q.jpg&quot;
                                             width=&quot;150&quot; alt=&quot;The Pool&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mraible/8491993847/&quot;
       href=&quot;https://farm9.staticflickr.com/8366/8491993847_a77a00081d_c.jpg&quot; title=&quot;My Love and I by mraible, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8366/8491993847_a77a00081d_q.jpg&quot;
                                             width=&quot;150&quot; alt=&quot;My Love and I&quot;
                                             style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mraible/8491997899/&quot;
       href=&quot;https://farm9.staticflickr.com/8388/8491997899_190ec7bfd0_c.jpg&quot;
       title=&quot;Julie at Sunset by mraible, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;https://farm9.staticflickr.com/8388/8491997899_190ec7bfd0_q.jpg&quot;
                                             width=&quot;150&quot; alt=&quot;Julie at Sunset&quot;
                                             style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8525669404/&quot;
       href=&quot;http://farm9.staticflickr.com/8097/8525669404_4fc25f6bb8_c.jpg&quot;
       title=&quot;Chacala Sunset by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8097/8525669404_4fc25f6bb8.jpg&quot; width=&quot;500&quot;
            alt=&quot;Chacala Sunset&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8524458091/&quot;
       href=&quot;http://farm9.staticflickr.com/8368/8524458091_721ed22fe7_c.jpg&quot;
       title=&quot;What a great posse! by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8368/8524458091_721ed22fe7_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;What a great posse!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8525571064/&quot;
       href=&quot;http://farm9.staticflickr.com/8243/8525571064_da036d44a7_c.jpg&quot;
       title=&quot;The Chacala gang! by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8243/8525571064_da036d44a7_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;The Chacala gang!&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8525569828/&quot;
       href=&quot;http://farm9.staticflickr.com/8521/8525569828_1eb8850118_c.jpg&quot;
       title=&quot;YAY Chacalas! by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8521/8525569828_1eb8850118_q.jpg&quot; width=&quot;150&quot;
            alt=&quot;YAY Chacalas!&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;Our trip to &lt;a href=&quot;http://raibledesigns.com/rd/entry/paris_and_iceland_a_photographers&quot;&gt;Paris and Iceland&lt;/a&gt; was a
    dream come true for Trish. Watching the Aurora Borealis dance in the sky is something I&apos;ll never forget.&lt;/p&gt;
&lt;p&gt;
    To end the ski season in April, we &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_trifecta_2013&quot;&gt;completed the
    trifecta&lt;/a&gt; (3 ski resorts in 3 days) with
    a fun family weekend.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm9.staticflickr.com/8246/8662516874_f2400ba9c6_c.jpg&quot; title=&quot;13&amp;quot; Powder Day at Copper!&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8246/8662516874_f2400ba9c6.jpg&quot;
                                             width=&quot;500&quot; alt=&quot;13&amp;quot; Powder Day at Copper!&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    The last week of the ski season was epic, as I described in a &lt;a href=&quot;http://raibledesigns.com/rd/entry/life_update1&quot;&gt;life
    update&lt;/a&gt;.
&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;
    The last week in Winter Park was the best skiing of the year. The first (Tuesday) afternoon, I started skiing around
    1pm and it snowed all afternoon - resulting in several inches by the end of the day. The next day was smooth and
    empty, followed by a day of deep powder and knee-deep runs down Eagle Wind. I had one of the best runs of my life
    that day.
&lt;/p&gt;

&lt;p&gt;
    I wrote about the &apos;66 Bus Project and how I removed it from Motorworks Restorations after six years.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm9.staticflickr.com/8522/8615924358_c863705496_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/8615924358/&quot; title=&quot;Sweet Stance by mraible, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8522/8615924358_c863705496_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Sweet Stance&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm9.staticflickr.com/8263/8615925190_80b016767b_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/8615925190/&quot; title=&quot;Love That Boy by mraible, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8263/8615925190_80b016767b_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Love That Boy&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7418/9032950835_57cf83c68f_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/9032950835/&quot; title=&quot;Leaving Motorworks by mraible, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7418/9032950835_57cf83c68f_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Leaving Motorworks&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3679/9035175304_773922f83b_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/9035175304/&quot;
       title=&quot;Time to get this thing done! by mraible, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3679/9035175304_773922f83b_m.jpg&quot; width=&quot;240&quot;
            alt=&quot;Time to get this thing done!&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    We spent the first weekends in June &lt;a href=&quot;http://raibledesigns.com/rd/entry/father_s_day_weekend_on&quot;&gt;on the
    Colorado River&lt;/a&gt;.
    One of the biggest highlights for me was catching a 16&quot; Trout, right after Trish saw it jump and told me exactly
    where to cast my line. The fact that I was able to cast it to the precise spot was cool enough, but getting the fish
    on my line moments later was exhilarating. Shortly after, a majestic Bald Eagle flew over us and we all dropped our
    jaws in amazement.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-href=&quot;http://www.flickr.com/photos/mraible/9071726423/&quot;
       href=&quot;http://farm8.staticflickr.com/7332/9071726423_3d1faf669c_c.jpg&quot; title=&quot;My Crew&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7332/9071726423_3d1faf669c_m.jpg&quot;
                                             width=&quot;240&quot; alt=&quot;My Crew&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-href=&quot;http://www.flickr.com/photos/mraible/9071727141/&quot;
       href=&quot;http://farm4.staticflickr.com/3668/9071727141_b3ce9e3286_c.jpg&quot; title=&quot;Roasting Hot Dogs&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3668/9071727141_b3ce9e3286_m.jpg&quot;
                                             width=&quot;240&quot; alt=&quot;Roasting Hot Dogs&quot;
                                             style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-href=&quot;http://www.flickr.com/photos/mraible/9071648965/&quot;
       href=&quot;http://farm4.staticflickr.com/3725/9071648965_b142ae7f05_c.jpg&quot; title=&quot;16 Incher&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3725/9071648965_b142ae7f05.jpg&quot;
                                             width=&quot;500&quot; alt=&quot;16 Incher&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Trish and I started a two month sabbatical in July to &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/matrimony_in_montana&quot;&gt;get married in proper
    fashion&lt;/a&gt; in the town I grew up in. She looked absolutely stunning.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7431/9624418537_21f624efcc_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9624418537/&quot; title=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7431/9624418537_21f624efcc.jpg&quot;
                                             width=&quot;500&quot; alt=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;During the ceremony, I surprised her with a 162-page
    book I built with my words and her pictures.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3775/9624416155_92cb67d722_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9624416155/&quot; title=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3775/9624416155_92cb67d722_m.jpg&quot;
                                             width=&quot;240&quot; alt=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm4.staticflickr.com/3756/9627642486_c1c3cca8b2_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9627642486/&quot; title=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3756/9627642486_c1c3cca8b2_m.jpg&quot;
                                             width=&quot;240&quot; alt=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
                                             style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    When asked if I&apos;d take her as my lawfully-wedded wife, I shouted as &quot;YES!&quot; at the top of my lungs. Trish agreed enthusiastically and we were pronounced husband and wife.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7348/9624417367_a672878836_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9624417367/&quot; title=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7348/9624417367_a672878836_m.jpg&quot;
                                             width=&quot;240&quot; alt=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm8.staticflickr.com/7337/9624416939_a67bb07e70_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9624416939/&quot; title=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7337/9624416939_a67bb07e70_m.jpg&quot;
                                             width=&quot;240&quot; alt=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
                                             style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;http://farm8.staticflickr.com/7442/9627648458_38de03b06a_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9627648458/&quot; title=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7442/9627648458_38de03b06a.jpg&quot;
                                             width=&quot;500&quot; alt=&quot;Raible &amp;amp; McGinity Wedding Photos&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;Our wedding week was an unbelievably fun experience with many, many friends and family. We look forward to
    celebrating it over and over again as long as we live.&lt;/p&gt;
&lt;p&gt;
    We had a day of rest following the wedding, then drove back to Denver to begin our &apos;round-the-world honeymoon
    without phones. We spent a month traveling to &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/around_the_world_honeymoon_1st&quot;&gt;Ireland&lt;/a&gt;,
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/around_the_world_honeymoon_2nd&quot;&gt;Italy&lt;/a&gt;,
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/around_the_world_honeymoon_3rd&quot;&gt;Thailand&lt;/a&gt; and
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/around_the_world_honeymoon_last&quot;&gt;Fiji&lt;/a&gt;. It was a wonderful journey
    and we greatly enjoyed all the people, places and experiences.

&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;http://farm8.staticflickr.com/7342/10322700916_88449ec9ea_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/10322700916/&quot;
       title=&quot;Ballynahinch Castle Ireland by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7342/10322700916_88449ec9ea.jpg&quot; width=&quot;500&quot;
            alt=&quot;Ballynahinch Castle Ireland&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://farm8.staticflickr.com/7362/9902197834_90ef009fd8_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9902197834/&quot; rel=&quot;lightbox[2013yearinreview]&quot; title=&quot;View from hills
	just outside of La Morra Italy! by McGinityPhoto, on Flickr&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7362/9902197834_90ef009fd8.jpg&quot; width=&quot;500&quot;
            alt=&quot;View from hills just outside of La Morra Italy!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/10076904953/&quot;
       href=&quot;http://farm3.staticflickr.com/2871/10076904953_34cb763f5c_c.jpg&quot;
       title=&quot;View of Ang Thong National Marine Park by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.staticflickr.com/2871/10076904953_34cb763f5c.jpg&quot;
                                             width=&quot;500&quot; alt=&quot;View of Ang Thong National Marine Park&quot;
                                             style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;a href=&quot;http://farm6.staticflickr.com/5343/10177404544_1358494510_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/10177404544/&quot;
       title=&quot;Chillin&apos; in Qamea Fiji by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm6.staticflickr.com/5343/10177404544_1358494510.jpg&quot; width=&quot;500&quot; alt=&quot;Chillin&apos; in Qamea Fiji&quot;
            style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We arrived back in the US at the end of August, just in time to celebrate &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_jack5&quot;&gt;Jack&apos;s 9th birthday&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    In September, we got loud at
    the Broncos Home Opener, and experienced beautiful Colorado fall weather with trips to Estes Park and Aspen. In
    October, we
    traveled to Minnesota for a best friend&apos;s wedding. We also visited Pennsylvania to spend some time with Trish&apos;s parents.
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3731/10424172085_fbf8ebb173_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/10424172085&quot;
       title=&quot;Right 3/4&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3731/10424172085_fbf8ebb173_t.jpg&quot; width=&quot;100&quot; alt=&quot;Right 3/4&quot;
            style=&quot;border: 1px solid black&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;

    &lt;a href=&quot;http://raibledesigns.com/rd/entry/we_bought_a_ski_bus&quot;&gt;We Bought a Ski Bus&lt;/a&gt; in October and celebrated &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_abbie7&quot;&gt;Abbie&apos;s birthday&lt;/a&gt; in November. Shortly after,
    we
    departed on a whirlwind &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;six-country
    speaking tour&lt;/a&gt; in Europe. We visited 14 countries in 2013. 
    &lt;!-- Mexico, France, Iceland, Ireland, Britain, Italy, Thailand, Fiji, Holland, Belgium, Sweden, Norway, Finland, Copenhagen --&gt;
&lt;/p&gt;
&lt;p&gt;
    In early December, we flew to
    Idaho to &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_syncro_rescue_road_trip&quot;&gt;pickup our new Syncro&lt;/a&gt;. We
    anticipated a few VW Adventures when we bought the bus and haven&apos;t been disappointed.


&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a href=&quot;http://farm4.staticflickr.com/3771/11318813023_0a33a869ef_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mraible/11318813023/&quot;
       title=&quot;Let the VW adventures begin! by mraible, on Flickr&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3771/11318813023_0a33a869ef_n.jpg&quot; width=&quot;320&quot;
            alt=&quot;Let the VW adventures begin!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;

    The Syncro drove
    back to Denver just fine, but started experiencing cooling issues driving around town. We got it fixed and drove
    to Montana for Christmas. We broke down on Christmas Eve in Bozeman, tried to fix it, but eventually gave up and
    rented a car. Straightaway Motors replaced the thermostat over the next week and we were able to drive it back to
    Denver with no issues. It started overheating again a couple days later. We&apos;ve only recently got it running smoothly, with help from &lt;a
        href=&quot;http://www.rockymountainwesty.com/&quot;&gt;Rocky Mountain Westy&lt;/a&gt;. You can read the full story on &lt;a
        href=&quot;http://www.thesamba.com/vw/forum/viewtopic.php?t=580347&quot;&gt;
    thesamba.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    Christmas Vacation was spent at The Raible Homestead, enjoying my parents new retirement cabin and a
    &lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157639816640594/&quot;&gt;sweet sledding hill&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm3.staticflickr.com/2845/11973497666_90c0414f3d_c.jpg&quot;
       data-href=&quot;http://www.flickr.com/photos/mcginityphoto/11973497666/&quot;
       title=&quot;Yee Haw!&quot; rel=&quot;lightbox[2013yearinreview]&quot;&gt;&lt;img
            src=&quot;//farm3.staticflickr.com/2845/11973497666_90c0414f3d.jpg&quot; width=&quot;500&quot;
            alt=&quot;Yee Haw!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We finished the year skiing at &lt;a href=&quot;http://skiwhitefish.com/&quot;&gt;Big Mountain&lt;/a&gt;, where I learned how to downhill
    ski in grade school.&lt;/p&gt;

&lt;h2 id=&quot;2014&quot;&gt;2014&lt;/h2&gt;

&lt;p&gt;My goal for 2014 is singular: &lt;em&gt;finish The Bus&lt;/em&gt;. I finally found the restoration shop I wish I would&apos;ve found years ago.
    They&apos;re
    very quick and efficient, and send me daily (picture) updates of their progress. With any luck, it&apos;ll be done in a
    couple months (sound
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/when_is_the_bus_gonna&quot;&gt;familiar&lt;/a&gt;?).
&lt;/p&gt;
&lt;p&gt;Last year, I wanted to &lt;em&gt;slow down&lt;/em&gt; and I feel like I did that on our honeymoon. My wife scoffs at that notion.
    &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt; This year, I
    hope to simply take more time to do things, instead of trying to cram many things into tight timelines.&lt;/p&gt;
&lt;p&gt;
    I plan to spend less time traveling and speaking at conferences and more time at Volkswagen shows. With our 4x4 VW
    Syncro, we hope to camp, raft and spend quite a bit of time in the Rocky Mountains. We also hope to take the busses
    to a few art shows to show off Trish&apos;s majestic photos.
&lt;/p&gt;
&lt;p&gt;Professionally, I hope to continue developing HTML5 apps and APIs with JavaScript, CSS, Java and Groovy. I might dive back
    into Scala and I&apos;m intrigued by Node.js and Spring Boot. Since I won&apos;t be doing as many conferences, the
    technologies I
    use will likely be driven by client engagements. I expect 2014 to be a big year for HTTP/2.
&lt;/p&gt;
&lt;p&gt;Last year, and the year before, we watched the Broncos fail miserably in the NFL playoffs. This year, they&apos;re in the
    Super Bowl.
    With a kick-ass Ski Bus, a Porsche Bus on the way, awesome kids and a great wife - 2014 is destined to be
    spectacular. I hope the Broncos are too! &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/using_grunt_with_angularjs_for</id>
        <title type="html">Using Grunt with AngularJS for Front End Optimization</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/using_grunt_with_angularjs_for"/>
        <published>2014-01-15T12:15:52-07:00</published>
        <updated>2014-01-15T22:11:46-07:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grunt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="pagespeed" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yslow" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I&apos;m passionate about front end optimization and have been for years. My original inspiration was Steve Souders and his &lt;a href=&quot;http://raibledesigns.com/rd/entry/oscon_2008_even_faster_web&quot;&gt;Even Faster Web Sites talk at OSCON 2008&lt;/a&gt;. Since then, I&apos;ve &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;optimized this blog&lt;/a&gt;, made it even faster &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_look_and_feel_designed&quot;&gt;with a new design&lt;/a&gt;, doubled the speed of several apps for clients and showed how to &lt;a href=&quot;http://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with&quot;&gt;make AppFuse faster&lt;/a&gt;. As part of my &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;Devoxx 2013 presentation&lt;/a&gt;, I showed &lt;a href=&quot;https://vimeo.com/mraible/page-speed-demo&quot;&gt;how to do page speed optimization in a Java webapp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I developed a couple AngularJS apps last year. To concat and minify their stylesheets and scripts, I used mechanisms that already existed in the projects. On one project, it was Ant and its &lt;a href=&quot;https://ant.apache.org/manual/Tasks/concat.html&quot;&gt;concat task&lt;/a&gt;. On the other, it was part of a Grails application, so I used the &lt;a href=&quot;http://grails.org/plugin/resources&quot;&gt;resources&lt;/a&gt; and &lt;a href=&quot;http://grails.org/plugin/yui-minify-resources&quot;&gt;yui-minify-resources&lt;/a&gt; plugins.
&lt;/p&gt;
&lt;p&gt;The Angular project I&apos;m working on now will be published on a web server, as well as bundled in an iOS native app. Therefore, I turned to &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; to do the optimization this time. I found it to be quite simple, once I figured out &lt;a href=&quot;http://stackoverflow.com/questions/21056767/angular-and-grunt&quot;&gt;how to make it work with Angular&lt;/a&gt;. Based on my findings, I submitted a &lt;a href=&quot;https://github.com/angular/angular-seed/pull/131&quot;&gt;pull request to add Grunt to angular-seed&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Below are the steps I used to add Grunt to my Angular project.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;I&apos;m passionate about front end optimization and have been for years. My original inspiration was Steve Souders and his &lt;a href=&quot;http://raibledesigns.com/rd/entry/oscon_2008_even_faster_web&quot;&gt;Even Faster Web Sites talk at OSCON 2008&lt;/a&gt;. Since then, I&apos;ve &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;optimized this blog&lt;/a&gt;, made it even faster &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_look_and_feel_designed&quot;&gt;with a new design&lt;/a&gt;, doubled the speed of several apps for clients and showed how to &lt;a href=&quot;http://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with&quot;&gt;make AppFuse faster&lt;/a&gt;. As part of my &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;Devoxx 2013 presentation&lt;/a&gt;, I showed &lt;a href=&quot;https://vimeo.com/mraible/page-speed-demo&quot;&gt;how to do page speed optimization in a Java webapp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I developed a couple AngularJS apps last year. To concat and minify their stylesheets and scripts, I used mechanisms that already existed in the projects. On one project, it was Ant and its &lt;a href=&quot;https://ant.apache.org/manual/Tasks/concat.html&quot;&gt;concat task&lt;/a&gt;. On the other, it was part of a Grails application, so I used the &lt;a href=&quot;http://grails.org/plugin/resources&quot;&gt;resources&lt;/a&gt; and &lt;a href=&quot;http://grails.org/plugin/yui-minify-resources&quot;&gt;yui-minify-resources&lt;/a&gt; plugins.
&lt;/p&gt;
&lt;p&gt;The Angular project I&apos;m working on now will be published on a web server, as well as bundled in an iOS native app. Therefore, I turned to &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; to do the optimization this time. I found it to be quite simple, once I figured out &lt;a href=&quot;http://stackoverflow.com/questions/21056767/angular-and-grunt&quot;&gt;how to make it work with Angular&lt;/a&gt;. Based on my findings, I submitted a &lt;a href=&quot;https://github.com/angular/angular-seed/pull/131&quot;&gt;pull request to add Grunt to angular-seed&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Below are the steps I used to add Grunt to my Angular project.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install Grunt&apos;s command line interface with &quot;sudo npm install -g grunt-cli&quot;.&lt;/li&gt;
&lt;li&gt;Edit package.json to include a version number (e.g. &quot;version&quot;: &quot;1.0.0&quot;).&lt;/li&gt;
&lt;li&gt;Add Grunt plugins in package.json to do concat/minify/asset versioning:
&lt;pre class=&quot;brush: js&quot;&gt;
    &quot;grunt&quot;: &quot;~0.4.1&quot;,
    &quot;grunt-contrib-concat&quot;: &quot;~0.3.0&quot;,
    &quot;grunt-contrib-uglify&quot;: &quot;~0.2.7&quot;,
    &quot;grunt-contrib-cssmin&quot;: &quot;~0.7.0&quot;,
    &quot;grunt-usemin&quot;: &quot;~2.0.2&quot;,
    &quot;grunt-contrib-copy&quot;: &quot;~0.5.0&quot;,
    &quot;grunt-rev&quot;: &quot;~0.1.0&quot;,
    &quot;grunt-contrib-clean&quot;: &quot;~0.5.0&quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Run &quot;sudo npm install&quot; to install the project&apos;s dependencies.&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;Gruntfile.js&lt;/code&gt; that runs all the plugins.
&lt;pre class=&quot;brush: js&quot;&gt;
module.exports = function (grunt) {

    grunt.initConfig({
        pkg: grunt.file.readJSON(&apos;package.json&apos;),

        clean: [&quot;dist&quot;, &apos;.tmp&apos;],

        copy: {
            main: {
                expand: true,
                cwd: &apos;app/&apos;,
                src: [&apos;**&apos;, &apos;!js/**&apos;, &apos;!lib/**&apos;, &apos;!**/*.css&apos;],
                dest: &apos;dist/&apos;
            },
            shims: {
                expand: true,
                cwd: &apos;app/lib/webshim/shims&apos;,
                src: [&apos;**&apos;],
                dest: &apos;dist/js/shims&apos;
            }
        },

        rev: {
            files: {
                src: [&apos;dist/**/*.{js,css}&apos;, &apos;!dist/js/shims/**&apos;]
            }
        },

        useminPrepare: {
            html: &apos;app/index.html&apos;
        },

        usemin: {
            html: [&apos;dist/index.html&apos;]
        },

        uglify: {
            options: {
                report: &apos;min&apos;,
                mangle: false
            }
        }
    });

    grunt.loadNpmTasks(&apos;grunt-contrib-clean&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-copy&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-concat&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-cssmin&apos;);
    grunt.loadNpmTasks(&apos;grunt-contrib-uglify&apos;);
    grunt.loadNpmTasks(&apos;grunt-rev&apos;);
    grunt.loadNpmTasks(&apos;grunt-usemin&apos;);

    // Tell Grunt what to do when we type &quot;grunt&quot; into the terminal
    grunt.registerTask(&apos;default&apos;, [
        &apos;copy&apos;, &apos;useminPrepare&apos;, &apos;concat&apos;, &apos;uglify&apos;, &apos;cssmin&apos;, &apos;rev&apos;, &apos;usemin&apos;
    ]);
};
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Add comments to app/index.html so usemin knows what files to process. The comments are the important part, your files will likely be different.
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;!-- build:css css/app-name.min.css --&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lib/bootstrap/bootstrap.min.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lib/font-awesome/font-awesome.min.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lib/toaster/toaster.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/app.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/custom.css&quot;/&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/responsive.css&quot;/&amp;gt;
&amp;lt;!-- endbuild --&amp;gt;
...

&amp;lt;!-- build:js js/app-name.min.js --&amp;gt;
&amp;lt;script src=&quot;lib/jquery/jquery-1.10.2.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/bootstrap/bootstrap.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-animate.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-cookies.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-resource.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/angular/angular-route.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/fastclick.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/toaster/toaster.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/webshim/modernizr.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;lib/webshim/polyfiller.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/app.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/services.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/controllers.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/filters.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;js/directives.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- endbuild --&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A couple of things to note: 1) the &lt;em&gt;copy&lt;/em&gt; task copies the &quot;shims&quot; directory from &lt;a href=&quot;http://afarkas.github.io/webshim/demos/&quot;&gt;Webshims lib&lt;/a&gt; because it loads files dynamically and 2) setting &quot;mangle: false&quot; on the &lt;em&gt;uglify&lt;/em&gt; task is necessary for Angular&apos;s dependency injection to work. I tried to use &lt;a href=&quot;https://npmjs.org/package/grunt-ngmin&quot;&gt;grunt-ngmin&lt;/a&gt; with uglify and had no luck.&lt;/p&gt;
&lt;p&gt;After making these changes, I&apos;m able to run &quot;grunt&quot; and get an optimized version of my app in the &quot;dist&quot; folder of my project. For development, I continue to run the app from my &quot;app&quot; folder, so I don&apos;t currently have a need for watching and processing assets on-the-fly. That could change if I start using LESS or CoffeeScript.
&lt;/p&gt;
&lt;p&gt;The results speak for themselves: from 27 requests to 5 on initial load, and only 3 requests for less than 2K after that.&lt;/p&gt;
&lt;table class=&quot;comparison&quot; style=&quot;max-width: 600px&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;YSlow&lt;/th&gt;
&lt;th&gt;Page Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No optimization&lt;/td&gt;
&lt;td&gt;75 &lt;div style=&quot;float: right&quot;&gt;27 HTTP requests / 464K&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;55/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache optimization (gzip and expires headers)&lt;/td&gt;
&lt;td&gt;89
&lt;div style=&quot;float: right&quot;&gt;
initial load: 26 requests / 166K&lt;br/&gt;
primed cache: 4 requests / 40K 
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;88/100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache + concat/minified/versioned files&lt;/td&gt;
&lt;td&gt;98
&lt;div style=&quot;float: right&quot;&gt;
initial load: 5 requests / 136K&lt;br/&gt;
primed cache: 3 requests / 1.4K
&lt;/div&gt;
&lt;/td&gt;
&lt;td&gt;93/100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Andreas Andreou has a &lt;a href=&quot;https://twitter.com/andyhot/status/423571136538877952&quot;&gt;nice tip&lt;/a&gt; on how to reduce the LOC in this example.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add &quot;matchdep&quot; as a dependency in package.json (or run &quot;sudo npm install matchdep --save-dev&quot;).
&lt;pre class=&quot;brush: js; gutter: false&quot;&gt;
&quot;matchdep&quot;: &quot;~0.3.0&quot;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Replace all the &lt;code&gt;grunt.loadNpmTasks(...)&lt;/code&gt; calls with the following:
&lt;pre class=&quot;brush: js; gutter: false&quot;&gt;
require(&apos;matchdep&apos;).filterDev(&apos;grunt-*&apos;).forEach(grunt.loadNpmTasks);
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks Andreas!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/a_webapp_makeover_with_spring</id>
        <title type="html">A Webapp Makeover with Spring 4 and Spring Boot</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_webapp_makeover_with_spring"/>
        <published>2013-12-11T12:47:15-07:00</published>
        <updated>2013-12-13T14:54:52-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring4" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jersey" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springboot" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;A typical Maven and Spring web application has a fair amount of XML and 
verbosity to it. Add in Jersey and Spring Security and you can have hundreds of lines of 
XML before you even start to write your Java code. As part of a recent project,
I was tasked with upgrading a webapp like this to use Spring 4 and 
&lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;. I also figured I&apos;d try to minimize the XML.&lt;/p&gt; 
&lt;p&gt;This is my story on how I upgraded to Spring 4, Jersey 2, Java 8 and Spring Boot 0.5.0 M6. 
&lt;/p&gt;
&lt;p&gt;When I started, the app was using Spring 3.2.5, Spring Security 3.1.4 and Jersey 1.18. The
pom.xml had four Jersey dependencies, three Spring dependencies and three Spring Security
dependencies, along with a number of exclusions for &quot;jersey-spring&quot;.&lt;/p&gt;
&lt;p id=&quot;spring4&quot;&gt;&lt;strong&gt;Upgrading to Spring 4&lt;/strong&gt;&lt;br/&gt;
Upgrading to Spring 4 was easy, I changed the version property to 4.0.0.RC2 and added the new 
Spring &lt;a href=&quot;http://spring.io/blog/2013/12/03/spring-framework-4-0-rc2-available&quot;&gt;bill of materials&lt;/a&gt;
to my pom.xml. I also add the Spring milestone repo since Spring 4 won&apos;t be released to Maven central
until tomorrow.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-framework-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${spring.framework.version}&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;

&amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;spring-milestones&amp;lt;/id&amp;gt;
        &amp;lt;url&amp;gt;http://repo.spring.io/milestone&amp;lt;/url&amp;gt;
        &amp;lt;snapshots&amp;gt;
            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;
        &amp;lt;/snapshots&amp;gt;
    &amp;lt;/repository&amp;gt;
&amp;lt;/repositories&amp;gt;
&lt;/pre&gt;</summary>
        <content type="html">&lt;p&gt;A typical Maven and Spring web application has a fair amount of XML and 
verbosity to it. Add in Jersey and Spring Security and you can have hundreds of lines of 
XML before you even start to write your Java code. As part of a recent project,
I was tasked with upgrading a webapp like this to use Spring 4 and 
&lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;. I also figured I&apos;d try to minimize the XML.&lt;/p&gt; 
&lt;p&gt;This is my story on how I upgraded to Spring 4, Jersey 2, Java 8 and Spring Boot 0.5.0 M6. 
&lt;/p&gt;
&lt;p&gt;When I started, the app was using Spring 3.2.5, Spring Security 3.1.4 and Jersey 1.18. The
pom.xml had four Jersey dependencies, three Spring dependencies and three Spring Security
dependencies, along with a number of exclusions for &quot;jersey-spring&quot;.&lt;/p&gt;
&lt;p id=&quot;spring4&quot;&gt;&lt;strong&gt;Upgrading to Spring 4&lt;/strong&gt;&lt;br/&gt;
Upgrading to Spring 4 was easy, I changed the version property to 4.0.0.RC2 and added the new 
Spring &lt;a href=&quot;http://spring.io/blog/2013/12/03/spring-framework-4-0-rc2-available&quot;&gt;bill of materials&lt;/a&gt;
to my pom.xml. I also add the Spring milestone repo since Spring 4 won&apos;t be released to Maven central
until tomorrow.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependencyManagement&amp;gt;
    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-framework-bom&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${spring.framework.version}&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
            &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;
&amp;lt;/dependencyManagement&amp;gt;

&amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;spring-milestones&amp;lt;/id&amp;gt;
        &amp;lt;url&amp;gt;http://repo.spring.io/milestone&amp;lt;/url&amp;gt;
        &amp;lt;snapshots&amp;gt;
            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;
        &amp;lt;/snapshots&amp;gt;
    &amp;lt;/repository&amp;gt;
&amp;lt;/repositories&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, I removed all the references to ${spring.framework.version} in dependencies since it&apos;d 
be controlled by &lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management&quot;&gt;
Maven&apos;s dependency management feature&lt;/a&gt;. 
&lt;/p&gt;
&lt;pre class=&quot;brush: diff&quot;&gt;
     &amp;lt;dependency&amp;gt;
         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
         &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;
-        &amp;lt;version&amp;gt;${spring.framework.version}&amp;lt;/version&amp;gt;
     &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
I also changed to use Maven 3&apos;s &lt;a href=&quot;http://maven.apache.org/pom.html#Exclusions&quot;&gt;wildcard syntax&lt;/a&gt; to exclude multiple 
dependencies.&lt;/p&gt;
&lt;pre class=&quot;brush: diff&quot;&gt;
    &amp;lt;dependency&amp;gt;
        &amp;lt;groupId&amp;gt;com.sun.jersey.contribs&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;jersey-spring&amp;lt;/artifactId&amp;gt;
        &amp;lt;exclusions&amp;gt;
             &amp;lt;exclusion&amp;gt;
                 &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;spring&amp;lt;/artifactId&amp;gt;
-                &amp;lt;/exclusion&amp;gt;
-                &amp;lt;exclusion&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;
-                &amp;lt;/exclusion&amp;gt;
-                &amp;lt;exclusion&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;
-                &amp;lt;/exclusion&amp;gt;
-                &amp;lt;exclusion&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;spring-beans&amp;lt;/artifactId&amp;gt;
-                &amp;lt;/exclusion&amp;gt;
-                &amp;lt;exclusion&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
+                    &amp;lt;artifactId&amp;gt;*&amp;lt;/artifactId&amp;gt;
             &amp;lt;/exclusion&amp;gt;
         &amp;lt;/exclusions&amp;gt;
     &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I confirmed the upgrade worked by running &quot;mvn dependency:tree | grep spring&quot;, followed by &quot;mvn jetty:run&quot; and viewing the app in my browser. &lt;/p&gt;
&lt;p id=&quot;jersey2&quot;&gt;&lt;strong&gt;Upgrading to Jersey 2&lt;/strong&gt;&lt;br/&gt;
The next item I tackled was upgrading to Jersey 2.4.1. I changed the version number in my pom.xml, then added the Jersey BOM.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.glassfish.jersey&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jersey-bom&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${jersey.version}&amp;lt;/version&amp;gt;
    &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
    &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
You might ask &quot;why Jersey?&quot; if we already have Spring MVC and its REST support? You might also ask why not Play or Grails instead of a Java + Spring stack? For this particular project, I recommended technology options, and these were certainly among them. However, the team chose differently and I support their decision. The project is 
creating an iOS app, as well as a responsive HTML5 mobile/desktop app. We figured we had enough risk with new technologies on the front-end that we should play it a bit safer on the backend. To make the backend work a bit sexier, we&apos;ve decided to allow Spring 4, Java 8 and possibly some reactive principles.&lt;/p&gt;
&lt;p&gt;Next, I changed from the old &lt;i&gt;com.sun.jersey&lt;/i&gt; dependencies to &lt;i&gt;org.glassfish.jersey&lt;/i&gt; and removed jersey-spring. &lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.glassfish.jersey.containers&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jersey-container-servlet&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.glassfish.jersey.media&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jersey-media-json-jackson&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
The last thing I needed to do was change the servlet-class and param-name in web.xml:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;jersey-servlet&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;org.glassfish.jersey.servlet.ServletContainer&amp;lt;/servlet-class&amp;gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;jersey.config.server.provider.packages&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;com.raibledesigns.boot.service&amp;lt;/param-value&amp;gt;
    &amp;lt;/init-param&amp;gt;
    &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
&amp;lt;/servlet&amp;gt;
&lt;/pre&gt;
&lt;p id=&quot;java8&quot;&gt;&lt;strong&gt;Requiring Java 8&lt;/strong&gt;&lt;br/&gt;
Requiring Java 8 to compile was easy enough. I added the maven-compiler-plugin to enforce a minimum version.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;3.1&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt;
        &amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;&lt;p&gt;I &lt;a href=&quot;https://jdk8.java.net/download.html&quot;&gt;downloaded the latest Java 8 SDK&lt;/a&gt; and installed it. Then I set my JAVA_HOME to use it.&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
&lt;/pre&gt;
&lt;p id=&quot;boot&quot;&gt;&lt;strong&gt;Integrating Spring Boot&lt;/strong&gt;&lt;br/&gt;
I learned about Spring Boot a few weeks ago &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_2013_a_nordic_countries&quot;&gt;at Devoxx&lt;/a&gt;. &lt;a href=&quot;http://www.joshlong.com/&quot;&gt;Josh Long&lt;/a&gt; gave me a 3-minute demo at the speaker&apos;s dinner and showed me enough to pique my interest. To integrate it into my project, I started with the &lt;a href=&quot;http://projects.spring.io/spring-boot/#quick-start&quot;&gt;Quick Start&lt;/a&gt;. I added the boot-parent, dependencies for web, security and actuator (logging, metrics, etc.) and the Maven plugin. I removed all the Spring and Spring Security dependencies.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;parent&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.5.0.M6&amp;lt;/version&amp;gt;
&amp;lt;/parent&amp;gt;
...
&amp;lt;pluginRepositories&amp;gt;
    &amp;lt;pluginRepository&amp;gt;
        &amp;lt;id&amp;gt;spring-milestones&amp;lt;/id&amp;gt;
        &amp;lt;url&amp;gt;http://repo.spring.io/milestone&amp;lt;/url&amp;gt;
    &amp;lt;/pluginRepository&amp;gt;
&amp;lt;/pluginRepositories&amp;gt;
...
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-security&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
...
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Upon restarting my app, I got an error about spring-security.xml using a 3.1 XSD. I fixed it by changing to 3.2. Next, I wanted to eliminate web.xml. First of all, I created an &lt;code&gt;ApplicationInitializer&lt;/code&gt; so the WAR could be started from the command line.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package com.raibledesigns.boot.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class ApplicationInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ApplicationInitializer.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(ApplicationInitializer.class, args);
    }
}
&lt;/pre&gt;
&lt;p&gt;However, after adding this, I received the following error on startup:&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
&apos;org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor&apos;: 
Invocation of init method failed; nested exception is 
java.lang.AbstractMethodError: org.hibernate.validator.internal.engine.ConfigurationImpl
.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;
&lt;/pre&gt;
&lt;p&gt;Adding hibernate-validator as a dependency solved this problem:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;hibernate-validator&amp;lt;/artifactId&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To configure Spring Security without web.xml and spring-security.xml, I created &lt;code&gt;WebSecurityConfig.java&lt;/code&gt;:
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package com.raibledesigns.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
@Order(Ordered.LOWEST_PRECEDENCE - 6)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(&quot;/&quot;, &quot;/home&quot;).permitAll()
                .antMatchers(&quot;/v1.0/**&quot;).hasRole(&quot;USER&quot;)
                .anyRequest().authenticated();
        http.httpBasic().realmName(&quot;My API&quot;);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
        authManagerBuilder.inMemoryAuthentication()
                .withUser(&quot;test&quot;).password(&quot;test123&quot;).roles(&quot;USER&quot;);
    }
}
&lt;/pre&gt;
&lt;p&gt;To configure Jersey without web.xml, I created a &lt;code&gt;JerseyConfig&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package com.raibledesigns.boot.config;

import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;

import javax.ws.rs.ApplicationPath;

@ApplicationPath(&quot;/v1.0&quot;)
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        packages(&quot;com.raibledesigns.boot.service&quot;);
        property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
        property(ServerProperties.JSON_PROCESSING_FEATURE_DISABLE, false);
        property(ServerProperties.MOXY_JSON_FEATURE_DISABLE, true);
        property(ServerProperties.WADL_FEATURE_DISABLE, true);
        register(LoggingFilter.class);
        register(JacksonFeature.class);
    }
}
&lt;/pre&gt;
&lt;p&gt;Finally, I created &lt;code&gt;MvcConfig.java&lt;/code&gt; to set the welcome page.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package com.raibledesigns.boot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController(&quot;/&quot;).setViewName(&quot;index&quot;);
    }
}
&lt;/pre&gt;
&lt;p&gt;To cleanup, I deleted &lt;code&gt;src/main/webapp/WEB-INF&lt;/code&gt; and created &lt;code&gt;src/main/resources/logback.xml&lt;/code&gt;:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;include resource=&quot;org/springframework/boot/logging/logback/base.xml&quot;/&amp;gt;
    &amp;lt;logger name=&quot;org.springframework.boot&quot; level=&quot;INFO&quot;/&amp;gt;
    &amp;lt;logger name=&quot;org.springframework.security&quot; level=&quot;ERROR&quot;/&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;&lt;p&gt;Since Boot doesn&apos;t support JSP out-of-the-box, I renamed my index.jsp file to index.html and changed the URL in it to point to &quot;/v1.0/hello&quot;. I was pleased to see that everything worked nicely. I learned shortly after that I could remove the Spring BOM since Spring Boot &lt;a href=&quot;https://twitter.com/rob_winch/status/410609696639184896&quot;&gt;uses a &amp;lt;spring.version&amp;gt; property to control its Spring version&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The only issue I found is when started the app with &quot;mvn package &amp;&amp; java -jar target/app.war&quot;, it failed to initialize Jersey. I tried adding a @Bean for the servlet:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Bean
public ServletRegistrationBean jerseyServlet() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), &quot;/v1.0/*&quot;);
    registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
    return registration;
}
&lt;/pre&gt;
&lt;p&gt;Unfortunately, when running it using &quot;java -jar&quot;, I get the following error:
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
org.glassfish.hk2.api.MultiException: A MultiException has 1 exceptions.  They are:
1. org.glassfish.jersey.server.internal.scanning.ResourceFinderException: 
java.io.FileNotFoundException: /.../target/app.war!/WEB-INF/classes (No such file or directory)
	at org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:869)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:814)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:906)
	at org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:898)
	at org.glassfish.jersey.server.ApplicationHandler.createApplication(ApplicationHandler.java:300)
	at org.glassfish.jersey.server.ApplicationHandler.&amp;lt;init&amp;gt;(ApplicationHandler.java:279)
	at org.glassfish.jersey.servlet.WebComponent.&amp;lt;init&amp;gt;(WebComponent.java:302)
&lt;/pre&gt;
&lt;p&gt;
This seems strange since there is a WEB-INF/classes in my WAR. Regardless, this is not a Boot problem per se, but more of a Jersey issue. From one of the Boot developers:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
The whole idea with Boot is that servlets are just a transport - they are a means to an end, and hopefully not the only one - the &quot;container&quot; is Spring, not the servlet container. We probably could add some form of support for SCI but only by hacking the containers since the spec really doesn&apos;t allow for much control of their lifecycle. It hasn&apos;t been a priority so far.
&lt;/p&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
I hope this article is useful to see how you to upgrade your Java webapps to use Spring 4 and Spring Boot. I&apos;ve created a &lt;a href=&quot;https://github.com/mraible/boot-makeover&quot;&gt;boot-makeover project on GitHub&lt;/a&gt; with all the code mentioned. You can also &lt;a href=&quot;https://github.com/mraible/boot-makeover/commits/master&quot;&gt;view the commits&lt;/a&gt; for each step. &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_modern_java_web_developer1</id>
        <title type="html">The Modern Java Web Developer Bootcamp at Devoxx</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_modern_java_web_developer1"/>
        <published>2013-10-29T10:21:49-06:00</published>
        <updated>2013-10-29T16:22:39-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dv13-javaweb$" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">At this year&apos;s &lt;a href=&quot;http://www.devoxx.be/&quot;&gt;Devoxx&lt;/a&gt;, I&apos;ll be delivering &lt;a href=&quot;http://www.devoxx.be/dv13-matt-raible.html?presId=3648&quot;&gt;my first University session&lt;/a&gt;. University talks are in depth presentations of 3 hours (= 75m + 30m break + 75m). I&apos;m calling it The Modern Java Web Developer Bootcamp and my goal is to teach people some new concepts and techniques that&apos;ll make them more valuable developers. My session&apos;s hashtag is &lt;a href=&quot;https://twitter.com/search?q=%23dv13-javaweb%24&quot;&gt;#dv13-javaweb$&lt;/a&gt; to exemplify the important takeaways: &lt;a href=&quot;http://www.infoq.com/articles/javaone2013-roundup&quot;&gt;Java is back&lt;/a&gt;, web development is fun and you can make more money.
&lt;/p&gt;
&lt;p&gt;Three hours is quite a bit longer than I&apos;m used to, but I&apos;m confident I can fill the time with lots of knowledge. My plan is to enhance my &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2013_my_presentations&quot;&gt;presentation from JavaOne&lt;/a&gt; and add a few demos. Currently, I&apos;m thinking of developing the following additional content:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Overview (with SPDY)&lt;/li&gt;
&lt;li&gt;Polymer and Web Components&lt;/li&gt;
&lt;li&gt;Bootstrap 3 Overview&lt;/li&gt;
&lt;li&gt;HTML5 Storage&lt;/li&gt;
&lt;li&gt;API Framework Comparison (Play, Grails, Dropwizard)&lt;/li&gt;
&lt;li&gt;Load Testing&lt;/li&gt;
&lt;li&gt;Performance Monitoring (including RUM)&lt;/li&gt;
&lt;li&gt;Internal Cloud Options&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For demos, I&apos;d like to show a few that provide real value to attendees and teach them how to do something they haven&apos;t done before. The ones below are candidates I&apos;m thinking of, and I&apos;d like to pick three for the final presentation.&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;Browser Tools Demo&lt;/li&gt;
&lt;li&gt;Developing with Bootstrap Demo&lt;/li&gt;
&lt;li&gt;AngularJS Demo&lt;/li&gt;
&lt;li&gt;Refactor an app from Spring to Java EE, no XML, all Java 8&lt;/li&gt;
&lt;li&gt;Page Speed Improvement Demo&lt;/li&gt;
&lt;li&gt;Security Demo (add LDAP to Angular app + OWASP ZAP)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you could pick three real-time tutorials from the choices above, which ones would you choose?&lt;/p&gt;
&lt;p&gt;I&apos;m also thinking of adding some stories about impressive loads served with very little hardware and real-time dashboard development. If you have a story about either of these, please let me know. I&apos;d be happy to credit you (or your company) and talk about any technical implementation details you&apos;re willing to provide.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/javaone_2013_my_presentations</id>
        <title type="html">JavaOne 2013: My Presentations</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/javaone_2013_my_presentations"/>
        <published>2013-09-27T13:35:01-06:00</published>
        <updated>2015-07-24T20:51:56-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="play" scheme="http://roller.apache.org/ns/tags/" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="web" scheme="http://roller.apache.org/ns/tags/" />
        <category term="smackdown" scheme="http://roller.apache.org/ns/tags/" />
        <category term="modern" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;I flew into San Francisco this past Monday to speak at &lt;a href=&quot;http://www.oracle.com/javaone&quot;&gt;JavaOne&lt;/a&gt; 2013, and to meet with my &lt;a href=&quot;http://www.johnmuirhealth.com/&quot;&gt;new client&lt;/a&gt;. I made sure to wear a &lt;a href=&quot;http://www.denverbroncos.com/&quot;&gt;Broncos&lt;/a&gt; shirt since I was riding the train through Oakland and had some co-workers that were Raiders fans. My trip started off nicely as the Broncos dismantled the Raiders on Monday Night Football. My new team and I watched it during a team dinner at &lt;a href=&quot;http://havanarestaurant.net/main/&quot;&gt;Havana&lt;/a&gt; in Walnut Creek. Historically, the Broncos and Raiders have had a heated rivalry historically, so the win was the perfect start to the week. &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On Tuesday, I worked from my hotel in the morning, then met &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt; to do some last minute prep for our &lt;a href=&quot;https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=2863&quot;&gt;smackdown&lt;/a&gt;. The prior week, we both upgraded our respective apps to use the latest versions of Grails and Play Framework. I ran into &lt;a href=&quot;http://grails.1312388.n4.nabble.com/Grails-2-3-Child-object-not-saved-in-unit-test-td4649385.html&quot;&gt;a&lt;/a&gt; &lt;a href=&quot;http://grails.1312388.n4.nabble.com/Geb-Tests-with-Grails-2-3-0-td4649417.html&quot;&gt;few&lt;/a&gt; &lt;a href=&quot;http://grails.1312388.n4.nabble.com/Grails-2-3-with-Spring-Security-td4649418.html&quot;&gt;issues&lt;/a&gt; when &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/801eca879dfeed208605db897eff8b77fa07bd29&quot;&gt;upgrading&lt;/a&gt;, while Play required &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/70cbdc9b00876c6dd455dd318c304ebf053e9fa1&quot;&gt;some API changes&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
We both added &lt;a href=&quot;https://www.memcachier.com/&quot;&gt;Memcachier&lt;/a&gt; to our apps (to share caching between dynos) and ran some Apache Bench tests. The &lt;a href=&quot;http://www.ubertracks.com/preso/#/8/10&quot;&gt;results&lt;/a&gt; showed quite a bit of slowdown compared to &lt;a href=&quot;http://www.ubertracks.com/preso/#/8/9&quot;&gt;last time&lt;/a&gt;, which we attributed to caching needing to make network hops. Other than that, we both had to make changes to our framework&apos;s buildpacks to get the latest versions running on Heroku, and when we headed for our talk, my instance of Grails wasn&apos;t running (60 second boot timeout on startup). The good news is it somehow solved its issues during our talk and was up and running when I checked it after, as it &lt;a href=&quot;http://bike.ubertracks.com/&quot;&gt;is now&lt;/a&gt;. Below is an embedded version of the presentation we delivered. You can also &lt;a href=&quot;http://ubertracks.com/preso&quot;&gt;click here&lt;/a&gt; to see it in a new window, or &lt;a href=&quot;http://www.slideshare.net/mraible/play-framework-vs-grails-smackdown-javaone-2013&quot;&gt;view it on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;http://static.raibledesigns.com/repository/presentations/Play_Framework_vs_Grails_Smackdown_JavaOne2013/&quot; width=&quot;600&quot; height=&quot;375&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt; 
&lt;/div&gt;
&lt;p&gt;On Wednesday morning, I tried to attend Venkat&apos;s &lt;a href=&quot;https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=2055&quot;&gt;Programming with Lambda Expressions in Java&lt;/a&gt;, but quickly discovered it was sold out. My talk on The Modern Java Web Developer started shortly after and I had a fantastic time talking to a packed room and preaching the virtues of learning and staying up-to-date with web technologies. I made sure to include a slide on &lt;a href=&quot;https://avatar.java.net/&quot;&gt;Avatar&lt;/a&gt;, an Oracle-sponsored JavaScript-based framework that requires &quot;very minor JavaScript knowledge&quot;. You can view my presentation below or &lt;a href=&quot;http://www.slideshare.net/mraible/the-modern-java-web-developer-javaone-2013&quot;&gt;on SlideShare&lt;/a&gt;.
&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/26581954?rel=0&quot; width=&quot;600&quot; height=&quot;375&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen&gt; &lt;/iframe&gt;&lt;/div&gt;

&lt;p&gt;According to @JavaOneConf, all JavaOne 2013 presentations will be &lt;a href=&quot;https://twitter.com/JavaOneConf/status/383381815626825728&quot;&gt;published on Parleys.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After completing my talks, I journeyed to my client and practiced what I preached, successfully finishing a spike that reduced page load time from 8 seconds to 2 seconds. That evening, I attended the Oracle Appreciation Event at Treasure Island, had some cold beer and listened to some loud music. &lt;/p&gt;
&lt;p&gt;I had a great time speaking at JavaOne this year, and look forward to my next speaking engagement. In November, I&apos;ll be traveling to Devoxx where I&apos;ll be giving a &lt;a href=&quot;http://www.devoxx.be/dv13-matt-raible.html?presId=3648&quot;&gt;3-hour University session&lt;/a&gt; on The Modern Java Web Developer. Hope to see you there!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/javaone_2013</id>
        <title type="html">JavaOne 2013: My First Time Speaking</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/javaone_2013"/>
        <published>2013-09-19T17:50:34-06:00</published>
        <updated>2013-09-20T00:10:04-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="webdevelopment" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaone" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;I&apos;ve been to JavaOne many times in my life, starting in &lt;a href=&quot;http://raibledesigns.com/rd/date/20040701&quot;&gt;2004&lt;/a&gt; and continuing in &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_pictures_from_monday&quot;&gt;2005&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_2006_begins&quot;&gt;2006&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/javaone_parties&quot;&gt;2008&lt;/a&gt;. I have fond memories of the first couple years, meeting all the Java open source guys and having a lot of fun. 
&lt;/p&gt;
&lt;p&gt;
You might notice that the aforementioned blog posts no longer show pictures. That&apos;s because they were originally hosted on Apple&apos;s HomePage, which they shut down years ago. I haven&apos;t bothered to republish the photos and fix the links, but I do still have them. For those looking for a blast from the past, checkout &lt;a href=&quot;https://www.dropbox.com/sc/rk4lsfza50iaoag/a6nfMDmc_T&quot;&gt;Mike, Howard and James&lt;/a&gt; or &lt;a href=&quot;https://www.dropbox.com/sc/8fmr636tokxkaz1/YrsXeZaq4o&quot;&gt;Bruce and Marc&lt;/a&gt;. I also have a set of photos from our &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72057594139761408/&quot;&gt;Geronimo Live party in 2006&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;As many of you know, JavaOne used to be a &lt;em&gt;huge&lt;/em&gt; conference, attracting 15,000 attendees back in the day. Numbers have dwindled a lot since Oracle bought Sun and I&apos;ve heard recent years are more around 1500. Since I&apos;ve spoken at a lot of conferences, but never JavaOne, I figured I&apos;d try this year. The good news is I got accepted and I&apos;ll be there next week!&lt;/p&gt;
&lt;p&gt;On Tuesday afternoon, I&apos;ll be presenting the &lt;a href=&quot;https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=2863&amp;tclass=popup&quot;&gt;Play Framework vs Grails Smackdown&lt;/a&gt; with &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt;. On Wednesday morning, I&apos;ll be talking about &lt;a href=&quot;https://oracleus.activeevents.com/2013/connect/sessionDetail.ww?SESSION_ID=2698&amp;tclass=popup&quot;&gt;The Modern Java Web Developer&lt;/a&gt;. I also look forward to &lt;a href=&quot;http://www.oracle.com/javaone/appreciation-event/index.html&quot;&gt;The Black Keys&lt;/a&gt; on Wednesday night.&lt;/p&gt;
&lt;p&gt;I have a feeling it&apos;s gonna be a great week!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/developing_with_angularjs_part_iii</id>
        <title type="html">Developing with AngularJS - Part III: Services</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/developing_with_angularjs_part_iii"/>
        <published>2013-06-25T07:03:26-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="rest" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="taleo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dwr" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;This is the 3rd article in a series on my experience developing with &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt;. I used AngularJS for several months to create a &quot;My Dashboard&quot; feature for a client and learned a whole bunch of Angular goodness along the way. For previous articles, please see &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_i&quot;&gt;Part I: The Basics&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_ii&quot;&gt;Part II: Dialogs and Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Angular offers several ways to interact with data from the server. The easiest way is to use the &lt;a href=&quot;http://docs.angularjs.org/api/ngResource.$resource&quot;&gt;$resource factory&lt;/a&gt;, which lets you interact with &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;RESTful&lt;/a&gt; server-side data sources. When we started the My Dashboard project, we were hoping to interact with a REST API, but soon found out that it didn&apos;t have all the data we needed. Rather than loading the page and then making another request to get its data, we decided to embed the JSON in the page. For communication back to the server, we used our tried-and-true Ajax solution: &lt;a href=&quot;http://directwebremoting.org/&quot;&gt;DWR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Angular-speak, &lt;em&gt;services&lt;/em&gt; are &lt;a href=&quot;http://docs.angularjs.org/guide/dev_guide.services.understanding_services&quot;&gt;singletons that carry out specific tasks common to web apps&lt;/a&gt;. In other words, they&apos;re any &lt;em&gt;$name&lt;/em&gt; object that can be injected into a controller or directive. However, as a Java Developer, I tend to think of services as objects that communicate with the server. Angular&apos;s documentation on &lt;a href=&quot;http://docs.angularjs.org/guide/dev_guide.services.creating_services&quot;&gt;Creating Services&lt;/a&gt; shows you various options for registering services. I used the angular.Module api method.&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
&lt;a href=&quot;http://angularjs.org/&quot; title=&quot;AngularJS&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7445/9137074888_9d3bb13d32_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot; alt=&quot;AngularJS&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
This is the 3rd article in a series on my experience developing with &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt;. I used AngularJS for several months to create a &quot;My Dashboard&quot; feature for a client and learned a whole bunch of Angular goodness along the way. For previous articles, please see &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_i&quot;&gt;Part I: The Basics&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_ii&quot;&gt;Part II: Dialogs and Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Angular offers several ways to interact with data from the server. The easiest way is to use the &lt;a href=&quot;http://docs.angularjs.org/api/ngResource.$resource&quot;&gt;$resource factory&lt;/a&gt;, which lets you interact with &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;RESTful&lt;/a&gt; server-side data sources. When we started the My Dashboard project, we were hoping to interact with a REST API, but soon found out that it didn&apos;t have all the data we needed. Rather than loading the page and then making another request to get its data, we decided to embed the JSON in the page. For communication back to the server, we used our tried-and-true Ajax solution: &lt;a href=&quot;http://directwebremoting.org/&quot;&gt;DWR&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In Angular-speak, &lt;em&gt;services&lt;/em&gt; are &lt;a href=&quot;http://docs.angularjs.org/guide/dev_guide.services.understanding_services&quot;&gt;singletons that carry out specific tasks common to web apps&lt;/a&gt;. In other words, they&apos;re any &lt;em&gt;$name&lt;/em&gt; object that can be injected into a controller or directive. However, as a Java Developer, I tend to think of services as objects that communicate with the server. Angular&apos;s documentation on &lt;a href=&quot;http://docs.angularjs.org/guide/dev_guide.services.creating_services&quot;&gt;Creating Services&lt;/a&gt; shows you various options for registering services. I used the angular.Module api method.&lt;/p&gt;

&lt;p&gt;When I last worked on the project, there were only two services in My Dashboard: Widget and Preferences.&lt;/p&gt;

&lt;h3 id=&quot;widget&quot;&gt;Widget Service&lt;/h3&gt;
&lt;p&gt;The Widget service is used to retrieve the visible widgets for the user. It has two functions that are exposed to controllers: &lt;code&gt;getUserWidgets(type)&lt;/code&gt; and &lt;code&gt;getHiddenWidgets(type)&lt;/code&gt;. The former function is used at the top of &lt;code&gt;WidgetController&lt;/code&gt;, while the latter is used for the configuration dialog mentioned in the &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_ii&quot;&gt;previous article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The code for this service is in &lt;em&gt;services.js&lt;/em&gt;. The bulk of the logic is in its &lt;code&gt;filterData()&lt;/code&gt; function, where it goes through a 4-step process:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Get all the widgets by type, ensuring they&apos;re unique.&lt;/li&gt;&lt;li&gt;Remove the widgets that are &lt;em&gt;hidden&lt;/em&gt; by the user&apos;s preferences.&lt;/li&gt;&lt;li&gt;Build an array that&apos;s &lt;em&gt;ordered&lt;/em&gt; by user&apos;s preferences.&lt;/li&gt;&lt;li&gt;Add any new widgets that aren&apos;t &lt;em&gt;hidden&lt;/em&gt; or &lt;em&gt;ordered&lt;/em&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The code for the Widget object is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
angular.module(&apos;dashboard.services&apos;, &amp;#91;&amp;#93;).
    factory(&apos;Widget&apos;,function ($filter, Preferences) {
        var filter = $filter(&apos;filter&apos;);
        var unique = $filter(&apos;unique&apos;);

        function filterData(array, query) {
            // get all possible widgets for a particular type
            var data = filter(array, query);
            data = unique(data);

            // remove widgets that are hidden by users preference
            var hidden = Preferences.getHiddenWidgets(query.type);
            for (var i = 0; i &amp;lt; hidden.length; i++) {
                var w = filter(data, {id: hidden&amp;#91;i&amp;#93;});
                $.each(w, function (index, item) {
                    var itemId = item.id;
                    if (hidden.indexOf(itemId) &amp;gt; -1) {
                        data.splice(data.indexOf(item), 1);
                    }
                });
            }

            // build an array that&apos;s ordered by users preference
            var ordered = &amp;#91;&amp;#93;;
            var visible = Preferences.getUserWidgets(query.type);
            for (var j = 0; j &amp;lt; visible.length; j++) {
                var v = filter(data, {id: visible&amp;#91;j&amp;#93;});
                $.each(v, function (index, item) {
                    var itemId = item.id;
                    if (visible.indexOf(itemId) &amp;gt; -1) {
                        ordered.push(item)
                    }
                });
            }

            // loop through data again and add any new widgets not in ordered
            $.each(data, function (index, item) {
                if (ordered.indexOf(item) === -1) {
                    ordered.push(item);
                }
            });

            return ordered;
        }

        return {
            getUserWidgets: function (type) {
                return filterData(widgetData, {type: type})
            },

            getHiddenWidgets: function (type) {
                var hidden = Preferences.getHiddenWidgets(type);
                var widgetsForType = filter(widgetData, {type: type});
                widgetsForType = unique(widgetsForType);
                var widgets = &amp;#91;&amp;#93;;
                for (var j = 0; j &amp;lt; hidden.length; j++) {
                    var v = filter(widgetsForType, {id: hidden&amp;#91;j&amp;#93;});
                    $.each(v, function (index, item) {
                        if (widgetsForType.indexOf(item) &amp;gt; -1) {
                            widgets.push(item)
                        }
                    });
                }
                return widgets;
            }
        }
    })
&lt;/pre&gt;
&lt;p&gt;Once you have a service configured like this, you can inject it by name. For example, &lt;code&gt;WidgetController&lt;/code&gt; has &lt;code&gt;Widget&lt;/code&gt; injected into its constructor:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
function WidgetController($dialog, $scope, Widget, Preferences) {
&lt;/pre&gt;
&lt;h3 id=&quot;preferences&quot;&gt;Preferences Service&lt;/h3&gt;
&lt;p&gt;The Preferences service is used to get and save user preferences. It&apos;s pretty straightforward and the bulk of its code is interacting with DWR. This service has 5 methods:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;getHiddenWidgets(type) - used by Widget service&lt;/li&gt;&lt;li&gt;getUserWidgets(type) - used by Widget service&lt;/li&gt;&lt;li&gt;saveBarOrder(bars) - called from WidgetController&lt;/li&gt;&lt;li&gt;saveWidgetOrder(type, widgets) - called from WidgetController&lt;/li&gt;&lt;li&gt;saveWidgetPreferences(type, widgets) - called from WidgetController&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;First, let&apos;s take a look at the &lt;code&gt;save*Order()&lt;/code&gt; functions. There are two parts of the page that use the &lt;em&gt;ui-sortable&lt;/em&gt; directive to initialize drag-and-drop functionality. The first is on the main &amp;lt;ul&amp;gt; that holds the 3 bars on the left.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
&amp;lt;ul class=&quot;widgets&quot; ui-sortable=&quot;{handle:&apos;.heading&apos;, update: updateBars}&quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The &quot;update&quot; property in the configuration JSON indicates which method to call in the controller. Similarly, the tasks and summary items call an &lt;code&gt;updateOrder&lt;/code&gt; function.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
&amp;lt;ul class=&quot;summary-items&quot; ng-model=&quot;summaryWidgets&quot; ui-sortable=&quot;{update: updateOrder}&quot;&amp;gt;
...
&amp;lt;ul class=&quot;task-items&quot; ng-model=&quot;taskWidgets&quot; ui-sortable=&quot;{update: updateOrder}&quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;These functions are in &lt;code&gt;WidgetController&lt;/code&gt; and build an array of widget ids to pass to the Preferences service.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
$scope.updateBars = function(event, ui) {
    var bars = &amp;#91;&amp;#93;;
    $.each($(ui.item).parent().children(), function (index, item) {
        bars.push(item.id.substring(0, item.id.indexOf(&apos;-&apos;)))
    });
    Preferences.saveBarOrder(bars);
};

$scope.updateOrder = function(event, ui) {
    var parentId = $(ui.item).parent().parent().attr(&apos;id&apos;);
    var type = parentId.substring(0, parentId.indexOf(&apos;-&apos;));
    var items = &amp;#91;&amp;#93;;
    $.each($(ui.item).parent().children(), function (index, item) {
        items.push(item.id.substring(item.id.indexOf(&apos;-&apos;) + 1))
    });
    Preferences.saveWidgetOrder(type, {items: items});
};
&lt;/pre&gt;
&lt;p&gt;The bar order is used when the page is loaded. The following scriptlet code exists at the bottom of the app&apos;s page, in its $(document).ready:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
&amp;lt;%  String barOrder = user.getDashboardBarSortOrder();
    if (barOrder != null) { %&amp;gt;
    sortBars(&amp;#91;&apos;&amp;lt;%= barOrder %&amp;gt;&apos;&amp;#93;);
&amp;lt;% } %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;sortBars()&lt;/code&gt; function is in a &lt;em&gt;dashboard.js&lt;/em&gt; file (where we put all non-Angular functions):&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
function sortBars(barOrder) {
    // Sort bars according to user preferences
    $.each(barOrder, function(index, item) {
        var bar = $(&apos;#&apos; + item + &apos;-bar&apos;);
        if (bar.index() !== index) {
            if (index === 0) {
                bar.insertBefore($(&apos;.widgets&amp;gt;li:first-child&apos;));
            } else if (index === (barOrder.length - 1)) {
                bar.insertAfter($(&apos;.widgets&amp;gt;li:last-child&apos;));
            } else {
                bar.insertBefore($(&apos;.widgets&amp;gt;li:eq(&apos; + index + &apos;)&apos;));
            }
        }
    });
}
&lt;/pre&gt;
&lt;p&gt;Now that you&apos;ve seen where Preferences is called from, let&apos;s take a look at the code for the service.&lt;/p&gt;
&lt;div class=&quot;alert alert-info&quot;&gt;
The checks for undefined and uniqueness in the code below shouldn&apos;t be necessary, but I prefer defensive coding.
&lt;/div&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
factory(&apos;Preferences&apos;, function ($filter) {
    var unique = $filter(&apos;unique&apos;);

    return {
        // Get in-page variable: hiddenWidgets
        getHiddenWidgets: function (type) {
            var items = hiddenWidgets&amp;#91;type&amp;#93;;
            return (angular.isUndefined(items) ? &amp;#91;&amp;#93; : unique(items));
        },

        // Get in-page variable: userWidgets
        getUserWidgets: function (type) {
            var items = userWidgets&amp;#91;type&amp;#93;;
            return (angular.isUndefined(items) ? &amp;#91;&amp;#93; : unique(items));
        },

        // Save main bar (task, summary, chart) order
        saveBarOrder: function (bars) {
            DWRFacade.saveDashboardBarSortOrder(bars, {
                errorHandler: function (errorString) {
                    alert(errorString);
                }
            })
        },

        // Save order of widgets from sortable
        saveWidgetOrder: function (type, widgets) {
            userWidgets&amp;#91;type&amp;#93; = widgets.items;
            DWRFacade.saveDashboardWidgetPreference(type, widgets, {
                errorHandler: function (errorString) {
                    alert(errorString);
                }
            });
        },

        // Save hidden and visible (and order) widgets from config dialog
        saveWidgetPreferences: function (type, widgets) {
            // widgets is a map of hidden and visible
            var hiddenIds = &amp;#91;&amp;#93;;
            $.each(widgets.hidden, function (index, item) {
                hiddenIds.push(item.id);
            });
            var visibleIds = &amp;#91;&amp;#93;;
            $.each(widgets.items, function (index, item) {
                visibleIds.push(item.id);
            });
            var preferences = {
                hidden: hiddenIds,
                items: visibleIds
            };
            // reset local variables in page
            hiddenWidgets&amp;#91;type&amp;#93; = hiddenIds;
            userWidgets&amp;#91;type&amp;#93; = visibleIds;
            DWRFacade.saveDashboardWidgetPreference(type, preferences, {
                errorHandler: function (errorString) {
                    alert(errorString);
                }
            });
        }
    }
})
&lt;/pre&gt;
&lt;h3 id=&quot;http&quot;&gt;Using $http and Receiving Data&lt;/h3&gt;
&lt;p&gt;In this particular application, we didn&apos;t do any reading from the server with Angular. We simply wrote preferences to the server, and updated embedded variables when data changed. Real-time functionality of the app wouldn&apos;t be noticeable if a write failed. 
&lt;/p&gt;
&lt;p&gt;
In my current Angular project, it&apos;s more of a full-blown application that does as much reading as writing. For this, I&apos;ve found it useful to either 1) pass in callbacks to services or 2) use Angular&apos;s event system to publish/subscribe to events.
&lt;/p&gt;
&lt;p&gt;The first method is the easiest, and likely the most familiar to JavaScript developers. For example, here&apos;s the controller code to remove a profile picture:
&lt;/p&gt;

&lt;pre class=&quot;brush: js&quot;&gt;
Profile.removePhoto($scope.user, function (data) {
    // close the dialog
    $scope.close(&apos;avatar&apos;);
    // success message using toastr: http://bit.ly/14Uisgm
    Flash.pop({type: &apos;success&apos;, body: &apos;Your profile picture was removed.&apos;});
})
&lt;/pre&gt;
&lt;p&gt;And the &lt;code&gt;Profile.removePhoto()&lt;/code&gt; method:
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
removePhoto: function (user, callback) {
    $http.post(&apos;/profile/removePhoto&apos;, user).success(function (response) {
        return callback(response);
    });
}
&lt;/pre&gt;
&lt;p&gt;The second, event-driven method works equally as well, but can easily suffer from typos in event names.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
// controller calling code
Profile.getUser();

// service code
getUser: function () {
    $http.get(&apos;/profile&apos;).success(function (data) {
        if (data.username) {
            $log.info(&apos;Profile for &apos; + data.username + &apos; retrieved!&apos;);
            $rootScope.$broadcast(&apos;event:profile&apos;, data);
        }
    });
}

// controller receiving code
$rootScope.$on(&apos;event:profile&apos;, function (event, data) {
    $scope.user = data;
});
&lt;/pre&gt;
&lt;p&gt;I like both methods, but the event-driven one seems like it could offer more extensibility in the future.&lt;/p&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;Using in-page variables and DWR doesn&apos;t seem to be recommended by the Angular Team. However, it worked well for us and seems like a good way to construct Angular services. Even if a REST API becomes available to get all the data, I think using in-page variables to minimize requests is a good idea. &lt;/p&gt;
&lt;p&gt;When retrieving data, you can use callbacks or Angular&apos;s pub/sub event system ($broadcast and $on) to get data in your controllers. If you want to learn more about this technique, see Eric Terpstra&apos;s &lt;a href=&quot;http://ericterpstra.com/2012/09/angular-cats-part-3-communicating-with-broadcast/&quot;&gt;Communicating with $broadcast&lt;/a&gt;. In his article, Eric mentions &lt;a href=&quot;https://groups.google.com/d/msg/angular/M0SHItdgBqg/R1t_17cR0pYJ&quot;&gt;Thomas Burleson&apos;s pub/sub module&lt;/a&gt; that acts as a message queue. If you&apos;ve used Thomas&apos;s MessageQueue (or something similar) with Angular, I&apos;d love to hear about your experience. 
&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_iv&quot;&gt;next article&lt;/a&gt;, I&apos;ll talk about how we redesigned My Dashboard and used CSS3 and JavaScript to implement new ideas.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/developing_with_angularjs_part_i</id>
        <title type="html">Developing with AngularJS - Part I: The Basics</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/developing_with_angularjs_part_i"/>
        <published>2013-06-18T09:06:52-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/The Web" label="The Web" />
        <category term="jquery" scheme="http://roller.apache.org/ns/tags/" />
        <category term="highcharts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="taleo" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;There&apos;s &lt;a href=&quot;http://hop.ie/blog/angularjs-introduction/&quot;&gt;many&lt;/a&gt;, &lt;a href=&quot;http://www.raweng.com/blog/2013/01/30/introduction-to-angularjs-part-1/&quot;&gt;many&lt;/a&gt; different &lt;a href=&quot;http://www.webdesignerdepot.com/2013/04/an-introduction-to-angularjs/&quot;&gt;introductions&lt;/a&gt; to &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; available on the internet. This article is not another introduction, but rather a story about my learning experience. It all started way back in January of this year. I was working as a UI Architecture Consultant at Taleo/Oracle, my client for the last 21 months. My gig there ended last month, but they agreed to let me publish a series of articles about the knowledge I gained.&lt;/p&gt;

&lt;h3 id=&quot;background&quot;&gt;Project Background&lt;/h3&gt;
&lt;p&gt;The Director of Product Management had been working on the concepts for a new project - codenamed &quot;Visual MyView&quot;. Below is a mockup he created for our kickoff meeting on January 4th.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mraible/8904352595/&quot; href=&quot;http://farm3.staticflickr.com/2872/8904352595_1678cfd1ab_c.jpg&quot; title=&quot;My Dashboard - Original Mockup&quot; rel=&quot;lightbox[angular-dashboard1]&quot;&gt;&lt;img src=&quot;http://farm3.staticflickr.com/2872/8904352595_1678cfd1ab.jpg&quot; width=&quot;500&quot; height=&quot;296&quot; alt=&quot;My Dashboard - Original Mockup&quot; style=&quot;border: 1px solid silver; box-shadow: 5px 5px 10px #888&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
From his original email about the above mockup:
&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
    &lt;p&gt;The intent here is that one of the columns has rows that have a similar width. The rows could be dragged and dropped into a different order &#8211; or potentially the two columns could also be reordered. The rows will basically be comprised of similar widgets. You can see in the mockup how the first two rows might look &#8211; and sample widgets. The widgets shown can be configured by the end user, as well as the order in which they are displayed. Other requirements given to us were the following.
    &lt;/p&gt;
    &lt;ul&gt;&lt;li&gt;Row 1 is comprised of &apos;summary&apos; widgets that are &apos;todo&apos; items. Reviews needing done &#8211; approvals required &#8211; etc.&lt;/li&gt;
        &lt;li&gt;Row 2 will be a graph row &#8211; having graphs and charts to display information &#8211; larger squares will build this row.&lt;/li&gt;
        &lt;li&gt;Row 3&apos;s content was not determined yet.&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I started the initial layout with static HTML and CSS and had a wireframe to show by mid January.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mraible/8904969226/&quot; href=&quot;http://farm3.staticflickr.com/2885/8904969226_c33d020e07_c.jpg&quot; title=&quot;Wireframe&quot; rel=&quot;lightbox[angular-dashboard1]&quot;&gt;&lt;img src=&quot;http://farm3.staticflickr.com/2885/8904969226_c33d020e07_n.jpg&quot; width=&quot;320&quot; height=&quot;268&quot; alt=&quot;Wireframe&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;By the end of January, we&apos;d renamed the project to My Dashboard and had a working prototype using &lt;a href=&quot;http://randomibis.com/coolclock/&quot;&gt;CoolClock&lt;/a&gt; and &lt;a href=&quot;http://momentjs.com/&quot;&gt;moment.js&lt;/a&gt; for the clock in the top right, &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; to display widget data, &lt;a href=&quot;http://jqueryui.com/&quot;&gt;jQuery UI&lt;/a&gt; for drag-n-drop of rows and widgets, Bootstrap&apos;s &lt;a href=&quot;http://twitter.github.com/bootstrap/javascript.html#carousel&quot;&gt;Carousel&lt;/a&gt; for holding charts and &lt;a href=&quot;http://www.highcharts.com/&quot;&gt;Highcharts&lt;/a&gt; for rendering charts.&lt;/p&gt;
</summary>
        <content type="html">&lt;p&gt;There&apos;s &lt;a href=&quot;http://hop.ie/blog/angularjs-introduction/&quot;&gt;many&lt;/a&gt;, &lt;a href=&quot;http://www.raweng.com/blog/2013/01/30/introduction-to-angularjs-part-1/&quot;&gt;many&lt;/a&gt; &lt;a href=&quot;http://www.codeproject.com/Articles/607873/Extending-HTML-with-AngularJS-Directives&quot;&gt;different&lt;/a&gt; &lt;a href=&quot;http://www.webdesignerdepot.com/2013/04/an-introduction-to-angularjs/&quot;&gt;introductions&lt;/a&gt; to &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; available on the internet. This article is not another introduction, but rather a story about my learning experience. It all started way back in January of this year. I was working as a UI Architecture Consultant at Taleo/Oracle, my client for the last 21 months. My gig there ended last month, but they agreed to let me publish a series of articles about the knowledge I gained.&lt;/p&gt;

&lt;h3 id=&quot;background&quot;&gt;Project Background&lt;/h3&gt;
&lt;p&gt;The Director of Product Management had been working on the concepts for a new project - codenamed &quot;Visual MyView&quot;. Below is a mockup he created for our kickoff meeting on January 4th.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mraible/8904352595/&quot; href=&quot;http://farm3.staticflickr.com/2872/8904352595_1678cfd1ab_c.jpg&quot; title=&quot;My Dashboard - Original Mockup&quot; rel=&quot;lightbox[angular-dashboard1]&quot;&gt;&lt;img src=&quot;//farm3.staticflickr.com/2872/8904352595_1678cfd1ab.jpg&quot; width=&quot;500&quot; height=&quot;296&quot; alt=&quot;My Dashboard - Original Mockup&quot; style=&quot;border: 1px solid silver; box-shadow: 5px 5px 10px #888&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
From his original email about the above mockup:
&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
    &lt;p&gt;The intent here is that one of the columns has rows that have a similar width. The rows could be dragged and dropped into a different order &#8211; or potentially the two columns could also be reordered. The rows will basically be comprised of similar widgets. You can see in the mockup how the first two rows might look &#8211; and sample widgets. The widgets shown can be configured by the end user, as well as the order in which they are displayed. Other requirements given to us were the following.
    &lt;/p&gt;
    &lt;ul&gt;&lt;li&gt;Row 1 is comprised of &apos;summary&apos; widgets that are &apos;todo&apos; items. Reviews needing done &#8211; approvals required &#8211; etc.&lt;/li&gt;
        &lt;li&gt;Row 2 will be a graph row &#8211; having graphs and charts to display information &#8211; larger squares will build this row.&lt;/li&gt;
        &lt;li&gt;Row 3&apos;s content was not determined yet.&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;I started the initial layout with static HTML and CSS and had a wireframe to show by mid January.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mraible/8904969226/&quot; href=&quot;http://farm3.staticflickr.com/2885/8904969226_c33d020e07_c.jpg&quot; title=&quot;Wireframe&quot; rel=&quot;lightbox[angular-dashboard1]&quot;&gt;&lt;img src=&quot;//farm3.staticflickr.com/2885/8904969226_c33d020e07_n.jpg&quot; width=&quot;320&quot; height=&quot;268&quot; alt=&quot;Wireframe&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;By the end of January, we&apos;d renamed the project to My Dashboard and had a working prototype using &lt;a href=&quot;http://randomibis.com/coolclock/&quot;&gt;CoolClock&lt;/a&gt; and &lt;a href=&quot;http://momentjs.com/&quot;&gt;moment.js&lt;/a&gt; for the clock in the top right, &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; to display widget data, &lt;a href=&quot;http://jqueryui.com/&quot;&gt;jQuery UI&lt;/a&gt; for drag-n-drop of rows and widgets, Bootstrap&apos;s &lt;a href=&quot;http://twitter.github.com/bootstrap/javascript.html#carousel&quot;&gt;Carousel&lt;/a&gt; for holding charts and &lt;a href=&quot;http://www.highcharts.com/&quot;&gt;Highcharts&lt;/a&gt; for rendering charts. For this prototype, we included 4 types of widgets:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Summary&lt;/li&gt;&lt;li&gt;Tasks&lt;/li&gt;&lt;li&gt;Charts&lt;/li&gt;&lt;li&gt;Reports&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;To create widgets, we had to decide on a common schema for them.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
&quot;id&quot;: 1, // not necessary for display, but likely needed if we modify and save preferences
&quot;title&quot;: &quot;Appointments Today&quot;,
&quot;type&quot;: &quot;summary&quot;, // others include: task, chart, report
&quot;value&quot;: 3, 
&quot;description&quot;: &quot;10:30 Jim Smith&quot;,
&quot;events&quot;: &quot;url&quot;, // this can have click events
&quot;order&quot;: 1 // used to determine order
&lt;/pre&gt;
&lt;p&gt;Below is a screenshot of our wireframe with some sample widgets.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mraible/8904969540/&quot; href=&quot;http://farm9.staticflickr.com/8556/8904969540_1cfe0e56c7_c.jpg&quot; title=&quot;Wireframe with Data&quot; rel=&quot;lightbox[angular-dashboard1]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8556/8904969540_1cfe0e56c7.jpg&quot; width=&quot;500&quot; height=&quot;342&quot; alt=&quot;Wireframe with Data&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id=&quot;basics&quot;&gt;Angular Basics&lt;/h3&gt;
&lt;p&gt;The decision to use AngularJS came early on in the project, after I read Tyler Renelle&apos;s &lt;a href=&quot;https://gist.github.com/lefnire/4454814&quot;&gt;Rant: Backbone, Angular, Meteor, Derby&lt;/a&gt;. To learn AngularJS, I briefly looked at its homepage documentation and played with some examples. Then I stumbled upon Misko Hevery and Igor Minar&apos;s &lt;a href=&quot;http://parleys.com/play/5148922b0364bc17fc56c91b/about&quot;&gt;AngularJS Presentation from Devoxx 2012&lt;/a&gt;. At that time, the video wasn&apos;t publicly available (it&apos;s free now), so I had to buy a Parley&apos;s subscription ($79). It was well worth the money because that one hour video greatly contributed to my understanding of how AngularJS works. Another resource I used frequently to figure out how to do things was John Lindquist&apos;s &lt;a href=&quot;http://www.egghead.io/&quot;&gt;egghead.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To begin with, we wrote the JSON for a bunch of sample widgets and embedded them into the page as a &lt;code&gt;widgetData&lt;/code&gt; JavaScript variable.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
var widgetData = [
    {&quot;id&quot;: 1, &quot;title&quot;: &quot;Appointments Today&quot;, &quot;type&quot;: &quot;summary&quot;, &quot;value&quot;: 3, &quot;description&quot;: &quot;10:30 Jim Smith&quot;, &quot;events&quot;: {&quot;click&quot;: &quot;alert(&apos;foo&apos;);&quot;}, &quot;order&quot;: 1},
    {&quot;id&quot;: 12, &quot;order&quot;: 2, &quot;title&quot;: &quot;Offer Approvals&quot;, &quot;type&quot;: &quot;task&quot;, &quot;class&quot;: &quot;sticky-note&quot;, &quot;value&quot;: 1},
    {&quot;id&quot;: 103, &quot;title&quot;: &quot;Browser market shares at a specific website, 2010&quot;, &quot;order&quot;: 1, &quot;type&quot;: &quot;chart&quot;, &quot;chartType&quot;: &quot;pie&quot;, 
         &quot;tooltip&quot;: {&quot;pointFormat&quot;: &quot;{series.name}: &amp;lt;b&gt;{point.percentage}%&amp;lt;/b&gt;&quot;, &quot;percentageDecimals&quot;: 1}, &quot;series&quot;: [
         {&quot;type&quot;: &quot;pie&quot;, &quot;name&quot;: &quot;Browser share&quot;, &quot;data&quot;: [
             [&quot;Firefox&quot;, 45.0],
             [&quot;IE&quot;, 26.8],
             {&quot;name&quot;: &quot;Chrome&quot;, &quot;y&quot;: 12.8, &quot;sliced&quot;: true, &quot;selected&quot;: true},
             [&quot;Safari&quot;, 8.5],
             [&quot;Opera&quot;, 6.2],
             [&quot;Others&quot;, 0.7]
         ]}
    ]},
    ...
];
&lt;/pre&gt;
&lt;p&gt;I used &lt;a href=&quot;https://github.com/angular/angular-seed&quot;&gt;angular-seed&lt;/a&gt; to create the initial structure of the prototype, and continued using the same JavaScript file names when we moved it into the product I worked on. Since the application takes a while to login and render the My Dashboard page (when working remotely), I decided not to use the &lt;a href=&quot;http://karma-runner.github.io/0.8/index.html&quot;&gt;Karma&lt;/a&gt; testing framework that ships with Angular. Below is what our directory structure looked like for our prototype.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mraible/8904352305/&quot; href=&quot;http://farm3.staticflickr.com/2860/8904352305_e3b3d40f80_c.png&quot; title=&quot;Angular Seed Directory Structure&quot; rel=&quot;lightbox[angular-dashboard1]&quot;&gt;&lt;img src=&quot;//farm3.staticflickr.com/2860/8904352305_e3b3d40f80_o.png&quot; width=&quot;327&quot; height=&quot;459&quot; alt=&quot;Angular Seed Directory Structure&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The JavaScript files in the &quot;js&quot; folder are the most important for Angular. The first file, &lt;code&gt;app.js&lt;/code&gt;, loads the other files:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
angular.module(&apos;dashboard&apos;, [&apos;dashboard.filters&apos;, &apos;dashboard.services&apos;, &apos;dashboard.directives&apos;]);
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;controllers.js&lt;/code&gt; file contains the Controllers (functions) that get the data and make it available to the page. Here&apos;s the code for our first controller:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
&apos;use strict&apos;;

/* Controllers */
function WidgetController($scope) {
    $scope.widgets = widgetData;
}
&lt;/pre&gt;
&lt;p&gt;This puts the widgets in scope and then we were able to render them using Angular&apos;s &lt;a href=&quot;http://docs.angularjs.org/api/ng.directive:ngRepeat&quot;&gt;ngRepeat&lt;/a&gt; directive and the following HTML:&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;div ng-app=&quot;dashboard&quot; class=&quot;dashboard&quot;&amp;gt;
    &amp;lt;div class=&quot;container-widgets&quot; ng-controller=&quot;WidgetController&quot; ng-cloak&amp;gt;
        &amp;lt;div class=&quot;row-fluid&quot;&amp;gt;
            &amp;lt;div class=&quot;span9&quot;&amp;gt;
                &amp;lt;ul class=&quot;widgets&quot;&amp;gt;
                    &amp;lt;li id=&quot;summary-bar&quot;&amp;gt;
                        &amp;lt;div class=&quot;heading&quot;&amp;gt;Summary&amp;lt;/div&amp;gt;
                        &amp;lt;ul class=&quot;tiles&quot;&amp;gt;
                            &amp;lt;li class=&quot;span3&quot; ng-repeat=&quot;widget in widgets | filter:{type: &apos;summary&apos;} | orderBy: &apos;order&apos;&quot;&amp;gt;
                                &amp;lt;h3 class=&quot;events&quot;&amp;gt;{{widget.value}}&amp;lt;/h3&amp;gt;
                                &amp;lt;div class=&quot;title&quot;&amp;gt;{{widget.title}}&amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;desc&quot;&amp;gt;{{widget.description}}&amp;lt;/div&amp;gt;
                            &amp;lt;/li&amp;gt;
                        &amp;lt;/ul&amp;gt;
                    &amp;lt;/li&amp;gt;
                    &amp;lt;li id=&quot;task-bar&quot;&amp;gt;
                        &amp;lt;div class=&quot;heading&quot;&amp;gt;My Tasks&amp;lt;/div&amp;gt;
                        &amp;lt;ul class=&quot;tasks&quot;&amp;gt;
                            &amp;lt;li class=&quot;task {{widget.class}}&quot; ng-repeat=&quot;widget in widgets | filter: {type: &apos;task&apos;} | orderBy: &apos;order&apos;&quot;&amp;gt;
                                &amp;lt;div class=&quot;title events&quot;&amp;gt;{{widget.title}}&amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;value&quot;&amp;gt;{{widget.value}}&amp;lt;/div&amp;gt;
                            &amp;lt;/li&amp;gt;
                        &amp;lt;/ul&amp;gt;
                    &amp;lt;/li&amp;gt;
                    &amp;lt;li id=&quot;chart-bar&quot;&amp;gt;
                        &amp;lt;div class=&quot;heading&quot;&amp;gt;Charts&amp;lt;/div&amp;gt;
                        &amp;lt;div id=&quot;chartCarousel&quot; class=&quot;carousel slide&quot;&amp;gt;
                            &amp;lt;ol class=&quot;carousel-indicators&quot;&amp;gt;
                                &amp;lt;li data-target=&quot;#chartCarousel&quot;
                                    ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | orderBy: &apos;order&apos;&quot;
                                    data-slide-to=&quot;{{$index}}&quot; ng-class=&quot;{active: $index == 0}&quot;&amp;gt;&amp;lt;/li&amp;gt;
                            &amp;lt;/ol&amp;gt;
                            &amp;lt;div class=&quot;carousel-inner&quot;&amp;gt;
                                &amp;lt;div class=&quot;item chart&quot;
                                     ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | orderBy: &apos;order&apos;&quot;
                                     ng-class=&quot;{active: $index == 0}&quot;&amp;gt;
                                    &amp;lt;chart class=&quot;widget&quot; value=&quot;{{widget}}&quot; type=&quot;{{widget.chartType}}&quot;&amp;gt;&amp;lt;/chart&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;a class=&quot;left carousel-control&quot; href=&quot;#chartCarousel&quot; data-slide=&quot;prev&quot;&amp;gt;&#8249;&amp;lt;/a&amp;gt;
                            &amp;lt;a class=&quot;right carousel-control&quot; href=&quot;#chartCarousel&quot; data-slide=&quot;next&quot;&amp;gt;&#8250;&amp;lt;/a&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/li&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;span3&quot;&amp;gt;
                &amp;lt;!-- clock and reports --&amp;gt;
            &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The beginning of this HTML shows how Angular is instantiated: &lt;strong&gt;ng-app&lt;/strong&gt; matches the name defined in &lt;code&gt;app.js&lt;/code&gt;, &lt;strong&gt;ng-controller&lt;/strong&gt; instantiates the &lt;code&gt;WidgetController&lt;/code&gt; and &lt;strong&gt;ng-cloak&lt;/strong&gt; is used to hide everything until its processed.&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;div ng-app=&quot;dashboard&quot; class=&quot;dashboard&quot;&amp;gt;
    &amp;lt;div class=&quot;container-widgets&quot; ng-controller=&quot;WidgetController&quot; ng-cloak&amp;gt;
&lt;/pre&gt;
&lt;p&gt;If you take a closer look at the way ng-repeat attributes, you&apos;ll see how &lt;strong&gt;filters&lt;/strong&gt; are used to filter data. There&apos;s &lt;a href=&quot;http://docs.angularjs.org/api/ng.filter:filter&quot;&gt;&lt;em&gt;filter&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;and &lt;a href=&quot;http://docs.angularjs.org/api/ng.filter:orderBy&quot;&gt;&lt;em&gt;orderBy&lt;/em&gt;&lt;/a&gt; filters that are built in and allow you to filter data. The &lt;em&gt;filter &lt;/em&gt;filter allows you to query arrays by strings, objects and even functions. In the following code block, &quot;task&quot; widgets are filtered, ordered and displayed.&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;li class=&quot;task {{widget.class}}&quot; ng-repeat=&quot;widget in widgets | filter: {type: &apos;task&apos;} | orderBy: &apos;order&apos;&quot;&amp;gt;
    &amp;lt;div class=&quot;title events&quot;&amp;gt;{{widget.title}}&amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;value&quot;&amp;gt;{{widget.value}}&amp;lt;/div&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This was pretty straightforward, but we quickly noticed that if a widget had HTML in its title, it didn&apos;t display correctly (rendering the raw HTML). To process the HTML, we had to use the &lt;a href=&quot;http://docs.angularjs.org/api/ngSanitize.directive:ngBindHtml&quot;&gt;ngBindHtml&lt;/a&gt; directive (tip: directives are camelCase, but written with dashes in HTML).&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;div class=&quot;title events&quot; ng-bind-html=&quot;widget.title&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After getting this to work, we noticed that some titles weren&apos;t fully rendered because they were hidden with overflow: hidden. We tried adding a tooltip with &lt;code&gt;title=&quot;{{widget.title}}&quot;&lt;/code&gt;, but ran into the same issue. I &lt;a href=&quot;https://groups.google.com/d/topic/angular/hG-T1bsmlnk/discussion&quot;&gt;sent an email &lt;/a&gt;to the AngularJS Google Group and received a solution: create an htmlTitle directive:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
.directive(&apos;htmlTitle&apos;, function ($sanitize) {
    return {
        restrict: &apos;A&apos;,
        link: function (scope, element, attrs) {
            attrs.$observe(&apos;htmlTitle&apos;, function (title) {
                // convert &amp;amp;value; to HTML
                var html = angular.element(&apos;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&apos;).html($sanitize(title)).text();
                element.attr(&apos;title&apos;, html);
                element.html(html);
            });
        }
    }
})
&lt;/pre&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;div class=&quot;title events&quot; ng-bind-html=&quot;widget.title&quot; html-title=&quot;{{widget.title}}&quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;h3 id=&quot;dragndrop&quot;&gt;Drag-and-Drop&lt;/h3&gt;
&lt;p&gt;To implement drag-and-drop functionality, I originally used jQuery UI&apos;s &lt;a href=&quot;http://jqueryui.com/sortable/&quot;&gt;sortable&lt;/a&gt;. At the bottom of the page, the following code initialized sorting for the various lists:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
$(document).ready(function() {
    $(&apos;.widgets&apos;).sortable({
        cursor: &quot;move&quot;,
        handle: &quot;.heading&quot;
    }).disableSelection();
    $(&apos;.tiles,.tasks&apos;).sortable();
    var carousel = $(&apos;.carousel&apos;);
    $(carousel).carousel({
        interval: 0
    });
};
&lt;/pre&gt;
&lt;p&gt;As you can see, it also initializes the carousel and stops it from cycling automatically.&lt;/p&gt;
&lt;h3 id=&quot;carousel-issues&quot;&gt;Carousel Issues&lt;/h3&gt;
&lt;p&gt;The first problem I ran into with Bootstrap&apos;s Carousel was a strange error from Highcharts. If you look in the above HTML, you&apos;ll see there&apos;s a &lt;code&gt;&amp;lt;chart&amp;gt;&lt;/code&gt; element. This is processed by a &lt;a href=&quot;https://github.com/rootux/angular-highcharts-directive/blob/master/src/directives/highchart.js&quot;&gt;highcharts directive&lt;/a&gt;. When I tried to use this directive for Highcharts in a carousel, it results in the following error:&lt;/p&gt;
&lt;p class=&quot;alert alert-error&quot;&gt;
TypeError: Cannot read property &apos;length&apos; of undefined at Object.ob.setMaxTicks
&lt;/p&gt;
&lt;p&gt;This seemed to be caused by the following css in Bootstrap:&lt;/p&gt;
&lt;pre class=&quot;brush: css&quot;&gt;
.carousel-inner &gt; .item { display: none }
&lt;/pre&gt;
&lt;p&gt;When I added an override with &quot;display: block&quot; to my stylesheet, everything worked, but the charts were stacked instead of in a carousel. To fix this, I modified the directive to show/hide the &quot;item&quot; element so Highcharts was able to write to it. I also &lt;a href=&quot;https://github.com/rootux/angular-highcharts-directive/issues/1&quot;&gt;logged an issue&lt;/a&gt; for this.&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
if (element.parent().not(&apos;:visible&apos;)) {
    element.parent().show();
}
var chart = new Highcharts.Chart(newSettings);
element.parent().attr(&apos;style&apos;, &apos;&apos;);
&lt;/pre&gt;
&lt;h3 id=&quot;grouping&quot;&gt;ngRepeat and Grouping&lt;/h3&gt;
&lt;p&gt;The last thing I accomplished in our end-of-January prototype was rendering 2 charts side-by-side. I got it working with plain HTML, created a &quot;groupBy&quot; filter for Angular and tried to get it to work with the following:&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;div id=&quot;chartCarousel&quot; class=&quot;carousel slide&quot;&amp;gt;
    &amp;lt;ol class=&quot;carousel-indicators&quot;&amp;gt;
        &amp;lt;li data-target=&quot;#chartCarousel&quot; ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | groupBy&quot;
            data-slide-to=&quot;{{$index}}&quot; ng-class=&quot;{active: $index == 0}&quot;&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ol&amp;gt;
    &amp;lt;div class=&quot;carousel-inner&quot;&amp;gt;
        &amp;lt;div class=&quot;item&quot; ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | groupBy&quot; ng-class=&quot;{active: $index == 0}&quot;&amp;gt;
            &amp;lt;div class=&quot;widget&quot;&amp;gt;{{widget&amp;#91;0&amp;#93;.title}}&amp;lt;/div&amp;gt;
            &amp;lt;div class=&quot;widget&quot;&amp;gt;{{widget&amp;#91;1&amp;#93;.title}}&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;a class=&quot;left carousel-control&quot; href=&quot;#chartCarousel&quot; data-slide=&quot;prev&quot;&amp;gt;&#8249;&amp;lt;/a&amp;gt;
    &amp;lt;a class=&quot;right carousel-control&quot; href=&quot;#chartCarousel&quot; data-slide=&quot;next&quot;&amp;gt;&#8250;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This all worked like I expected it to in Chrome, but I the following errors showed in my console.&lt;/p&gt;
&lt;p class=&quot;alert alert-error&quot;&gt;
Error: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations:
&lt;/p&gt;
&lt;p&gt;I &lt;a href=&quot;https://groups.google.com/d/topic/angular/gEv1-YV-Ojg/discussion&quot;&gt;sent an email&lt;/a&gt; to the Angular Google Group and received a link to &lt;a href=&quot;https://groups.google.com/d/msg/angular/IEIQok-YkpU/oKuLvzCnAcoJ&quot;&gt;a discussion&lt;/a&gt; where I found a &quot;chunk&quot; filter that solved the problem. This worked great, but I wanted to make it more responsive.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;If the user has a screen size big enough to fit 2 charts, show 2 charts and paginate by 2.&lt;/li&gt;&lt;li&gt;If the user has a small screen size that only fits 1 chart, show 1 and paginate by 1.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;To solve #1 and #2, I ended up rendering two different sections (with classes .oneup and .twoup) and displayed them based on screen size.&lt;/p&gt;
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;li id=&quot;chart-bar&quot;&amp;gt;
    &amp;lt;div class=&quot;heading&quot;&amp;gt;Charts&amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;chartCarousel1&quot; class=&quot;carousel slide oneup&quot; style=&quot;display: none&quot;&amp;gt;
        &amp;lt;ol class=&quot;carousel-indicators&quot;&amp;gt;
            &amp;lt;li data-target=&quot;#chartCarousel1&quot;
                ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | orderBy: &apos;order&apos;&quot;
                data-slide-to=&quot;{{$index}}&quot; ng-class=&quot;{active: $index == 0}&quot;&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ol&amp;gt;
        &amp;lt;div class=&quot;carousel-inner&quot;&amp;gt;
            &amp;lt;div class=&quot;item chart&quot;
                 ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | orderBy: &apos;order&apos;&quot;
                 ng-class=&quot;{active: $index == 0}&quot;&amp;gt;
                &amp;lt;chart class=&quot;widget&quot; value=&quot;{{widget}}&quot; type=&quot;{{widget.chartType}}&quot;&amp;gt;&amp;lt;/chart&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;a class=&quot;left carousel-control&quot; href=&quot;#chartCarousel1&quot; data-slide=&quot;prev&quot;&amp;gt;&#8249;&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;right carousel-control&quot; href=&quot;#chartCarousel1&quot; data-slide=&quot;next&quot;&amp;gt;&#8250;&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&quot;chartCarousel2&quot; class=&quot;carousel slide twoup&quot; style=&quot;display: none&quot;&amp;gt;
        &amp;lt;ol class=&quot;carousel-indicators&quot;&amp;gt;
            &amp;lt;li data-target=&quot;#chartCarousel2&quot;
                ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | chunk: 2 | orderBy: &apos;order&apos;&quot;
                data-slide-to=&quot;{{$index}}&quot; ng-class=&quot;{active: $index == 0}&quot;&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ol&amp;gt;
        &amp;lt;div class=&quot;carousel-inner&quot;&amp;gt;
            &amp;lt;div class=&quot;item chart&quot;
                 ng-repeat=&quot;widget in widgets | filter: {type: &apos;chart&apos;} | chunk: 2 | orderBy: &apos;order&apos;&quot;
                 ng-class=&quot;{active: $index == 0}&quot;&amp;gt;
                &amp;lt;chart class=&quot;widget&quot; value=&quot;{{widget&amp;#91;0&amp;#93;}}&quot; type=&quot;{{widget&amp;#91;0&amp;#93;.chartType}}&quot;&amp;gt;&amp;lt;/chart&amp;gt;
                &amp;lt;chart class=&quot;widget&quot; value=&quot;{{widget&amp;#91;1&amp;#93;}}&quot; type=&quot;{{widget&amp;#91;1&amp;#93;.chartType}}&quot;&amp;gt;&amp;lt;/chart&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;a class=&quot;left carousel-control&quot; href=&quot;#chartCarousel2&quot; data-slide=&quot;prev&quot;&amp;gt;&#8249;&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;right carousel-control&quot; href=&quot;#chartCarousel2&quot; data-slide=&quot;next&quot;&amp;gt;&#8250;&amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The JavaScript to show the correct number of charts is below:&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
var chartBar = $(&apos;#chart-bar&apos;);
function showCharts() {
    if (chartBar.width() &amp;lt; 960) {
        chartBar.find(&apos;.oneup&apos;).show();
        chartBar.find(&apos;.twoup&apos;).hide();
    } else {
        chartBar.find(&apos;.twoup&apos;).show();
        chartBar.find(&apos;.oneup&apos;).hide();
    }
}

$(document).ready(function () {
    showCharts();
});

$(window).resize(showCharts);
&lt;/pre&gt;
&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;
&lt;p&gt;Even though I got everything to work for our initial prototype using Angular and jQuery, it didn&apos;t quite feel like I was taking full advantage of Angular&apos;s power. In particular, I learned that Angular UI Bootstrap had their own carousel and Angular UI had a &lt;em&gt;sortable&lt;/em&gt; directive. My suspicions were confirmed when I read &lt;a href=&quot;http://stackoverflow.com/questions/14994391/how-do-i-think-in-angularjs-if-i-have-a-jquery-background&quot;&gt;How do I &quot;think in AngularJS&quot; if I have a jQuery background?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_with_angularjs_part_ii&quot;&gt;next article&lt;/a&gt;, I&apos;ll talk about how I migrated to use Angular UI&apos;s &lt;a href=&quot;http://angular-ui.github.io/bootstrap/#/carousel&quot;&gt;carousel&lt;/a&gt; and &lt;a href=&quot;https://github.com/angular-ui/ui-sortable&quot;&gt;sortable&lt;/a&gt; directives, as well as integrating dialogs.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/paris_and_iceland_a_photographers</id>
        <title type="html">Paris and Iceland, A Photographer&apos;s Paradise</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/paris_and_iceland_a_photographers"/>
        <published>2013-04-12T10:31:24-06:00</published>
        <updated>2022-03-30T17:21:09-06:00</updated> 
        <category term="/General" label="General" />
        <category term="trish" scheme="http://roller.apache.org/ns/tags/" />
        <category term="photos" scheme="http://roller.apache.org/ns/tags/" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxxfrance" scheme="http://roller.apache.org/ns/tags/" />
        <category term="iceland" scheme="http://roller.apache.org/ns/tags/" />
        <category term="paris" scheme="http://roller.apache.org/ns/tags/" />
        <category term="northernlights" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
    In February 2012, Trish and I &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_spectacular_trip_to_stockholm&quot;&gt;traveled
    to
    Stockholm&lt;/a&gt; on &lt;a href=&quot;http://www.icelandair.com/&quot;&gt;Icelandair&lt;/a&gt;. We were immediately impressed with the
    airline&apos;s
    excellent service. Trish was also a bit miffed that we had a layover in Iceland without an opportunity to get out
    and see the sites. You see, Iceland is a Photographer&apos;s Paradise, and she&apos;s &lt;a href=&quot;http://mcginityphoto.com&quot;&gt;the
    best photographer I know&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This year, when planning our trip to &lt;a href=&quot;http://www.devoxx.com/display/FR13/Home&quot;&gt;Devoxx
    France&lt;/a&gt;, I set out to correct this missed opportunity. Since Icelandair now flies direct from Denver, and offers
    &lt;a href=&quot;http://www.icelandair.us/flights/stopover/&quot;&gt;free stopovers&lt;/a&gt;, our planning was easy.

&lt;p&gt;The conference was in Paris; one of the most magnificent cities to photograph. Trish has some &lt;a
        href=&quot;http://raibledesigns.com/rd/entry/our_engaging_trip_to_paris&quot;&gt;great photos&lt;/a&gt; from 2011.
    She&apos;ll be showing many of these photos at an upcoming exhibit at &lt;a href=&quot;http://www.parisontheplatte.com/&quot;&gt;Paris
        on the Platte&lt;/a&gt; in Denver. However, she wanted more. &lt;/p&gt;

&lt;p&gt;We arrived in Paris for Devoxx France on Tuesday, March
    26th. The first day&apos;s excursion started with visiting the Latin Quarter, the
    &lt;a href=&quot;http://en.wikipedia.org/wiki/Panth%C3%A9on,_Paris&quot;&gt;Panth&#233;on&lt;/a&gt; and &lt;a
            href=&quot;http://en.wikipedia.org/wiki/Notre_Dame,_Paris&quot;&gt;Notre Dame&lt;/a&gt;.

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8614984919/&quot;
       href=&quot;http://farm9.staticflickr.com/8249/8614984919_b14ea344b1_c.jpg&quot;
       title=&quot;Panth&#233;on in the evening by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8249/8614984919_b14ea344b1_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Panth&#233;on in the evening&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616096172/&quot;
       href=&quot;http://farm9.staticflickr.com/8105/8616096172_c91693d33b_c.jpg&quot;
       title=&quot;Panth&#233;on with Bus by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8105/8616096172_c91693d33b_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Panth&#233;on with Bus&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8614993061/&quot;
       href=&quot;http://farm9.staticflickr.com/8114/8614993061_86f3943c3e_c.jpg&quot;
       title=&quot;Notre Dame Paris along the Seine River France by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8114/8614993061_86f3943c3e.jpg&quot; width=&quot;500&quot; height=&quot;333&quot;
            alt=&quot;Notre Dame Paris along the Seine River France&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

&lt;p&gt;We had a nice dinner that evening while watching the F&#250;tbol match between France and Spain. 

    On Wednesday, we hung around the hotel in the morning, then took the metro to

    &lt;a href=&quot;http://www.sacre-coeur-montmartre.com/&quot;&gt;La Basilique du Sacr&#233; Coeur de Montmartre&lt;/a&gt; and &lt;a
        href=&quot;http://www.moulinrouge.fr/&quot;&gt;Moulin Rouge&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8596700115/&quot;
       href=&quot;http://farm9.staticflickr.com/8509/8596700115_ffe355a2d5_c.jpg&quot;
       title=&quot;La Basilique du Sacr&#233; Coeur de Montmartre by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8509/8596700115_ffe355a2d5.jpg&quot; width=&quot;500&quot; height=&quot;333&quot;
            alt=&quot;La Basilique du Sacr&#233; Coeur de Montmartre&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    From there, we journeyed to the &lt;a href=&quot;http://www.tour-eiffel.fr/&quot;&gt;Eiffel
    Tower&lt;/a&gt; for a hike. We climbed the stairs to the second floor and enjoyed the spectacular view.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mraible/8614863403/&quot;
       href=&quot;http://farm9.staticflickr.com/8541/8614863403_c7322a15f6_c.jpg&quot;
       title=&quot;View of Paris from Tour Eiffel by mraible, on Flickr&quot;  rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8541/8614863403_c7322a15f6.jpg&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;
            width=&quot;500&quot; height=&quot;375&quot;
            alt=&quot;View of Paris from Tour Eiffel&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Wednesday evening, we attended the Devoxx Speakers Dinner. We had a great time chatting and drinking wine with Martin Odersky, Guillaume Bort, the many Nicolas&apos;, James Ward and Josh Long.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8596698839/&quot;
       href=&quot;http://farm9.staticflickr.com/8112/8596698839_8c875527a9_c.jpg&quot;
       title=&quot;Nicolas&apos; by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8112/8596698839_8c875527a9_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Nicolas&apos;&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8597803538/&quot; href=&quot;http://farm9.staticflickr.com/8096/8597803538_7289136aca_c.jpg&quot;
       title=&quot;Martin and Nicolas by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8096/8597803538_7289136aca_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Martin and Nicolas&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8597803622/&quot; href=&quot;http://farm9.staticflickr.com/8382/8597803622_71348066a3_c.jpg&quot;
       title=&quot;Guillaume Bort and Martin Odersky by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8382/8597803622_71348066a3_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Guillaume Bort and Martin Odersky&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8596699105/&quot; href=&quot;http://farm9.staticflickr.com/8380/8596699105_36dda11ab6_c.jpg&quot; title=&quot;Shenanigans :) by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8380/8596699105_36dda11ab6_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Shenanigans :)&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;On Thursday, I delivered my talk on Comparing JVM Web Frameworks in the early afternoon and did
    Play vs. Grails Smackdown with &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt; in the evening. I published an
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;article about these talks&lt;/a&gt;
    the next day.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8611595635/&quot;
       href=&quot;http://farm9.staticflickr.com/8100/8611595635_1e71e66358_c.jpg&quot;
       title=&quot;James Ward and I at Devoxx France by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8100/8611595635_1e71e66358_n.jpg&quot; width=&quot;320&quot; height=&quot;213&quot;
            alt=&quot;James Ward and I at Devoxx France&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;While I was talking about frameworks, Trish was galavanting around Paris taking some amazing photos.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8615035109/&quot;
       href=&quot;http://farm9.staticflickr.com/8108/8615035109_cb5d88a4ed_c.jpg&quot;
       title=&quot;Our Lady Liberty and Eiffel Tower by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8108/8615035109_cb5d88a4ed_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot;
            alt=&quot;Our Lady Liberty and Eiffel Tower&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616147874/&quot;
       href=&quot;http://farm9.staticflickr.com/8543/8616147874_8e0de9d7aa_c.jpg&quot;
       title=&quot;Boats Seine River Eiffel Tower by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8543/8616147874_8e0de9d7aa_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot;
            alt=&quot;Boats Seine River Eiffel Tower&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8615047387/&quot;
       href=&quot;http://farm9.staticflickr.com/8384/8615047387_93155b7fcc_c.jpg&quot;
       title=&quot;R&#233;cipon Quadrigas France by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8384/8615047387_93155b7fcc_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot;
            alt=&quot;R&#233;cipon Quadrigas France&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616151686/&quot;
       href=&quot;http://farm9.staticflickr.com/8266/8616151686_89d7bfdf75_c.jpg&quot;
       title=&quot;Statue Of LaFayette Cours La Reine Paris Frances by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8266/8616151686_89d7bfdf75_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot;
            alt=&quot;Statue Of LaFayette Cours La Reine Paris Frances&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616154162/&quot;
       href=&quot;http://farm9.staticflickr.com/8393/8616154162_6c320aa1f9_c.jpg&quot;
       title=&quot;Pont Alexandre III Bridge Paris by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8393/8616154162_6c320aa1f9_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot;
            alt=&quot;Pont Alexandre III Bridge Paris&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Thursday night, we had a wonderfully authentic French dinner with many of the folks from the conference. Around
    midnight, Trish captured the beauty of &lt;a href=&quot;http://en.wikipedia.org/wiki/Les_Invalides&quot;&gt;Les Invalides&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8611599727/&quot; href=&quot;http://farm9.staticflickr.com/8384/8611599727_d7a7d5ae51_c.jpg&quot;
       title=&quot;Les Invalides by Night by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8384/8611599727_d7a7d5ae51.jpg&quot; width=&quot;500&quot; height=&quot;195&quot;
            alt=&quot;Les Invalides by Night&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;On Friday, we slept in a bit and then headed to the airport for our flight to Iceland. A few hours later, we were
    snuggled into the cozy bar at &lt;a href=&quot;http://www.hotelcentrum.is/&quot;&gt;Hotel Reykjavik Centrum&lt;/a&gt;. A few hours after
    that
    and we were bouncing up and down on a &lt;a href=&quot;http://superjeep.is/&quot;&gt;Super Jeep&lt;/a&gt; tour to see the Northern Lights.
    Our
    driver kept telling us &quot;if you believe, it will happen&quot;. And boy oh boy, did it ever. The green and purple lights
    dancing in the sky overhead were mind-blowing!

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616423743/&quot;
       href=&quot;http://farm9.staticflickr.com/8519/8616423743_6d17a98e9e_c.jpg&quot;
       title=&quot;Northern Lights 12 by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8519/8616423743_6d17a98e9e_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Northern Lights 12&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8617530704/&quot;
       href=&quot;http://farm9.staticflickr.com/8122/8617530704_4bc892702a_c.jpg&quot;
       title=&quot;Northern Lights 13 by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8122/8617530704_4bc892702a_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Northern Lights 13&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8617531184/&quot;
       href=&quot;http://farm9.staticflickr.com/8262/8617531184_a688cb0f88_c.jpg&quot;
       title=&quot;Northern Lights 19 by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8262/8617531184_a688cb0f88_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Northern Lights 19&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8617531254/&quot;
       href=&quot;http://farm9.staticflickr.com/8383/8617531254_6cb60b329a_c.jpg&quot;
       title=&quot;Northern Lights 20 by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8383/8617531254_6cb60b329a_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot;
            alt=&quot;Northern Lights 20&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Saturday came quickly after a late night, and we opted for a scenic tour of the area &lt;a
        href=&quot;http://helicoptericeland.is/&quot;&gt;by helicopter&lt;/a&gt;.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616233884/&quot;
       href=&quot;http://farm9.staticflickr.com/8123/8616233884_e332e31cd8_c.jpg&quot;
       title=&quot;Bird&apos;s eye view of the Reykjavik Iceland Opera House overlooking the bay and Mountains by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8123/8616233884_e332e31cd8_m.jpg&quot; width=&quot;160&quot; height=&quot;240&quot;
            alt=&quot;Bird&apos;s eye view of the Reykjavik Iceland Opera House overlooking the bay and Mountains&quot;
            style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8615137705/&quot;
       href=&quot;http://farm9.staticflickr.com/8103/8615137705_070c4bd5a0_c.jpg&quot;
       title=&quot;Glymur Falls by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8103/8615137705_070c4bd5a0_m.jpg&quot; width=&quot;154&quot; height=&quot;240&quot;
            alt=&quot;Glymur Falls&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8615149011/&quot;
       href=&quot;https://live.staticflickr.com/8524/8615149011_028218b720_c.jpg&quot;
       title=&quot;Matt and me and our Pilot Eggert with our Bell by McGinityPhoto, on Flickr&quot;
       rel=&quot;lightbox[paris-iceland-2013]&quot;&gt;&lt;img
            src=&quot;https://live.staticflickr.com/8524/8615149011_028218b720.jpg&quot; width=&quot;500&quot; height=&quot;333&quot;
            alt=&quot;Matt and me and our Pilot Eggert with our Bell&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;Saturday evening, we &lt;a
        href=&quot;http://www.getyourguide.com/reykjavik-l30/iceland-brewery-tour-a-journey-through-the-ages-t6043/&quot;&gt;journeyed
    through the ages&lt;/a&gt; with a tour and tasting at the &lt;a href=&quot;http://www.olgerdin.is/English/Products/Brewery/&quot;&gt;Icelandic
    brewery &#214;lger&#240;in&lt;/a&gt;. The &lt;a
        href=&quot;http://www.tripadvisor.com/Restaurant_Review-g189970-d2371613-Reviews-Grillmarkadurinn_The_Grill_Market-Reykjavik_Capital_Region.html&quot;&gt;Grillmarkadurinn&lt;/a&gt;
    restaurant
    afterward was delicious.
&lt;/p&gt;
&lt;p&gt;Easter Sunday was our last day in Iceland and we enjoyed most of it at the &lt;a href=&quot;http://www.bluelagoon.com/&quot;&gt;Blue
    Lagoon&lt;/a&gt;. Despite the plethora of tourists, the hot springs, saunas and cold beer were a lovely way to prepare for
    the long road home.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616267880/&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;
       href=&quot;http://farm9.staticflickr.com/8243/8616267880_a3545602e9_c.jpg&quot;
       title=&quot;Blue Lagoon Rocks! by McGinityPhoto, on Flickr&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8243/8616267880_a3545602e9_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot;
            alt=&quot;Blue Lagoon Rocks!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8616268748/&quot; rel=&quot;lightbox[paris-iceland-2013]&quot;
       href=&quot;http://farm9.staticflickr.com/8537/8616268748_022161dd45_c.jpg&quot;
       title=&quot;Great Road in Iceland by McGinityPhoto, on Flickr&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8537/8616268748_022161dd45_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot;
            alt=&quot;Great Road in Iceland&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Visiting Iceland and photographing the &lt;a href=&quot;http://en.wikipedia.org/wiki/Aurora_(astronomy)&quot;&gt;Aurora Borealis&lt;/a&gt;
    was an awesome experience. Speaking at Devoxx France, photographing Paris and having lots of good times with new
    (and old) friends was equally delightful. For more pictures of our travels, see &lt;a
        href=&quot;http://www.flickr.com/photos/mraible/sets/72157633151396495/&quot;&gt;my Paris and Iceland
    Album&lt;/a&gt; or Trish&apos;s &lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157633110741364/&quot;&gt;Devoxx France&lt;/a&gt;,
    &lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157633162412201/&quot;&gt;Iceland&lt;/a&gt; or &lt;a
        href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157633161145490/&quot;&gt;Northern Lights&lt;/a&gt; albums.
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/happy_10_year_appfuse</id>
        <title type="html">Happy 10 Year AppFuse!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/happy_10_year_appfuse"/>
        <published>2013-04-05T08:56:45-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="anniversary" scheme="http://roller.apache.org/ns/tags/" />
        <category term="10years" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//raw.github.com/appfuse/appfuse/master/www/logo/appfuse_72_transparent.gif&quot; width=&quot;72&quot; height=&quot;72&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
10 years ago yesterday, I released the &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;first version of AppFuse&lt;/a&gt;. It started with XDoclet generating ActionForms from POJOs and became very popular for Struts developers that wanted to use Hibernate. The project&apos;s popularity peaked in 2006, as you can see from the mailing list traffic below.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.markmail.org&quot; title=&quot;AppFuse Mailing List Traffic&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8251/8621164287_0acb4af5de.jpg&quot; width=&quot;500&quot; height=&quot;162&quot; alt=&quot;AppFuse Mailing List Traffic&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It&apos;s possible the decrease in traffic is because we re-wrote everything to be based on Maven. It&apos;s also possible it was because of more attractive full-stack frameworks like &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_vs_grails_vs_rails&quot;&gt;Grails and Rails&lt;/a&gt;. However, the real reason is likely that I stopped working on it all the time due to &lt;span style=&quot;text-decoration: line-through&quot;&gt;getting a divorce&lt;/span&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/5_years&quot;&gt;becoming an awesome dad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a timeline of how the project evolved over its first 4 years.&lt;/p&gt;
&lt;p style=&quot;text-align: center; background: white&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-history.png&quot; rel=&quot;lightbox[appfuse-10yr]&quot; title=&quot;AppFuse History: 2003 - 2007&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-history.png&quot; alt=&quot;AppFuse History: 2003 - 2007&quot; width=&quot;500&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;AppFuse has been a great project for me to work on and it&apos;s been a large source of my knowledge about Java, Web Frameworks, Spring, Hibernate - as well as build systems like Ant and Maven. We started with CVS, moved to SVN and now we&apos;re &lt;a href=&quot;http://github.com/appfuse&quot;&gt;on GitHub&lt;/a&gt;. We&apos;ve experienced &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;migrating from Tapestry 4 to Tapestry 5&lt;/a&gt; (thanks Serge Eby!), upgrading to &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_to_jsf_2&quot;&gt;JSF 2&lt;/a&gt; and enjoyed the backwards compatibility of Spring and Struts 2 throughout the years. We&apos;ve also added REST support, a Web Services archetype and kept up with the latest Spring and Hibernate releases.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.org/download/attachments/84/appfuse-history2.png?version=1&amp;amp;modificationDate=1356633078000&quot; rel=&quot;lightbox[appfuse-10yr]&quot; title=&quot;AppFuse History: 2007 - 2013&quot;&gt;&lt;img src=&quot;//appfuse.org/download/attachments/84/appfuse-history2.png?version=1&amp;amp;modificationDate=1356633078000&quot; width=&quot;500&quot; alt=&quot;AppFuse History: 2007 - 2013&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last year, we &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;added Bootstrap and jQuery&lt;/a&gt; as foundational front-end frameworks. For our next release, we&apos;re &lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to&quot;&gt;switching to PrimeFaces&lt;/a&gt;, adding Wicket and changing from jMock to Mockito. Most of these changes are already in source control, we just need to polish them up a bit and add &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Maven+Plugin&quot; title=&quot;AppFuse Maven Plugin&quot;&gt;AMP&lt;/a&gt; support. I hope to release 3.0 &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157633155884796/&quot;&gt;before the bus is done&lt;/a&gt;. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to all the enthusiastic users of and contributors to AppFuse over the years. It&apos;s been a great ride! </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/devoxx_france_a_great_conference</id>
        <title type="html">Devoxx France: A Great Conference in a Magnificent City</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/devoxx_france_a_great_conference"/>
        <published>2013-03-29T13:14:30-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="paradoxofchoice" scheme="http://roller.apache.org/ns/tags/" />
        <category term="trish" scheme="http://roller.apache.org/ns/tags/" />
        <category term="france" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxxfr" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/8614997207/&quot; title=&quot;Red Eiffel flowers by McGinityPhoto, on Flickr&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8386/8614997207_7320dec749_t.jpg&quot; width=&quot;66&quot; height=&quot;100&quot; alt=&quot;Red Eiffel flowers&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

This week, my &lt;a href=&quot;http://mcginityphoto.com&quot;&gt;lovely fianc&#233;&lt;/a&gt; and I traveled to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Paris&quot;&gt;City of Light&lt;/a&gt;. Our journey was designed around some speaking engagements at Devoxx France. Devoxx is one of my favorite conference franchises and Devoxx France has been special to me ever since the Devoxx (Belgium) I spoke at in 2011. 
&lt;/p&gt;
&lt;p&gt;
2011 was the year I spoke about &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_html5_with_play_scala&quot;&gt;my experience with Play, Scala, CoffeeScript and Jade&lt;/a&gt;. I wrote the presentation on my flight over, composed the demo video the night before and made it all happen in the nick of time. Of course, this was after 120 hours of research and preparation, so the presentation composition process had all the data I needed. You can imagine my sense of relief after pulling off that talk and getting an enthusiastic applause from the audience for my efforts. 
&lt;/p&gt;
&lt;p&gt;
One of the first audience questions I received was from &lt;a href=&quot;https://twitter.com/nmartignole&quot;&gt;Nicolas Martignole&lt;/a&gt;, asking if I&apos;d speak at Devoxx France the following year. I whole-heartedly agreed to do it and was excited for the opportunity. It was with great disappointment that I later found out I couldn&apos;t attend Devoxx France in 2012. My client didn&apos;t like me taking so much time off and I agreed to scale my two week vacation back to &lt;a href=&quot;http://raibledesigns.com/rd/entry/cruising_around_the_western_caribbean&quot;&gt;1 week&lt;/a&gt;. This year, I was determined to go, so I submitted some of my favorite talks: Comparing JVM Web Frameworks and The Play vs. Grails Smackdown with &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt;. I was extremely pleased when they both got accepted.
&lt;/p&gt;
&lt;p&gt;
Side Story: I met Martin Odersky shortly when he sat down next to me for the Java Posse presentation in Belgium in 2011. After shaking his hand and introducing myself, I had to politely ask him to leave because it was Trish&apos;s seat. Talk about awkward; but Martin was very gracious and promptly found a new seat close by.
&lt;/p&gt;
&lt;p id=&quot;comparing-jvm-web-frameworks&quot;&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/The_Paradox_of_Choice:_Why_More_Is_Less&quot; title=&quot;The Paradox of Choice&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8102/8600235023_dc4753c0aa_t.jpg&quot; width=&quot;65&quot; height=&quot;100&quot; alt=&quot;The Paradox of Choice&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
&lt;strong&gt;Comparing JVM Web Frameworks&lt;/strong&gt;&lt;br/&gt;
Both talks required a bit of updating. For Comparing JVM Web Frameworks, I started reading &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Paradox_of_Choice:_Why_More_Is_Less&quot;&gt;The Paradox of Choice&lt;/a&gt; and found many parallels to the agony that developers experience with choosing a web framework. I described how I didn&apos;t think good framework decisions were based on the many, many features that frameworks have, but often on pre-defined constraints. There&apos;s those lucky developers that get to choose a Full Stack Framework because they&apos;re doing greenfield development. Then there&apos;s those that want a better &lt;em&gt;Pure&lt;/em&gt; Web Framework that replaces something (e.g. Struts) that&apos;s not satisfying their needs. And lastly, there&apos;s those that&apos;ve found it possible to leverage a &lt;abbr title=&quot;Service Oriented Front End Architecture&quot;&gt;SOFEA&lt;/abbr&gt; and use a JavaScript MVC framework with an API Framework on the backend. I don&apos;t think it makes sense to compare &lt;em&gt;all&lt;/em&gt; web frameworks and I tried to use these pre-defined constraints (language, platform and application type) argument to separate into categories and help make choosing easier. 
&lt;/p&gt;
&lt;p&gt;
I took out the parts of the presentation that&apos;ve pissed people off in the past - particular the JSF bashing by James Gosling, the Rails gushing from Craig McClanahan and the Pros and Cons sections of each framework. I added the &lt;a href=&quot;https://www.flickr.com/photos/mraible/8588701778&quot;&gt;history of web frameworks&lt;/a&gt; and research from &lt;a href=&quot;http://www.infoq.com/research/jvm-web-frameworks&quot;&gt;InfoQ&lt;/a&gt; and &lt;a href=&quot;http://devrates.com/project/list?query=%5Bweb+framework%5D&quot;&gt;devrates.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-url=&quot;http://www.flickr.com/photos/mraible/8588701778/&quot; href=&quot;https://farm9.staticflickr.com/8529/8588701778_91aeb65377_o.png&quot; title=&quot;History of Web Frameworks 2013&quot; rel=&quot;lightbox[devoxxfr-2013]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8529/8588701778_0fb17b5612.jpg&quot; width=&quot;500&quot; height=&quot;223&quot; alt=&quot;History of Web Frameworks 2013&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The best part of the JVM Web Frameworks talk was the audience&apos;s reaction and enthusiasm. Devoxx always seems to attract passionate developers and Devoxx France was no different. Developers packing the room, clapping after your intro, laughing at your jokes, signifying that they agree with you about JSF. As a speaker, it&apos;s an unbelievable experience.
&lt;/p&gt;
&lt;p&gt;
You can view my Comparing JVM Web Frameworks presentation below or &lt;a href=&quot;http://www.slideshare.net/mraible/comparing-jvm-web-frameworks-devoxx-france-2013&quot;&gt;on Slideshare.net&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/17868398?rel=0&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt; &lt;/iframe&gt;
&lt;/p&gt;
&lt;p id=&quot;play-vs-grails-smackdown&quot;&gt;&lt;strong&gt;Play Frameworks vs. Grails Smackdown&lt;/strong&gt;&lt;br/&gt;
To prepare for James Ward and my Play vs. Grails Smackdown, we had a number of goals. First of all, we wanted to update our apps to use the latest versions of each framework. I &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_grails_from_2_0&quot;&gt;documented what it took for Grails&lt;/a&gt;, James just &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/6b674e6b8998b0996869cf510dae71a199deec07&quot;&gt;checked in his code&lt;/a&gt; to GitHub. It was interesting to see that Grails 2.0.3 -&gt; 2.2.1 caused a number of issues with testing, while Play 2.0.3 -&gt; Play 2.1.0 required API changes, but nothing for tests. Secondly, we &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/43795059fcd3d321ab93ea14dc149a3c762daf47&quot;&gt;updated all the stats&lt;/a&gt; for our pretty graphs and &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/9654e74e61c03ccd916ee839885503e206339c81&quot;&gt;ran load tests again&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
This is where the fun started. On Tuesday evening, I decided to challenge the notion that Play was twice as fast as Grails. James had proven this with &lt;a href=&quot;http://httpd.apache.org/docs/2.2/programs/ab.html&quot;&gt;Apache Bench&lt;/a&gt; tests. With Play 2.0 and Grails 2.0 (last summer), we clocked Play at 251/requests per second and 198 for Grails. After upgrading each app to the latest releases, we found the numbers to be 233/second for Play and 118 for Grails. 
&lt;/p&gt;
&lt;p&gt;
However, Apache Bench only tests until the first byte is received. Since I&apos;ve done a lot of browser optimizations recently, I fired up &lt;a href=&quot;http://whichloadsfaster.com&quot;&gt;whichloadsfaster.com&lt;/a&gt;, captured a screenshot and &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/5e867a85279d4be0736c4843704646d55e7eacd7&quot;&gt;added it to our presentation&lt;/a&gt;. The next day, James &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/1f15b8c06a5b7b298b111f263f3c26197fbee096&quot;&gt;added a CDN&lt;/a&gt; and a &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/ab532444258f494d40a7126716c6ac7190b80a98&quot;&gt;bunch of caching&lt;/a&gt; to his app and re-ran his AB tests. 
&lt;/p&gt;
&lt;p&gt;
Now he was &lt;em&gt;smoking&lt;/em&gt; Grails, so I &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/ea911b60e17837a6d6b5359e1e616bec43013ddd&quot;&gt;added a CDN&lt;/a&gt; and &lt;a href=&quot;https://github.com/jamesward/happytrails/commit/da776a16ce6ac17eb65d66cb8a206b18a44a6536&quot;&gt;caching&lt;/a&gt; as well. However, the best I could do was just over 1000/requests per second, while he was around 2200/second. When he ran live tests during our talk, Play was around 2800/sec and Grails was around 900.
&lt;/p&gt;
&lt;p&gt;
It was great to see how much better performance we could get with caching and a CDN. The best part is this should be available to most applications, not just these frameworks. By adding a CDN (we used Amazon CloudFront) and caching, we were both able to 10x the performance of our apps. You can find our presentation &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Play_vs_Grails_Smackdown_DevoxxFrance2013/&quot;&gt;here&lt;/a&gt; or view it below.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//static.raibledesigns.com/repository/presentations/Play_vs_Grails_Smackdown_DevoxxFrance2013/&quot; width=&quot;500&quot; height=&quot;375&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen style=&quot;border:1px solid #CCC;margin-bottom:5px&quot;&gt; &lt;/iframe&gt;
&lt;/p&gt;

&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
This was a very enjoyable conference to attend as a speaker. First of all, it was in one of the most beautiful cities in the world, but it&apos;s also a very special place for Trish and I. &lt;a href=&quot;http://raibledesigns.com/rd/entry/our_engaging_trip_to_paris&quot;&gt;We got engaged just outside of Paris in Versailles&lt;/a&gt; after the &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_html5_with_play_scala&quot;&gt;last Devoxx conference&lt;/a&gt; I spoke at. Trish has some &lt;a href=&quot;http://www.mcginityphoto.com/Other/MattandTrishengagementPhotos&quot;&gt;amazing photos&lt;/a&gt; from that trip. Secondly, the Devoxx conference attracts a special kind of developer - one that is passionate about and eager for knowledge. Lastly, speaking with my good friend James, in an exotic city about something we love - that was special. Asking for beers and having them brought to us at the start of our Smackdown. That was magical (thanks Nicolas!). 
&lt;/p&gt;
&lt;p&gt;
To all the Devoxx organizers and crew - well done on a great show!&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/upgrading_grails_from_2_0</id>
        <title type="html">Upgrading Grails from 2.0 to 2.2</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/upgrading_grails_from_2_0"/>
        <published>2013-03-22T09:16:37-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="smackdown" scheme="http://roller.apache.org/ns/tags/" />
        <category term="upgrade" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://grails.org&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/grails-logo-20130322.png&quot; alt=&quot;Grails&quot; width=&quot;166&quot; height=&quot;39&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;/&gt;&lt;/a&gt;
In preparation for my &lt;a href=&quot;http://www.devoxx.com/display/FR13/Play+Framework+vs.+Grails+Smackdown&quot;&gt;Grails vs. Play Smackdown&lt;/a&gt; at &lt;a href=&quot;http://www.devoxx.com/display/FR13/Home&quot;&gt;Devoxx France&lt;/a&gt; next week, I recently upgraded my &lt;a href=&quot;https://github.com/jamesward/happytrails/tree/grails2&quot;&gt;Grails version&lt;/a&gt; of Happy Trails from Grails 2.0.3 to Grails 2.2.1. I ran into a few issues along the way and figured I&apos;d document them here to help others out.
&lt;/p&gt;
&lt;p id=&quot;source&quot;&gt;&lt;strong&gt;Fixing the source&lt;/strong&gt;&lt;br/&gt;The first issue I ran into was Spock and Groovy 2 incompatibilities. &lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
| Resolving plugin JAR dependencies
| Error WARNING: Dependencies cannot be resolved for plugin [mail] due to error: startup failed:
Could not instantiate global transform class org.spockframework.compiler.SpockTransform specified at jar:file:/Users/mraible/.grails/ivy-cache/org.spockframework/spock-core/jars/spock-core-0.7-groovy-1.8.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation  because of exception org.spockframework.util.IncompatibleGroovyVersionException: The Spock compiler plugin cannot execute because Spock 0.7.0-groovy-1.8 is not compatible with Groovy 2.0.7. For more information, see http://versioninfo.spockframework.org
&lt;/pre&gt;
&lt;p&gt;I &lt;a href=&quot;http://stackoverflow.com/questions/15410368/upgrading-from-grails-2-0-3-to-2-2-1-server-access-error-connection-refused&quot;&gt;posted the problem to StackOverflow&lt;/a&gt; and got a response almost immediately. While &lt;a href=&quot;https://github.com/geb/geb-example-grails/pull/7/files&quot;&gt;this pull request&lt;/a&gt; helped me quite a bit, it was ultimately caused by my vision: I had two &quot;geb-spock&quot; dependencies listed in &lt;em&gt;BuildConfig.groovy&lt;/em&gt; with different groupIds.&lt;/p&gt;
&lt;p&gt;At this point, I also moved all my plugin dependencies from &lt;em&gt;application.properties&lt;/em&gt; to &lt;em&gt;BuildConfig.groovy&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The next problem I ran into was &lt;a href=&quot;http://stackoverflow.com/questions/15413701/upgrading-from-grails-2-0-3-to-2-2-1-tests-failing&quot;&gt;a unit test and functional tests failing&lt;/a&gt;. The unit testing issue was caused by my Direction model not being in the tests @Mock annotation. After I added it, validation kicked and I recognized my test was invalid. I added @Ignore and continued.&lt;/p&gt;
&lt;p&gt;The functional test seemed to be seemed to be caused by Geb and it trying to use the Chrome Driver. One of my tests didn&apos;t work with the default HtmlUnitDriver, so I used the ChromeDriver for the one test.&lt;/p&gt;
&lt;pre&gt;
| Running 11 spock tests... 6 of 11
| Failure:  signup as a new user(happytrails.AuthenticatedUserSpec)
|  org.openqa.selenium.WebDriverException: Unable to either launch or connect to Chrome. Please check that ChromeDriver is up-to-date. Using Chrome binary at: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 45.66 seconds
Build info: version: &apos;2.27.0&apos;, revision: &apos;18259&apos;, time: &apos;2012-12-05 11:30:53&apos;
System info: os.name: &apos;Mac OS X&apos;, os.arch: &apos;x86_64&apos;, os.version: &apos;10.8.2&apos;, java.version: &apos;1.7.0_04&apos;
Driver info: org.openqa.selenium.chrome.ChromeDriver
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:187)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:533)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:216)
    at org.openqa.selenium.remote.RemoteWebDriver.&lt;init&gt;(RemoteWebDriver.java:111)
    at org.openqa.selenium.remote.RemoteWebDriver.&lt;init&gt;(RemoteWebDriver.java:115)
    at org.openqa.selenium.chrome.ChromeDriver.&lt;init&gt;(ChromeDriver.java:161)
    at org.openqa.selenium.chrome.ChromeDriver.&lt;init&gt;(ChromeDriver.java:107)
    at happytrails.AuthenticatedUserSpec.signup as a new user(AuthenticatedUserSpec.groovy:25)
&lt;/pre&gt;
&lt;p&gt;Even when running &quot;grails -Dgeb.env=chrome test-app&quot;, this still happened. This was caused by the fact that I had &lt;em&gt;GebConfig.groovy&lt;/em&gt; in test/functional/happytrails. Move it to test/functional solved the problem. I also discovered that I know longer needed Chrome to get this test to pass. Apparently, the &lt;a href=&quot;http://fbflex.wordpress.com/2013/03/18/how-to-configure-webdriver-in-grails-for-your-geb-tests/&quot;&gt;HtmlUnitDriver has issues with Grails 2.2&lt;/a&gt;, but it seems to work for me.&lt;/p&gt;
&lt;p&gt;After getting the Geb configuration fixed, I ran into a functional test failure:&lt;/p&gt;
&lt;pre&gt;
| Running 11 spock tests... 5 of 11
| Failure:  click signup link(happytrails.AuthenticatedUserSpec)
|  org.openqa.selenium.ElementNotVisibleException: Element must be displayed to click (WARNING: The server did not provide any stacktrace information)
&lt;/pre&gt;
&lt;p&gt;Even though I could see the &quot;signup&quot; link when I ran &quot;grails run-app&quot;, I could see that it didn&apos;t show up when running tests in Chrome. This turned out to be caused by an extraneous &lt;code&gt;&amp;lt;div class=&quot;nav-collapse&quot;&gt;&lt;/code&gt; I had in my main.gsp. Removing it solved the problem. It&apos;s strange that this never showed up with Grails 2.0. My only guess is that Geb someone didn&apos;t look at the visibility of the element.&lt;/p&gt;
&lt;p&gt;The last testing-related issue I ran into was a &lt;code&gt;InvalidElementStateException&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;
| Running 11 spock tests... 7 of 11
| Failure:  add new route to region(happytrails.AuthenticatedUserSpec)
|  org.openqa.selenium.InvalidElementStateException: Element must be user-editable in order to clear it. (WARNING: The server did not provide any stacktrace information)
&lt;/pre&gt;
&lt;p&gt;I was able to fix this by changing &lt;em&gt;AddRoutePage.groovy&lt;/em&gt; from:&lt;/p&gt;
&lt;pre class=&quot;brush: groovy&quot;&gt;
static content = {
    createButton(to: ShowRoutePage) { create() }
    name { value(&quot;Name&quot;) }
    distance { value(&quot;Distance&quot;) }
    location { value(&quot;Location&quot;) }
}
&lt;/pre&gt;
&lt;p&gt;To:&lt;/p&gt;
&lt;pre class=&quot;brush: groovy&quot;&gt;
static content = {
    createButton(to: ShowRoutePage) { create() }
    form { $(&quot;form&quot;) }
}
&lt;/pre&gt;
&lt;p&gt;And then referencing name, distance and location accordingly (form.name, etc.) in &lt;em&gt;AuthenticatedUserSpec.groovy&lt;/em&gt;.&lt;/p&gt;
&lt;p id=&quot;cloudbees&quot;&gt;&lt;strong&gt;CloudBees&lt;/strong&gt;&lt;br/&gt;
After I had everything working locally, I logged into Jenkins on &lt;a href=&quot;http://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;. Since I hadn&apos;t used it in a while, I had to wait a bit while my Jenkins server was re-commissioned. Once it was up, I tried to select Grails 2.2.1 to build with, but found it wasn&apos;t available. After a &lt;a href=&quot;https://twitter.com/mraible/status/312636120112431104&quot;&gt;tweeting this&lt;/em&gt;, I learned about &lt;a href=&quot;http://grails.org/doc/2.1.0/ref/Command%20Line/wrapper.html&quot;&gt;Grails Wrapper&lt;/a&gt;, found that the latest Grails Jenkins plugin supported it and got everything working. I later discovered that CloudBees does support Grails 2.2.1, I just needed to setup another Grails installation to automatically download and install 2.2.1.&lt;/p&gt;
&lt;p id=&quot;heroku&quot;&gt;&lt;strong&gt;Heroku&lt;/strong&gt;&lt;br/&gt;
The last two issues I ran into were with Heroku. Since I was upgrading everything, I wanted Grails to build/run under Java 7 and use Servlet 3. I changed the appropriate properties in &lt;em&gt;BuildConfig.groovy&lt;/em&gt;, &lt;a href=&quot;https://devcenter.heroku.com/articles/add-java-version-to-an-existing-maven-app&quot;&gt;configured Heroku&lt;/a&gt; and deployed. No dice.&lt;/p&gt;
&lt;pre&gt;
Error Compilation error: startup failed:
Invalid commandline usage for javac.
javac: invalid source release: 1.7
Usage: javac &lt;options&gt; &lt;source files&gt;
use -help for a list of possible options
&lt;/pre&gt;
&lt;p&gt;Sidenote: I tried building with Java 8 on CloudBees, but discovered the searchable plugin doesn&apos;t support it.&lt;/p&gt;
&lt;pre&gt;
Compile error during compilation with javac.
/scratch/jenkins/workspace/Happy Trails - Grails 2/work/plugins/searchable-0.6.4/src/java/grails/plugin/searchable/internal/compass/index/DefaultUnindexMethod.java:94: error: reference to delete is ambiguous
                    session.delete(query);
                           ^
  both method delete(CompassQuery) in CompassOperations and method delete(CompassQuery) in CompassIndexSession match
&lt;/pre&gt;
&lt;p&gt;As far as Servlet 3, it was pretty obvious that the Jetty version Heroku uses for Grails doesn&apos;t support it. Therefore, I reverted back to Servlet 2.5.&lt;/p&gt;
&lt;pre&gt;
java.lang.NoClassDefFoundError: javax/servlet/AsyncContext
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2444)
&lt;/pre&gt;
&lt;p&gt;I sent the Java 7 issue to Heroku Support a few days ago but haven&apos;t heard back yet.&lt;/p&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
While upgrading Grails from 2.0 to 2.2 wasn&apos;t as easy as expected, it is understandable. After all, Grails 2.2 ships with Groovy 2.0, which has a &lt;a href=&quot;http://www.infoq.com/articles/new-groovy-20&quot;&gt;bunch of new features&lt;/a&gt; itself. All the issues I ran into were fairly easy to solve, except for Java 7 on Heroku. But hey, what do you expect from a free hosting service?&lt;/p&gt;
&lt;p&gt;If you&apos;re at Devoxx France next week, I look forward to &lt;a href=&quot;http://www.devoxx.com/display/FR13/Play+Framework+vs.+Grails+Smackdown&quot;&gt;sharing our research&lt;/a&gt; on Grails 2.2.1 vs. Play 2.1.0. </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/how_do_you_choose_web</id>
        <title type="html">How do you choose web framework candidates to compare?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/how_do_you_choose_web"/>
        <published>2013-03-18T12:10:14-06:00</published>
        <updated>2013-03-18T18:12:30-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="comparison" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://blog.websitesframeworks.com/about-us/&quot;&gt;David D&#237;az Clavijo&lt;/a&gt; sent me an email a couple weeks ago asking me about comparing web frameworks. 
David is a computer engineering student at the University of Las Palmas de Gran Canaria (ULPGC) in the Canary Islands, Spain. His FYP (Final Year Project) is a web frameworks comparison focused on high productivity frameworks. He&apos;s started a &lt;a href=&quot;http://blog.websitesframeworks.com/&quot;&gt;blog&lt;/a&gt; to help facilitate his work and has been writing some interesting posts. &lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;
Four frameworks will be compared. The comparison test is composed by &lt;strong&gt;four fixed time tasks&lt;/strong&gt; for each framework:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learning the programming language&lt;/strong&gt;: 5 hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Making exercises in the programming language&lt;/strong&gt;: 15 hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning the framework&lt;/strong&gt;: 25 hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developing the website&lt;/strong&gt;: 50 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
After all process is done, it can be seen which framework presented a higher productivity and smaller learning curve.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
We have decided a cross-language set of frameworks which are: &lt;strong&gt;Ruby on Rails, Grails, Django and Code Igniter&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Today, he wrote about &lt;a href=&quot;http://blog.websitesframeworks.com/2013/03/web-frameworks-selected-to-be-compared-236/&quot;&gt;the web frameworks he&apos;s decided to compare&lt;/a&gt; and inspired me to respond to his original request for my thoughts. &lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Hello David,&lt;br/&gt;&lt;br/&gt;
Sorry it took me so long to respond. I think your approach as far as learning the language, making exercises, learning the framework and developing the website is good. As you know, the last one you develop with will likely do well because you&apos;re repeated the steps so much with the other ones.
&lt;br/&gt;&lt;br/&gt;
However, there&apos;s one thing I think you&apos;re doing wrong. In the real world, I don&apos;t believe that an architect would look at *all* the available web frameworks and choose one. I believe most of them already have a language bias or there&apos;s a target platform (e.g. LAMP, JVM, etc.). 
&lt;br/&gt;&lt;br/&gt;
I believe the majority of development happens today where a platform is already in place. Even moreso, the backend may already be in place and the company is simply trying to find a more productive front-end framework. In the first instance, where the platform is already chosen, the chooser&apos;s options are immediately limited. For example, if it&apos;s the JVM, Django might be eliminated because JPython isn&apos;t that up-to-snuff or widely used (this could be changing). However, it could be said that all the frameworks you&apos;ve chosen (including Code Igniter) can run on the JVM.
&lt;br/&gt;&lt;br/&gt;
I just don&apos;t see people identifying web frameworks across such a wide variety of languages. I think folks generally choose a platform, then a language, then a framework. It&apos;s possible that startups will do it differently by choosing a language first. However, I imagine most startups have a technical founder that already has some preference towards a particular language.
&lt;/p&gt;
&lt;p&gt;Now it&apos;s your turn, dear readers. Have you ever been in a situation where you&apos;ve been able to pick a web framework across all languages? Did any of your biases enter into the equation? &lt;/p&gt;
&lt;p&gt;How would you recommend David go about choosing web framework candidates?&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/integrating_gwt_into_appfuse</id>
        <title type="html">Integrating GWT into AppFuse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/integrating_gwt_into_appfuse"/>
        <published>2013-03-07T18:49:28-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;https://developers.google.com/web-toolkit/images/gwt-logo.png&quot;&gt;&lt;img src=&quot;//developers.google.com/web-toolkit/images/gwt-logo.png&quot; class=&quot;picture&quot;  height=&quot;100&quot; width=&quot;100&quot;&gt;&lt;/a&gt;
I&apos;ve been interested in integrating &lt;a href=&quot;https://developers.google.com/web-toolkit/&quot;&gt;GWT&lt;/a&gt; into &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; ever since &lt;a href=&quot;http://raibledesigns.com/rd/entry/gwt_and_appfuse&quot;&gt;I blogged about it 4 years ago&lt;/a&gt;. A few months after that post, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt&quot;&gt;Enhancing Evite.com with GWT and Grails&lt;/a&gt;. After Evite, I had a gig near Boston where I developed with GXT for the remainder of the year. When all was said and done, I ended up spending a year with GWT and really enjoyed my experience. I haven&apos;t used it much since.&lt;/p&gt;
&lt;p&gt;GWT is &lt;a href=&quot;http://appfuse.org/display/APF/Roadmap&quot;&gt;scheduled to be integrated into AppFuse&lt;/a&gt; in version 4.0. That&apos;s quite a ways off. The good news is you might not have to wait that long, thanks to &lt;a href=&quot;https://github.com/ivangsa&quot;&gt;Iv&#225;n Garc&#237;a Sainz-Aja&lt;/a&gt;. Iv&#225;n let us know about his work a couple weeks ago in an &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Creating-a-new-archetype-td4656359.html&quot;&gt;email to the appfuse-dev&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p&gt;
It&apos;s still work in progress but it has already most of AppFuse functionality.. 
&lt;/p&gt;&lt;p&gt;
If you want to give it a try 
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;https://github.com/ivangsa/appfuse.git&quot;&gt;https://github.com/ivangsa/appfuse.git&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
the quickest way to have a go would be&lt;/p&gt;
&lt;pre&gt;
web/gwt&gt; mvn -P gwtDebug -Dgwt.inplace=true gwt:compile jetty:run  
&lt;/pre&gt;
&lt;p&gt;
at the moment it still requires this fork of gwt-bootstrap to be compiled first 
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;https://github.com/ivangsa/gwt-bootstrap.git&quot;&gt;https://github.com/ivangsa/gwt-bootstrap.git&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
It needs a lot of testing yet but it&apos;s getting quite there 
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As you can imagine, I was very excited to hear about Iv&#225;n&apos;s work. So I cloned his repo, built gwt-bootstrap locally and checked it out. Functionality wise, it was great! However, when I dug into the source code, I found a whole lotta code. 
&lt;/p&gt;
&lt;p&gt;
To see how the GWT flavor compared to the other implementations in AppFuse, I &lt;a href=&quot;https://gist.github.com/mraible/5033218&quot;&gt;created a cloc report&lt;/a&gt; on the various web frameworks in AppFuse. I&apos;m sure these reports could be adjusted to be more accurate, but I believe they give a good general overview. I posted some graphs that displays my findings in visual form.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm9.staticflickr.com/8090/8538497066_be60cb73da_o.png&quot; title=&quot;Lines of Java&quot; rel=&quot;lightbox[appfuse-loc]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8090/8538497066_4f2a6ff71e_m.jpg&quot; width=&quot;240&quot; height=&quot;189&quot; alt=&quot;Lines of Java&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm9.staticflickr.com/8235/8537391497_deaa49c22d_o.png&quot; title=&quot;Number of Files by mraible, on Flickr&quot; rel=&quot;lightbox[appfuse-loc]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8235/8537391497_3bbafe2383_m.jpg&quot; width=&quot;240&quot; height=&quot;189&quot; alt=&quot;Number of Files&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;When I sent this to the mailing list, Ivan &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Creating-a-new-archetype-tt4656359.html#a4656374&quot;&gt;responded that it was a lot of code&lt;/a&gt; and estimated &lt;em&gt;12 new files&lt;/em&gt; would be needed to &lt;abbr title=&quot;Create, Retrieve, Update, Delete&quot;&gt;CRUD&lt;/a&gt; an entity. This sure seems like a lot to me, but he &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/GWT-RESTFull-backend-tt4656418.html&quot;&gt;defended this yesterday&lt;/a&gt; and noted that his implementation follows many of GWT&apos;s latest best 
practices: MVP pattern, Activities and Places, EventBus, Gin and Guice. He also shared a &lt;a href=&quot;https://github.com/ivangsa/appfuse/wiki&quot;&gt;wiki page&lt;/a&gt; with explanations and diagrams of how things work.&lt;/p&gt;
&lt;p&gt;The reason I&apos;m writing this post is to get more feedback on this implementation. First of all, &lt;em&gt;does GWT really require this much code&lt;/em&gt;? Secondly, are there other GWT implementations that reduce a lot of the boilerplate? &lt;a href=&quot;https://code.google.com/p/smartgwt/&quot;&gt;SmartGWT&lt;/a&gt;, &lt;a href=&quot;https://vaadin.com/home&quot;&gt;Vaadin&lt;/a&gt;* and &lt;a href=&quot;http://www.jboss.org/errai&quot;&gt;Errai&lt;/a&gt; come to mind. 
&lt;/p&gt;
&lt;p&gt;If you were starting a new GWT project and using AppFuse, how would &lt;em&gt;you&lt;/em&gt; want it implemented?&lt;/p&gt;
&lt;p style=&quot;font-size: .9em; border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;* Vaadin 7 claims it &lt;a href=&quot;http://www.infoq.com/news/2013/02/vaadin-7&quot;&gt;can be used as a drop-in replacement for GWT&lt;/a&gt;. I tried &lt;a href=&quot;https://gist.github.com/mraible/5113636&quot;&gt;replacing the gwt-servlet and gwt-user dependencies&lt;/a&gt; with Vaadin&apos;s, but it &lt;a href=&quot;https://gist.github.com/mraible/5113607&quot;&gt;didn&apos;t work&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_s_the_best_way4</id>
        <title type="html">What&apos;s the best way to compare JVM Web Frameworks?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_s_the_best_way4"/>
        <published>2013-01-09T08:29:17-07:00</published>
        <updated>2013-01-14T15:03:01-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dzone" scheme="http://roller.apache.org/ns/tags/" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
I&apos;ve been comparing web frameworks ever since 2004. It was the first time I&apos;d ever proposed a talk for a conference. ApacheCon was in Vegas that year and my buddy Bruce suggested I speak at it. I submitted the talk, &lt;a href=&quot;http://raibledesigns.com/rd/entry/going_to_apachecon&quot;&gt;got accepted&lt;/a&gt; and went to work learning the frameworks I was talking about. At the time, I had a lot of Struts experience and I&apos;d made a good living learning it, consulting on it and blogging about it. However, there was a new kid on the block (Spring MVC) that was garnishing attention and some other frameworks (WebWork and Tapestry) that had a lot of high praise from developers. I was inspired to learn why so many people hated Struts. 
&lt;/p&gt;
&lt;p&gt;
Fast forward 8 years and I&apos;m still comparing web frameworks. Why? Because there still seems to be a large audience that&apos;s interested in the topic. Witness InfoQ&apos;s &lt;a href=&quot;http://www.infoq.com/research/jvm-web-frameworks&quot;&gt;Top 20 JVM Web Frameworks&lt;/a&gt;, which was one of their most-read articles for two months in a row. One of the beauties of the Java Community is that it&apos;s very diverse. There&apos;s &lt;em&gt;tons&lt;/em&gt; of folks that are part of this community and, like it or not, several folks that are &lt;em&gt;former&lt;/em&gt; Java Developers. However, these developers still seem to maintain an interest in the community and it&apos;s still one of the largest pools of talent out there. Java is still &lt;a href=&quot;http://redmonk.com/sogrady/2012/02/08/language-rankings-2-2012/&quot;&gt;quite viable&lt;/a&gt; and only seems to be &lt;a href=&quot;http://frankhinkel.blogspot.de/2012/11/java-8-closures-lambda-expressions.html&quot;&gt;getting better with age&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
So the topic of web frameworks on the JVM is still hot, and I still &lt;a href=&quot;http://raibledesigns.com/rd/entry/why_the_bias_against_jsf&quot;&gt;like to write about it&lt;/a&gt;. For those of you still enthusiastic about the topic, you&apos;re in luck. The two best websites for the Java Community, &lt;a href=&quot;http://infoq.com&quot;&gt;InfoQ&lt;/a&gt; and &lt;a href=&quot;http://java.dzone.com&quot;&gt;DZone&lt;/a&gt; (formerly Javalobby) are still very interested in the topic too!&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
I&apos;ve been comparing web frameworks ever since 2004. It was the first time I&apos;d ever proposed a talk for a conference. ApacheCon was in Vegas that year and my buddy Bruce suggested I speak at it. I submitted the talk, &lt;a href=&quot;http://raibledesigns.com/rd/entry/going_to_apachecon&quot;&gt;got accepted&lt;/a&gt; and went to work learning the frameworks I was talking about. At the time, I had a lot of Struts experience and I&apos;d made a good living learning it, consulting on it and blogging about it. However, there was a new kid on the block (Spring MVC) that was garnishing attention and some other frameworks (WebWork and Tapestry) that had a lot of high praise from developers. I was inspired to learn why so many people hated Struts.
&lt;/p&gt;
&lt;p&gt;
Fast forward 8 years and I&apos;m still comparing web frameworks. Why? Because there still seems to be a large audience that&apos;s interested in the topic. Witness InfoQ&apos;s &lt;a href=&quot;http://www.infoq.com/research/jvm-web-frameworks&quot;&gt;Top 20 JVM Web Frameworks&lt;/a&gt;, which was one of their most-read articles for two months in a row. One of the beauties of the Java Community is that it&apos;s very diverse. There&apos;s &lt;em&gt;tons&lt;/em&gt; of folks that are part of this community and, like it or not, several folks that are &lt;em&gt;former&lt;/em&gt; Java Developers. However, these developers still seem to maintain an interest in the community and it&apos;s still one of the largest pools of talent out there. Java is still &lt;a href=&quot;http://redmonk.com/sogrady/2012/02/08/language-rankings-2-2012/&quot;&gt;quite viable&lt;/a&gt; and only seems to be &lt;a href=&quot;http://frankhinkel.blogspot.de/2012/11/java-8-closures-lambda-expressions.html&quot;&gt;getting better with age&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
So the topic of web frameworks on the JVM is still hot, and I still &lt;a href=&quot;http://raibledesigns.com/rd/entry/why_the_bias_against_jsf&quot;&gt;like to write about it&lt;/a&gt;. For those of you still enthusiastic about the topic, you&apos;re in luck. The two best websites for the Java Community, &lt;a href=&quot;http://infoq.com&quot;&gt;InfoQ&lt;/a&gt; and &lt;a href=&quot;http://java.dzone.com&quot;&gt;DZone&lt;/a&gt; (formerly Javalobby) are still very interested in the topic too!&lt;/p&gt;
&lt;!--p style=&quot;font-style: italic&quot;&gt;Sorry &lt;a href=&quot;http://theserverside.com&quot;&gt;TheServerSide.com&lt;/a&gt;, you were awesome at one time. Remember when Dion was pumping out the good content and there weren&apos;t ads in your face? Those where the days...&lt;/p--&gt; 
&lt;p&gt;
Both sites emailed me in November to get my advice for their research on the subject. InfoQ (specifically Dio Synodinos) was mostly interested in 1) having me analyze &lt;a href=&quot;http://www.infoq.com/research/jvm-web-frameworks&quot;&gt;their recently-gathered data&lt;/a&gt;, or 2) helping them create a new version. DZone (specifically Mitch Pronschinske) emailed about doing a similar survey to InfoQ&apos;s, but with more relevant data points (include GWT, specifying Struts 2 vs. Struts 1, etc.).
&lt;/p&gt;
&lt;p&gt;
My response to Mitch at DZone:
&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p&gt;
Interestingly enough, the folks at InfoQ contacted me as well as they&apos;re thinking of doing a new survey. One of the things I mentioned to them is it&apos;d be interesting to see what folks are using AND which frameworks they admire. Often, devs don&apos;t get to choose their web framework at work. I wonder if it&apos;d be possible to collaborate with InfoQ to gather data from developers so it&apos;s not being done on two different sites?
&lt;/p&gt;
&lt;p&gt;
I submitted a talk for ApacheCon NA (in February) called Comparing Apache Web Frameworks. When choosing Web Frameworks, I&apos;ve often found it helps to eliminate frameworks and narrow the scope. Obviously, this makes sense for an Apache Conference, but not for all developers. However, I do plan on analyzing each framework based on a limited set of criteria. Here&apos;s what I have so far:
&lt;/p&gt;
&lt;p&gt;
Community, HTML5, REST, Mobile, Performance, Web Performance Optimization
&lt;/p&gt;
&lt;p&gt;
Obviously, community is important for Apache projects, but might not be for the wider audience. It might be good to limit to these 5 criteria, or expand it to 10, but not more. I think it&apos;d be interesting to get the community to rank the various frameworks on these criteria, and also try to find developer&apos;s biases while doing it. For example, I wonder if people would be willing to admit they&apos;re biased for/against certain frameworks and then take that into account as part of gathering the data?&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately, ApacheCon denied my submission. This make sense since their &lt;a href=&quot;http://na.apachecon.com/schedule/&quot;&gt;schedule&lt;/a&gt; seems to be concentrating on &lt;a href=&quot;http://httpd.apache.org/&quot;&gt;HTTPD&lt;/a&gt;, &lt;a href=&quot;http://incubator.apache.org/cloudstack/&quot;&gt;Cloud&lt;/a&gt; and &lt;a href=&quot;http://hadoop.apache.org/&quot;&gt;Big Data&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
For InfoQ, Dio asked for a list of web frameworks to include. Below is a list we started with, followed by my response.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring MVC&lt;/li&gt;
&lt;li&gt;Play&lt;/li&gt;
&lt;li&gt;Grails&lt;/li&gt;
&lt;li&gt;JSF&lt;/li&gt;
&lt;li&gt;Struts 2&lt;/li&gt;
&lt;li&gt;Wicket&lt;/li&gt;
&lt;li&gt;Lift&lt;/li&gt;
&lt;li&gt;Tapestry 5&lt;/li&gt;
&lt;li&gt;Seam&lt;/li&gt;
&lt;li&gt;JRuby on Rails&lt;/li&gt;
&lt;li&gt;Wicket&lt;/li&gt;
&lt;li&gt;GWT&lt;/li&gt;
&lt;li&gt;Vaadin&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p&gt;
I would add Stripes, vert.x and maybe something like Apache Click. VRaptor is probably a good one to add too. There&apos;s always a few less-used frameworks that get a lot of complainers if you don&apos;t include them. 
&lt;/p&gt;
&lt;p&gt;
Comparing to your previous list, I don&apos;t think Seam should be in here since they&apos;ve &lt;a href=&quot;http://www.infoq.com/news/2012/04/seam-deltaspike&quot;&gt;split the project into separate bundles&lt;/a&gt; and are no longer developing Seam as a whole. JRuby on Rails is a tough one because if you say Ruby on Rails, you&apos;ll get a ton of responses, but probably not from the Java community. The Ruby community might chime it quite a bit if you can get in touch with them though.
&lt;/p&gt;
&lt;p&gt;
I believe you should include Clojure web frameworks, but I&apos;ve only heard of one of them: Compojure.
&lt;/p&gt;
&lt;p&gt;
SiteMesh, Netty, etc. - remove them.
&lt;/div&gt;
&lt;p&gt;
I also offered my advice on instructions:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I actually like the two coordinates you used before, importance and adoptability. However, I don&apos;t know that everyone read the instructions this way. Most people didn&apos;t rank all frameworks and I believe that&apos;s part of the point. I only ranked the ones I&apos;d used, but I think it&apos;d be better if people ranked all of them. I also think having these two criteria opens it up to more than just developers. Project/Product Managers and stakeholders that&apos;ve been successful with certain frameworks should be able to vote too.
&lt;/p&gt;
&lt;p&gt;
For DZone, they wanted to include a set of criteria for ranking:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project maturity, community support, and documentation quality (one criteria)&lt;/li&gt;
&lt;li&gt;UI Features Capability (maybe some are more graphics driven or form driven?)&lt;/li&gt;
&lt;li&gt;Code readability&lt;/li&gt;
&lt;li&gt;Flexibility (maybe this could be broken down into what types of projects the framework can handle) or several criteria that ask if it is &quot;Good for &apos;x&apos; type of project&quot;&lt;/li&gt;
&lt;li&gt;Performance/Speed&lt;/li&gt;
&lt;li&gt;Cross platform support&lt;/li&gt;
&lt;li&gt;Extensibility, Plugins, Community Libraries&lt;/li&gt;
&lt;li&gt;Architecture (this may just be information for later, not an opinion question)&lt;/li&gt;
&lt;li&gt;Web standards support&lt;/li&gt;
&lt;li&gt;REST support (is this something you would just rate a yes or no?  In that case it wouldn&apos;t need to be an opinion question)&lt;/li&gt;
&lt;li&gt;Mobile support&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
My response:&lt;/p&gt;

&lt;div class=&quot;quote&quot;&gt;
    &lt;p&gt;
For web frameworks, I believe the 5 I mentioned (Community, HTML5, REST, Mobile, Performance, Web Performance Optimization) are most important, with Security become more and more of a concern. For web standards support, I&apos;d almost change it to &quot;HTML5&quot; and to see how the various frameworks stack up. I think REST is very important, and I think it&apos;s cool that Struts 2, Spring MVC and Grails all have great support for it. It&apos;d be interesting to see how the component-based frameworks think of having REST support in the framework (vs. external like Jersey, CXF, etc.).
&lt;/p&gt;&lt;p&gt;
Of the list you provided, I don&apos;t know about Code readability or Flexibility. Code readability is kinda like Learnability. One of the nice things about Spring MVC and Grails is that you can learn how they work very quickly. Then you can use that knowledge and don&apos;t have to look things up much. Tapestry and Wicket might be similar for those writing large apps, but I haven&apos;t found that to be as true. The more traditional MVC Frameworks just make more sense to me.
&lt;/p&gt;
&lt;p&gt;
UI Feature Capability is a good one because frameworks with widgets are often popular with developers. Flex, GWT, jQuery UI, Sencha all do this very well.
&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;summary&quot;&gt;
&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;The reason for this post is to add some transparency to the process of Comparing JVM Web Frameworks. I like to think that I&apos;ve tried to do this in the past (especially with my &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_i_calculated_ratings_for&quot;&gt;reasons for rankings&lt;/a&gt;). Now, we&apos;d like to hear from you, the community that uses these web frameworks. 
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What&apos;s the best way to compare JVM Web Frameworks?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;While it&apos;s nice to hear from the generous folks that create and maintain JVM Web Frameworks, we&apos;re mostly interested in hearing from the developers that are using these things on a day-to-day basis. The Blue Collar Developers, if you will. If you could design a JVM Web Framework comparison that answered your questions, how would it look? What questions would it ask? What conclusions would make you happy? Should commercial frameworks like ZK be included?
    &lt;/p&gt;
    &lt;p&gt;Your responses are very greatly appreciated.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/2012_a_year_in_review</id>
        <title type="html">2012 - A Year in Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/2012_a_year_in_review"/>
        <published>2013-01-08T13:15:24-07:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="2012" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yearinreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <category term="blogging" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;I wrote my first &lt;a href=&quot;http://raibledesigns.com/rd/tags/yearinreview&quot;&gt;year in review&lt;/a&gt; blog entry way back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/2005_a_year_in_review&quot;&gt;2005&lt;/a&gt;. That means this year&apos;s is number 8. Since they keep getting longer every year, I figured I&apos;d try something different this year and use sections similar to &lt;a href=&quot;http://remysharp.com/2012/12/31/my-2012/&quot;&gt;Remy Sharp&lt;/a&gt;. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#professional&quot;&gt;Professional&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#business&quot;&gt;Business&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#speaking&quot;&gt;Speaking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#projects&quot;&gt;Projects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#personal&quot;&gt;Personal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#2013&quot;&gt;2013&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;professional&quot;&gt;Professional&lt;/h2&gt;
&lt;p&gt;I spent the entirety of the year with one client: Taleo. &lt;a href=&quot;http://www.businessweek.com/news/2012-02-10/oracle-buys-taleo-for-1-9-billion-adds-human-resource-tool.html&quot;&gt;Oracle bought them in February&lt;/a&gt;. In June, the transition to Oracle happened. My tasks and projects haven&apos;t changed much since the transition, but it has been a real pain to get paid on time. My contract with them is through the end of May. I hope to take July off (to get married) and August off (to honeymoon) and start a new gig in September.
&lt;/p&gt;
&lt;p&gt;I did minimal Java work throughout the year and spent most of my time doing CSS and JavaScript. I love doing front-end work much more than back-end, so day-to-day, it was very satisfying. 
&lt;/p&gt;</summary>
        <content type="html">I wrote my first &lt;a href=&quot;http://raibledesigns.com/rd/tags/yearinreview&quot;&gt;year in review&lt;/a&gt; blog entry way back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/2005_a_year_in_review&quot;&gt;2005&lt;/a&gt;. That means this year&apos;s is number 8. Since they keep getting longer every year, I figured I&apos;d try something different this year and use sections similar to &lt;a href=&quot;http://remysharp.com/2012/12/31/my-2012/&quot;&gt;Remy Sharp&lt;/a&gt;. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#professional&quot;&gt;Professional&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#business&quot;&gt;Business&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#speaking&quot;&gt;Speaking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#projects&quot;&gt;Projects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#personal&quot;&gt;Personal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/2012_a_year_in_review#2013&quot;&gt;2013&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;professional&quot;&gt;Professional&lt;/h2&gt;
&lt;p&gt;I spent the entirety of the year with one client: Taleo. &lt;a href=&quot;http://www.businessweek.com/news/2012-02-10/oracle-buys-taleo-for-1-9-billion-adds-human-resource-tool.html&quot;&gt;Oracle bought them in February&lt;/a&gt;. In June, the transition to Oracle happened. My tasks and projects haven&apos;t changed much since the transition, but it has been a real pain to get paid on time. My contract with them is through the end of May. I hope to take July off (to get married) and August off (to honeymoon) and start a new gig in September.
&lt;/p&gt;
&lt;p&gt;I did minimal Java work throughout the year and spent most of my time doing CSS and JavaScript. I love doing front-end work much more than back-end, so day-to-day, it was very satisfying. 
&lt;/p&gt;

&lt;h3 id=&quot;business&quot;&gt;Business&lt;/h3&gt;
&lt;p&gt;Raible Designs had a great year, our best ever financially. I hired Trish as an assistant in January, doubling the size of the company. We had our Annual Shareholders Meeting on a &lt;a href=&quot;http://raibledesigns.com/rd/entry/cruising_around_the_western_caribbean&quot;&gt;Disney Cruise&lt;/a&gt; in April. I have no plans to do increase the size of the company in 2013, mostly because I enjoy not having the responsibility of employees. I&apos;ve employed sub-contractors in the past and it always seems to create more of a headache than it&apos;s worth.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.dailymile.com/people/mraible/training/2012/summary&quot; title=&quot;My Daily Mile 2012 Year End Report&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8227/8360832357_858f34a10e_t.jpg&quot; width=&quot;100&quot; height=&quot;52&quot; alt=&quot;Daily Mile 2012 Year End Report&quot; class=&quot;picture&quot;&gt;&lt;/a&gt;
We moved our offices from downtown Littleton to &lt;a href=&quot;http://www.businessatthrive.com/v3/&quot;&gt;Thrive&lt;/a&gt; (in LoDo) last April and I plan on staying there. It&apos;s an easy 6-mile bicycle commute and the guys there have been great to work with. I highly recommend it if you&apos;re looking for co-working space.&lt;/p&gt;

&lt;h3 id=&quot;speaking&quot;&gt;Speaking&lt;/h3&gt;
&lt;p&gt;I spoke at 5 events in 2012:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Silicon Valley Spring User Group on &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_what_s_new_in&quot;&gt;What&apos;s New in Spring 3.1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;JFokus on &lt;a href=&quot;http://raibledesigns.com/rd/entry/comparing_web_frameworks_and_html5&quot;&gt;Comparing Web Frameworks and HTML5 with Play Scala&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Spring I/O on &lt;a href=&quot;http://www.youtube.com/watch?v=QlQMt3W9fpU&quot;&gt;Comparing JVM Web Frameworks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;JavaPosse Roundup on &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_build_a_shot&quot;&gt;How to build a Shot-Ski&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&#220;berConf on &lt;a href=&quot;http://raibledesigns.com/rd/entry/play_vs_grails_smackdown_at&quot;&gt;Play vs. Grails&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Traveling to &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_spectacular_trip_to_stockholm&quot;&gt;Stockholm and Madrid for JFokus and Spring I/O was spectacular&lt;/a&gt;. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
  &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8350765961/&quot; href=&quot;http://farm9.staticflickr.com/8357/8350765961_9eed5c5ee8.jpg&quot; title=&quot;James Ward and Enno Runne by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8357/8350765961_9eed5c5ee8_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;James Ward and Enno Runne by Trish McGinity&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8351826862/&quot; href=&quot;http://farm9.staticflickr.com/8233/8351826862_87c90d6990.jpg&quot; title=&quot;Juergen Hoeller&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8233/8351826862_87c90d6990_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Juergen Hoeller&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8351825042/&quot; href=&quot;http://farm9.staticflickr.com/8227/8351825042_0a15401fa8.jpg&quot; title=&quot;Speakers Dinner Singers by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8227/8351825042_0a15401fa8_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Speakers Dinner Singers&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8351823962/&quot; href=&quot;http://farm9.staticflickr.com/8091/8351823962_5b8c06859f.jpg&quot; title=&quot;Matt Raible James Ward Rickard Oberg Jfokus speakers dinner by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8091/8351823962_5b8c06859f_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Matt Raible James Ward Rickard Oberg Jfokus speakers dinner&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8351907734/&quot; href=&quot;http://farm9.staticflickr.com/8191/8351907734_28c5dd5e83.jpg&quot; title=&quot;Stockholm View by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8191/8351907734_28c5dd5e83.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Stockholm View&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;/p&gt;
    
    &lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8355701252/&quot; href=&quot;http://farm9.staticflickr.com/8509/8355701252_3f507c646a.jpg&quot; title=&quot;Templo de Debod by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8509/8355701252_3f507c646a.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Templo de Debod&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;&lt;/p&gt;
    
    &lt;p style=&quot;text-align: center&quot;&gt;

    &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8351930566/&quot; href=&quot;http://farm9.staticflickr.com/8366/8351930566_bb5f27f19a.jpg&quot; title=&quot;Iglesia San Gines by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8366/8351930566_bb5f27f19a_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;Iglesia San Gines&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8355691858/&quot; href=&quot;http://farm9.staticflickr.com/8050/8355691858_8878582d57.jpg&quot; title=&quot;Evening Commute Puerta de Alcala Madrid by Trish McGinity&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8050/8355691858_8878582d57_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;Evening Commute Puerta de Alcala Madrid&quot; style=&quot;margin-left: 15px; border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;/p&gt;
    
    
&lt;p&gt;I took the 2nd half of the year off from speaking, celebrating my temporary retirement at a &lt;a href=&quot;http://twitter.com/mraible/status/217459157689831424&quot;&gt;Def Leppard concert&lt;/a&gt; in June. When I decided to do this, I was planning on my VW Bus being finished. I was planning on switching from Java Conferences to VW Shows as a hobby. Unfortunately, now it&apos;s January and &lt;a href=&quot;http://raibledesigns.com/roller-ui/authoring/preview/rd/category/The+Bus&quot;&gt;The Bus&lt;/a&gt; still isn&apos;t done. I have high hopes for it being finished in 2013.
&lt;/p&gt;
&lt;p&gt;I paid for 2 conferences in 2012, the &lt;a href=&quot;http://raibledesigns.com/rd/entry/spring_break&quot;&gt;JavaPosse Roundup&lt;/a&gt; in March and &lt;a href=&quot;http://monktoberfest.com/&quot;&gt;Monktoberfest&lt;/a&gt; in October. While I enjoyed both, Monktoberfest will likely become a tradition. 
&lt;/p&gt;
&lt;h3 id=&quot;projects&quot;&gt;Projects&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AppFuse:&lt;/strong&gt; I started the year by &lt;a href=&quot;http://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with&quot;&gt;refreshing AppFuse&apos;s UI with Twitter Bootstrap&lt;/a&gt; and blogged about the &lt;a href=&quot;http://raibledesigns.com/rd/entry/twitter_s_open_source_summit&quot;&gt;Twitter&apos;s Summit on Bootstrap&lt;/a&gt; shortly after. At the same time, I was overhauling &lt;a href=&quot;http://raibledesigns.com/rd/entry/refreshing_taleo_s_ui_with&quot;&gt;Taleo&apos;s UI with HTML5, Bootstrap and CSS3&lt;/a&gt;, but waited until August to blog about it.&lt;/p&gt;
&lt;p&gt;In the fall, the AppFuse Team &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search&quot;&gt;migrated to GitHub and integrated Hibernate Search&lt;/a&gt;. &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;AppFuse 2.2.1 was released&lt;/a&gt; in December.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Happy Trails:&lt;/strong&gt; In May and June, I worked on &lt;a href=&quot;https://github.com/jamesward/happytrails&quot;&gt;Happy Trails&lt;/a&gt; with James Ward as part of our &lt;a href=&quot;http://raibledesigns.com/rd/entry/play_vs_grails_smackdown_at&quot;&gt;Play vs. Grails Smackdown&lt;/a&gt;. This was a very enjoyable experience and I learned a lot about GitHub, Cloudbees and Heroku. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Play More:&lt;/strong&gt; In June, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_to_play_2_anorm&quot;&gt;Upgrading to Play 2: Anorm and Testing&lt;/a&gt;. A couple weeks later, I wrote about integrating &lt;a href=&quot;http://raibledesigns.com/rd/entry/migrating_to_play_2_and&quot;&gt;Validation and Secure Social&lt;/a&gt; into &lt;a href=&quot;http://play-more.com&quot;&gt;&lt;em&gt;Play More&lt;/em&gt;&lt;/a&gt;. In the aforementioned post, I also posted my &lt;a href=&quot;http://www.slideshare.net/mraible/html5-with-play-scala-coffeescript-and-jade-uberconf-2012&quot;&gt;&#220;berConf presentation&lt;/a&gt;, the &lt;a href=&quot;https://github.com/mraible/play-more&quot;&gt;source code&lt;/a&gt; and my thoughts on Play 2.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I found Anorm and Scalate to be &lt;em&gt;huge&lt;/em&gt; time sinks and don&apos;t know if I&apos;d recommend using either one in a Play 2 project. I&apos;m sure Scalate will be easier to use as its Play 2 integration gets more refined, but I don&apos;t know if there&apos;s any hope for a JDBC abstraction that doesn&apos;t produce error messages when things go south.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Roller:&lt;/strong&gt; Although I didn&apos;t contribute much to &lt;a href=&quot;http://roller.apache.org&quot;&gt;Apache Roller&lt;/a&gt; in 2012, I do continue to use it frequently. This site celebrated its &lt;a href=&quot;http://raibledesigns.com/rd/entry/10_years_ago&quot;&gt;10-year anniversary&lt;/a&gt; in August. It got a &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_look_and_feel_designed&quot;&gt;new look and feel&lt;/a&gt; shortly after.&lt;/p&gt; 
&lt;h2 id=&quot;personal&quot;&gt;Personal&lt;/h2&gt;
&lt;p&gt;Last year was a fantastic year for family time. Our &lt;a href=&quot;http://raibledesigns.com/rd/entry/cruising_around_the_western_caribbean&quot;&gt;cruise around the Western Caribbean&lt;/a&gt; was money well spent.&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8358223863/&quot; href=&quot;http://farm9.staticflickr.com/8092/8358223863_5b7c2d31eb.jpg&quot; title=&quot;Raible&apos;s and McGinity&apos;s welcome to our Disney Cruise! by Trish, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8092/8358223863_5b7c2d31eb.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Raible&apos;s and McGinity&apos;s welcome to our Disney Cruise!&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/8358600474/&quot; href=&quot;http://farm9.staticflickr.com/8213/8358600474_ea26b2cc90.jpg&quot; title=&quot;Raible and McGinity dinner by Trish, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8213/8358600474_ea26b2cc90.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;Raible and McGinity dinner&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;p&gt;My goal was to spend a month with my parents this year and we satisfied that by July. In total, we enjoyed their company for 8 weeks in 2012. 
&lt;/p&gt;
&lt;p&gt;
The worst ski season on record &lt;a href=&quot;http://raibledesigns.com/rd/entry/farewell_to_the_2011_2012&quot;&gt;ended in April&lt;/a&gt; and Trish and I headed for &lt;a href=&quot;http://raibledesigns.com/rd/entry/wine_tasting_in_napa_valley&quot;&gt;wine country&lt;/a&gt; in May.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://www.mcginityphoto.com/photos/i-cDtj2v6/1/M/i-cDtj2v6-M.jpg&quot; rel=&quot;lightbox[2012yearinreview]&quot; title=&quot;Cade Vineyard Cave Table&quot;&gt;
    &lt;img alt=&quot;Cade Vineyard Cave Table&quot; src=&quot;//www.mcginityphoto.com/photos/i-cDtj2v6/1/Th/i-cDtj2v6-Th.jpg&quot; width=&quot;150&quot; height=&quot;100&quot;  alt=&quot;Cade Vineyard Cave Table&quot; style=&quot;border: 1px solid black&quot;&gt;
    &lt;/a&gt;
    
    &lt;a href=&quot;http://www.mcginityphoto.com/photos/i-mCJJZR3/0/M/i-mCJJZR3-M.jpg&quot; rel=&quot;lightbox[2012yearinreview]&quot; title=&quot;Cade Vineyard Cask Row&quot;&gt;
    &lt;img src=&quot;//www.mcginityphoto.com/photos/i-mCJJZR3/0/Th/i-mCJJZR3-Th.jpg&quot; width=&quot;150&quot; height=&quot;99&quot;  alt=&quot;Cade Vineyard Cask Row&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;&gt;&lt;/a&gt;
    
    &lt;a href=&quot;http://www.mcginityphoto.com/photos/i-r4fmDX2/0/M/i-r4fmDX2-M.jpg&quot; rel=&quot;lightbox[2012yearinreview]&quot; title=&quot;Cade Flowers next to infinity pool&quot;&gt;
    &lt;img alt=&quot;Cade Flowers next to infinity pool&quot; src=&quot;//www.mcginityphoto.com/photos/i-r4fmDX2/0/Th/i-r4fmDX2-Th.jpg&quot; width=&quot;150&quot; height=&quot;100&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://www.mcginityphoto.com/photos/i-R9tmTz4/0/M/i-R9tmTz4-M.jpg&quot; rel=&quot;lightbox[2012yearinreview]&quot; title=&quot;Cade Winery&quot;&gt;
    &lt;img alt=&quot;Cade Winery&quot; src=&quot;//www.mcginityphoto.com/photos/i-R9tmTz4/0/S/i-R9tmTz4-S.jpg&quot; width=&quot;400&quot; height=&quot;266&quot; title=&quot;Cade Winery&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    
    &lt;/p&gt;
    
    &lt;/p&gt;
    &lt;p&gt;Abbie and Jack&apos;s school year &lt;a href=&quot;http://raibledesigns.com/rd/entry/school_s_out_for_summer&quot;&gt;ended&lt;/a&gt; on June 5th and we &lt;a href=&quot;http://raibledesigns.com/rd/entry/father_s_day_weekend_at&quot;&gt;celebrated Father&apos;s Day on the Oregon coast&lt;/a&gt;.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a data-href=&quot;http://farm8.staticflickr.com/7284/9071981163_9ecc04ec8f_c.jpg&quot; title=&quot;View from Ecola State Park Oregon&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7284/9071981163_9ecc04ec8f.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;View from Ecola State Park Oregon&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9071962289/&quot; href=&quot;http://farm4.staticflickr.com/3675/9071962289_a7fc891f15_c.jpg&quot; title=&quot;Raible Family on the Oregon coast&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3675/9071962289_a7fc891f15_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Raible Family on the Oregon coast&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9074185440/&quot; href=&quot;http://farm8.staticflickr.com/7404/9074185440_eebccb9acf_c.jpg&quot; title=&quot;Abbie and Jack frolicking in the waves&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7404/9074185440_eebccb9acf_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Abbie and Jack frolicking in the waves&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9074188854/&quot; href=&quot;http://farm3.staticflickr.com/2814/9074188854_f0b09a43ca_c.jpg&quot; title=&quot;Kalin and Joe on the beach&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.staticflickr.com/2814/9074188854_f0b09a43ca_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Kalin and Joe on the beach&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;

    &lt;p&gt;Raible Road Trip #17 began in late June and we spent two weeks parading, rafting and golfing in Montana. From there, we flew to Maui for two weeks. I wrote about it all in &lt;a href=&quot;http://raibledesigns.com/rd/entry/summer_vacation_2012_in_montana&quot;&gt;Summer Vacation 2012 in Montana and Maui&lt;/a&gt;.
        &lt;/p&gt;
        &lt;p style=&quot;text-align: center&quot;&gt;

                        &lt;a title=&quot;Holland Lake Patio&quot; rel=&quot;lightbox[2012yearinreview]&quot; href=&quot;http://www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-rsL7ncX/0/M/DSC_4745-M.jpg&quot;&gt;
        &lt;img src=&quot;//www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-rsL7ncX/0/Ti/DSC_4745-Ti.jpg&quot;
             style=&quot;border: 1px solid black&quot; width=&quot;95&quot; height=&quot;95&quot; alt=&quot;Holland Lake Patio&quot;&gt;&lt;/a&gt;

      &lt;a title=&quot;The Girls at Double Arrow&quot; rel=&quot;lightbox[2012yearinreview]&quot; href=&quot;http://www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-sdLBDmF/0/M/DSC_4755-M.jpg&quot;&gt;
        &lt;img src=&quot;//www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-sdLBDmF/0/Ti/DSC_4755-Ti.jpg&quot;
             style=&quot;border: 1px solid black&quot; width=&quot;95&quot; height=&quot;95&quot; alt=&quot;The Girls at Double Arrow&quot;&gt;&lt;/a&gt;

      &lt;a title=&quot;Hard to believe I caused this guy to move to Montana in 1997&quot; rel=&quot;lightbox[2012yearinreview]&quot; href=&quot;http://www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-b5FCTrd/0/M/DSC_4845-2-M.jpg&quot;&gt;
        &lt;img src=&quot;//www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-b5FCTrd/0/Ti/DSC_4845-2-Ti.jpg&quot;
             style=&quot;border: 1px solid black&quot; width=&quot;95&quot; height=&quot;95&quot; alt=&quot;Hard to believe I caused this guy to move to Montana in 1997&quot;&gt;&lt;/a&gt;

      &lt;a title=&quot;Holland Lake Sunset&quot; rel=&quot;lightbox[2012yearinreview]&quot; href=&quot;http://www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-cH8CpGZ/0/M/HLL%20View-M.jpg&quot;&gt;
        &lt;img src=&quot;//www.mcginityphoto.com/Vacation/Montana-Summer-2012/i-cH8CpGZ/0/Ti/HLL%20View-Ti.jpg&quot;
             style=&quot;border: 1px solid black; margin-left: 1px&quot; width=&quot;95&quot; height=&quot;95&quot; alt=&quot;Holland Lake Sunset&quot;&gt;&lt;/a&gt;

                &lt;/p&gt;
                &lt;p style=&quot;text-align: center&quot;&gt;
&lt;a title=&quot;Api, Makao and Keaka. My Hawaiin name is Pualani&quot; rel=&quot;lightbox[2012yearinreview]&quot; href=&quot;http://www.mcginityphoto.com/Vacation/2012-Maui-Vacation/i-KHjFqdL/0/M/DSC_5402-M.jpg&quot;&gt;
        &lt;img src=&quot;//www.mcginityphoto.com/Vacation/2012-Maui-Vacation/i-KHjFqdL/0/S/DSC_5402-S.jpg&quot;
             width=&quot;400&quot; height=&quot;266&quot; style=&quot;border: 1px solid black&quot; alt=&quot;Api, Makao and Keaka. My Hawaiin name is Pualani&quot;&gt;&lt;/a&gt;
                            &lt;/p&gt;
&lt;p&gt;
    After returning from Hawaii, we dropped the kids off at their Mom&apos;s and headed to my cousin&apos;s wedding in Beacon, NY for the weekend. From there, my parents, Trish and I rode the train to Boston, spent a few days in Cape Cod and returned home in time for the beginning of school.
    &lt;/p&gt;
    &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/7795952628/&quot; href=&quot;http://farm9.staticflickr.com/8294/7795952628_c0be6bc4ca.jpg&quot; title=&quot;Abbie and Jack on the First Day of School 2012 by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8294/7795952628_c0be6bc4ca_n.jpg&quot; width=&quot;209&quot; height=&quot;320&quot; alt=&quot;Abbie and Jack on the First Day of School 2012&quot; class=&quot;picture&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
    
    The kids &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_first_day_of_school2&quot;&gt;started the school year in mid-August&lt;/a&gt; and we celebrated &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_jack4&quot;&gt;Jack&apos;s 8th birthday&lt;/a&gt; a couple weeks later.
    &lt;/p&gt;
&lt;p&gt;My lack of speaking engagements and work-related travel gave us more time to frolic in the Colorado mountains, so we &lt;a href=&quot;http://raibledesigns.com/rd/entry/we_bought_a_boat&quot;&gt;bought a boat&lt;/a&gt; for Labor Day weekend. That Saturday, we took it on its Maiden Voyage on the Colorado River, floating from Radium to Rancho del Rio. I guided and rowed the boat most of the time while our &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/7921929062/in/photostream/&quot; href=&quot;http://farm9.staticflickr.com/8460/7921929062_9bcf7d15f0.jpg&quot; rel=&quot;lightbox[2012yearinreview]&quot; title=&quot;The Maiden Voyage Crew&quot;&gt;7 passengers (and 2 dogs)&lt;/a&gt; enjoyed cold beverages, great scenery and relaxing in the sun. 
    &lt;/p&gt;
    &lt;p style=&quot;text-align: center&quot;&gt;
        &lt;a rev=&quot;http://www.flickr.com/photos/mcginityphoto/7921917130/&quot; href=&quot;http://farm9.staticflickr.com/8041/7921917130_7389475dea.jpg&quot; title=&quot;Abbie with our new boat by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8041/7921917130_7389475dea_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;Abbie with our new boat&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;The next day, Abbie played her first game of golf.&lt;/p&gt;
    &lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a rev=&quot;http://www.flickr.com/photos/mraible/7937704316/&quot; href=&quot;http://farm9.staticflickr.com/8317/7937704316_ee30d6bc55.jpg&quot; title=&quot;Nice form kiddo!&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8317/7937704316_ee30d6bc55_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Nice form kiddo!&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

    &lt;a rev=&quot;http://www.flickr.com/photos/mraible/7937705606/&quot; href=&quot;http://farm9.staticflickr.com/8318/7937705606_9d754545de.jpg&quot; title=&quot;Great day of golf at Pole Creek. Got a sweet framed set of Abbie pics at the end too!&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8318/7937705606_9d754545de_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Great day of golf at Pole Creek. Got a sweet framed set of Abbie pics at the end too!&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

    &lt;/p&gt;
    &lt;p&gt;In October, I &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_deck_project&quot;&gt;finished our deck project&lt;/a&gt; and work continued on our kitchen remodel (started in July by &lt;a href=&quot;http://peppergc.com/&quot;&gt;Ted Pepper&lt;/a&gt;). Our kitchen was far enough along for us to host our 1st Annual Halloween Party.&lt;/p&gt;
    &lt;p&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_abbie6&quot;&gt;Abbie turned 10&lt;/a&gt; the first week in November. That Friday, we headed to Kauai to &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_40th_anniversary_mom_and&quot;&gt;celebrate my parents&apos; 40th Anniversary&lt;/a&gt;. We spent &lt;a href=&quot;http://raibledesigns.com/rd/entry/november_travels_to_kauai_and#thanksgiving&quot;&gt;Thanksgiving in Wenatchee&lt;/a&gt;, Christmas in Boston/Vermont and &lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157632448197212/&quot;&gt;New Years with good friends in Fraser&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8224084347/&quot; href=&quot;http://farm9.staticflickr.com/8341/8224084347_d146419dfd.jpg&quot; title=&quot;Our Lanai by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8341/8224084347_d146419dfd_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Our Lanai&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8224089763/&quot; href=&quot;http://farm9.staticflickr.com/8065/8224089763_03d7c6a657.jpg&quot; title=&quot;Hanalei Pier by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8065/8224089763_03d7c6a657_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Hanalei Pier&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8225168600/&quot; href=&quot;http://farm9.staticflickr.com/8059/8225168600_df36e98e1e.jpg&quot; title=&quot;Happy Family by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8059/8225168600_df36e98e1e_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Happy Family&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8225152842/&quot; href=&quot;http://farm9.staticflickr.com/8339/8225152842_6c987fae93.jpg&quot; title=&quot;Surf House by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8339/8225152842_6c987fae93_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;Surf House&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a data-url=&quot;http://www.flickr.com/photos/mcginityphoto/8225154986/&quot; href=&quot;http://farm9.staticflickr.com/8480/8225154986_2641ec95bd.jpg&quot; title=&quot;St Regis Pool by McGinityPhoto, on Flickr&quot; rel=&quot;lightbox[2012yearinreview]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8480/8225154986_2641ec95bd_t.jpg&quot; width=&quot;100&quot; height=&quot;67&quot; alt=&quot;St Regis Pool&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://www.facebook.com/photo.php?fbid=10200109112597408&amp;amp;set=a.10200104543563185.2198356.1438065285&amp;amp;type=1&quot;&gt;
&lt;img alt=&quot;Mom and Dad in Kauai&quot; src=&quot;//sphotos-a.xx.fbcdn.net/hphotos-prn1/621352_10200109112597408_143056394_o.jpg&quot; style=&quot;width: 520px; height: 346px; border: 1px solid black&quot;&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id=&quot;2013&quot;&gt;2013&lt;/h2&gt;
&lt;p&gt;My goals for 2013 are to be happy and to &lt;em&gt;slow down&lt;/em&gt;. I don&apos;t plan on traveling any less, or spending less time with my family. I&apos;d just like to walk slower, smell the good ol&apos; Rocky Mountain air more and enjoy life. I believe our raft will help us facilitate this and we&apos;re already planning trips to the &lt;a href=&quot;http://www.tagalong.com/index.php?page=greeno&quot;&gt;Green River&lt;/a&gt; in Utah and &lt;a href=&quot;http://www.montanaliving.com/Outdoors/Schafer_Meadows_a_wilderness_trip_of_a_lifetime_97-097&quot;&gt;Schafer Meadows&lt;/a&gt; in the Bob.&lt;/p&gt;
&lt;p&gt;The big event for the year will be Trish and my wedding this summer. We&apos;ll be doing it in my hometown in Montana and we expect it to be quite the shindig. Afterward, we plan on &lt;a href=&quot;https://twitter.com/mraible/status/264452753596751874&quot;&gt;traveling the world&lt;/a&gt; for our honeymoon.&lt;/p&gt;
&lt;p&gt;Of course, if the bus gets finished, that&apos;s a huge bonus too.&lt;/p&gt;
&lt;p&gt;Professionally, I&apos;m starting an exciting project at Taleo that will involve heavy JavaScript, CSS3 and maybe even Canvas. I have speaking engagements lined up at &lt;a href=&quot;http://www.meetup.com/DenverJavaUsersGroup/events/93932082/&quot;&gt;Denver JUG in February&lt;/a&gt; and &lt;a href=&quot;http://www.meetup.com/HTML5-Denver-Users-Group/&quot;&gt;HTML5 Denver&lt;/a&gt; in April. Also, I just submitted a couple talks to &lt;a href=&quot;http://www.devoxx.com/display/FR13/Home&quot;&gt;Devoxx France&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;For AppFuse, I&apos;d love to get 3-4 releases out this year, but 2 is probably more realistic. The &lt;a href=&quot;http://appfuse.org/display/APF/Roadmap&quot;&gt;AppFuse Roadmap&lt;/a&gt; shows our future releases + features. I&apos;d also like to work a bit more on my Play 2 app; finishing the mobile client and possibly switching from Anorm to Slick or Spring Data.&lt;/p&gt;
&lt;p&gt;While Oracle has been good to me, I look forward to finding and working for a new client in September.&lt;/p&gt;
&lt;p&gt;Last year &lt;a href=&quot;http://raibledesigns.com/rd/entry/2011_a_year_in_review&quot;&gt;at this time&lt;/a&gt;, we watched the Broncos execute the &lt;em&gt;Mile High Miracle&lt;/em&gt; over the Steelers. With tickets to both this week&apos;s game (vs. The Ravens) and next week&apos;s game (vs. The Patriots), I wouldn&apos;t be surprised if January turns out to be a great month. However, with the Powder Days, The Super Bowl, the raft trips, the Bus Shows and The Wedding, there&apos;s a good chance that all the months in 2013 are epic. &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_well_grounded_java_developer</id>
        <title type="html">The Well-Grounded Java Developer Book Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_well_grounded_java_developer"/>
        <published>2012-11-21T09:54:25-07:00</published>
        <updated>2020-12-09T17:10:13-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="groovy" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="martijnverburg" scheme="http://roller.apache.org/ns/tags/" />
        <category term="manning" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="clojure" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java7" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bookreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="benevans" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://www.manning.com/evans/&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/java7developer.jpg&quot; width=&quot;150&quot; height=&quot;188&quot; alt=&quot;Well-Grounded Java Developer&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
After finishing &lt;a href=&quot;http://raibledesigns.com/rd/entry/core_html5_canvas_book_review&quot;&gt;Core HTML5 Canvas&lt;/a&gt;, I dived into the next book on my list: &lt;a href=&quot;http://www.manning.com/evans/&quot;&gt;The Well-Grounded Java Developer&lt;/a&gt; by &lt;a href=&quot;http://boxcatjunction.blogspot.com/&quot;&gt;Ben Evans&lt;/a&gt; and &lt;a href=&quot;http://martijnverburg.blogspot.com/&quot;&gt;Martijn Verburg&lt;/a&gt;. I&apos;ve known about this book since April of last year when I received an email from Martijn. He wanted to use some of my graphs and research on JVM Web Frameworks as evidence that many frameworks aren&apos;t meeting developer&apos;s needs and to support their coverage of Grails in the book. 
&lt;/p&gt;
&lt;p&gt;
I agreed and also did a quick review on Chapter 13, Rapid Web Development. In June of this year, I received another email saying the book was done and they&apos;d send me a free copy. I received the book in &lt;a href=&quot;https://twitter.com/mraible/status/234338414810497026&quot;&gt;early August&lt;/a&gt;, but didn&apos;t start reading it until mid September.
&lt;/p&gt;
The book is broken up into 4 separate parts:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Developing with Java 7&lt;/li&gt;
&lt;li&gt;Vital techniques&lt;/li&gt;
&lt;li&gt;Polyglot programming on the JVM&lt;/li&gt;
&lt;li&gt;Crafting the polyglot project&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Developing with Java 7&lt;/strong&gt;&lt;br/&gt;
The first two chapters on Java 7 and NIO.2 (aka JSR-203) were great in that I started learning new things immediately. While I knew about most of the changes (strings in switch statements, improved exception handling, try-with-resources, diamond syntax, etc.), it was a nice refresher and motivated me to install Java 7 and start using it on a daily basis. The NIO.2 chapter covers the new filesystem support with &lt;a href=&quot;http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html&quot;&gt;Path&lt;/a&gt;, the &lt;a href=&quot;http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html&quot;&gt;Files&lt;/a&gt; helper class and Asynchronous I/O.&lt;/p&gt;
&lt;p&gt;It was around this same time that I started on &lt;a href=&quot;https://www.coursera.org/&quot;&gt;Coursera&apos;s&lt;/a&gt; &lt;a href=&quot;https://www.coursera.org/course/progfun&quot;&gt;Functional Programming Principles in Scala&lt;/a&gt;. I quickly realized the course was going to take quite a bit of my free time (5-7 hours per week). It was a good challenge to try and read for 30 minutes a day as well as stay on top of my Scala homework. However, it was also highly rewarding in all the knowledge I received in the last two months.&lt;/p&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vital techniques&lt;/strong&gt;&lt;br/&gt;
This section covers Dependency Injection, Concurrency, Class files, and Bytecode and Performance Tuning. I skimmed through the DI chapter but slowed down to try and get my head around concurrency. Then I thanked my lucky stars I haven&apos;t had to deal with it much. I found the class files and bytecode chapter mildly interesting but perked up again to learn more about how to do performance tuning, VisualVM, and the new G1 garbage collector.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Polyglot programming on the JVM&lt;/strong&gt;&lt;br/&gt;
The polyglot programming section was largely a reinforcement of my existing knowledge since I&apos;ve used Groovy and Scala quite a bit. The chapter on Clojure was an eye-opener since I hadn&apos;t used Clojure before. I wasn&apos;t quite convinced of its merits, but I did learn enough to read and understand its syntax. Reading the Scala chapter while doing the Coursera course made me realize that Ben and Martijn really packed a lot into each language&apos;s chapter. This section is really a great intro to all these languages, especially if you&apos;ve never worked with them before.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crafting the polyglot project&lt;/strong&gt;&lt;br/&gt;
While the final section was good, I learned the least in this section. While the concepts discussed in this section are important, they&apos;re also things I&apos;ve been using for years: TDD, CI, and Rapid Web Development (with Grails). This section touched on Hibernate when discussing TDD and I thought to myself - it&apos;s strange they don&apos;t have cover Hibernate (or JPA) as part of being a well-grounded Java developer. My guess is the authors assumed most Java devs already know it.
&lt;/p&gt;
&lt;p&gt;
The final chapter had a lot of tips on staying well-grounded (what&apos;s coming in Java 8, how the JVM is supporting polyglot programming, future concurrency trends, and new directions in the JVM). 
&lt;/p&gt;
&lt;p&gt;I really enjoyed this book and feel I became a more knowledgeable Java developer by reading it. It contained a lot of high-level concepts as well as nitty-gritty details. In my opinion, the sign of a great book is one that you feel you&apos;ll refer back to as a reference guide. The first half of this book definitely feels like something I&apos;ll refer back to. The second half I&apos;ll recommend to Java developers wanted to get caught up with the latest trends. 
&lt;/p&gt;
&lt;p&gt;
Nice work Ben and Martijn!</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/why_the_bias_against_jsf</id>
        <title type="html">Why the bias against JSF?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/why_the_bias_against_jsf"/>
        <published>2012-11-08T09:24:27-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">In my last post about &lt;a href=&quot;http://raibledesigns.com/rd/entry/infoq_s_top_20_web&quot;&gt;InfoQ&apos;s Top 20 Web Frameworks for the JVM&lt;/a&gt;, I received a thought-provoking &lt;a href=&quot;http://raibledesigns.com/rd/entry/infoq_s_top_20_web#comment-1352305197000&quot;&gt;comment&lt;/a&gt; from &lt;a href=&quot;http://henk53.wordpress.com/&quot;&gt;henk53&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
There is one little thing that does bother me in those presentations, and that&apos;s your fairly obvious bias against JSF. &lt;br/&gt;...&lt;br/&gt;
If you are presenting yourself as, more or less, an authority on comparing web frameworks, then having a fairly obvious biased against one of them is just peculiar. I, all of my team, and various clients distrust your ranking of JSF. We do look at your data if the choice is between other frameworks, but as soon as JSF comes into the picture we just look elsewhere.
&lt;br/&gt;&lt;br/&gt;
I&apos;m not really sure where this bias comes from. Yes, JSF 1.0 sucked and 1.2 was only marginally better, but 2.0 is really cool and productive and there are SUPERB component and utility libraries now like PrimeFaces and OmniFaces. As a researcher of this topic I think you should keep up the date and not stick to some old grudge.
&lt;/p&gt;
&lt;p&gt;This is true, I am biased against JSF. It all started with my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_jsf_experience&quot;&gt;first JSF experience&lt;/a&gt; back in August 2004. If you remember correctly, 2004 was a big year: JSF 1.0, Spring 1.0 and Flex 1.0 were all released. The &quot;AJAX&quot; term was coined in &lt;a href=&quot;http://www.adaptivepath.com/ideas/ajax-new-approach-web-applications&quot;&gt;early 2005&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/4378559350/&quot; title=&quot;History of Web Frameworks by mraible, on Flickr&quot;&gt;&lt;img src=&quot;//farm5.staticflickr.com/4067/4378559350_13f0755403.jpg&quot; width=&quot;500&quot; height=&quot;234&quot; alt=&quot;History of Web Frameworks&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;By &lt;a href=&quot;http://raibledesigns.com/rd/entry/jsf_still_sucks&quot;&gt;2007&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_wrong_with_jsf&quot;&gt;2008&lt;/a&gt;, JSF still hadn&apos;t gotten any better. In late 2009, JSF 2.0 was released and &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_to_jsf_2&quot;&gt;I upgraded in March 2011&lt;/a&gt;. As you can see from the aforementioned post, I ran into quite a few issues upgrading. JSF was also the &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry&quot;&gt;hardest one to get working with extension-less URLs&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Most of my issues with JSF come from having maintained an application built with it since 2004. If I were to start a new application without any legacy migration issues, I imagine it wouldn&apos;t be as difficult. However, if you compare it to Struts 2 and Spring MVC, I&apos;ve had little-to-no issues upgrading those applications over the years. &lt;/p&gt;
&lt;p&gt;Also, I&apos;m not just biased against JSF, but most component-based web frameworks. Just ask the Tapestry and Wicket folks. They&apos;ve felt my criticisms over the years. My reason for preferring request-based frameworks like Struts 2/Spring MVC and Grails/Play has been because I&apos;ve never seen the appeal in component-based frameworks. Often I&apos;ve found that their components are just widgets that you can get from any decent JavaScript framework. And chances are that JavaScript framework can work with &lt;em&gt;any&lt;/em&gt; web framework. Also, I&apos;ve worked on a lot of high-traffic web applications that require statelessness for scalability.&lt;/p&gt;
&lt;p&gt;I see the value in component-based frameworks, I just don&apos;t think components should be authored on the server-side. Most of the Java-based component frameworks require 2+ files for components (one for the component, one for the view, possibly one for the config). I love GWT&apos;s component concept in that you can just extract a class and re-use it. With JS frameworks, you can often just include a script. These days, when I think of good component-based frameworks, I think of jQuery UI and Twitter Bootstrap.&lt;/p&gt;
&lt;p&gt;All that being said, there&apos;s a lot of folks praising JSF 2 (and &lt;a href=&quot;http://primefaces.org/&quot;&gt;PrimeFaces&lt;/a&gt; moreso). That&apos;s why I&apos;ll be integrating it (or merging your pull request) into the 2.3 release of AppFuse. Since PrimeFaces contains a Bootstrap theme, I hope this is a pleasant experience and my overall opinion of JSF improves.&lt;/p&gt;
&lt;p&gt;In other component-based frameworks in AppFuse news, Tapestry 5 has gotten &lt;em&gt;really fast&lt;/em&gt; in the last year. I imagine this is because we have a Tapestry expert, &lt;a href=&quot;http://www.linkedin.com/in/sergeeby&quot;&gt;Serge Eby&lt;/a&gt;, working on it. And we&apos;re planning on adding Wicket in the 2.3 release. &lt;/p&gt;
&lt;p&gt;So even though I &lt;em&gt;prefer&lt;/em&gt; request-based frameworks with REST support and Bootstrap, that doesn&apos;t mean everyone does. I&apos;ll do my best to be less-biased in the future. However, please remember that my view on web frameworks is as a developer, not an analyst. And aren&apos;t developers &lt;em&gt;supposed&lt;/em&gt; to be opinionated? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/infoq_s_top_20_web</id>
        <title type="html">InfoQ&apos;s Top 20 Web Frameworks for the JVM</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/infoq_s_top_20_web"/>
        <published>2012-11-06T12:04:28-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Back in early October, InfoQ.com published a community research article titled &lt;a href=&quot;http://www.infoq.com/research/jvm-web-frameworks&quot;&gt;Top 20 Web Frameworks for the JVM&lt;/a&gt;. Their goal seemed to be fairly simple:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Using the new community research tool, we at InfoQ want to get YOUR opinions on the relative importance and maturity of a variety of web frameworks that are targeted for the JVM. Please vote by dragging each practice across two dimensions &#8211; how important is the framework relative to the other frameworks, and how much is it actually used in real teams and projects.
&lt;/p&gt;
&lt;p&gt;When I first saw this article, I noticed some strange web frameworks listed. Namely, Netty, SiteMesh and Spark. I haven&apos;t heard of many folks using &lt;a href=&quot;https://netty.io/&quot;&gt;Netty&lt;/a&gt; for a web framework, but I&apos;m sure it&apos;s possible. SiteMesh is certainly not a web framework and I&apos;ve never even heard of Spark. And where is GWT and Vaadin? Regardless of the choices, I went ahead and voted.&lt;/p&gt;
&lt;p&gt;Last week, InfoQ posted their top content for October on Facebook. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/research/jvm-web-frameworks&quot;&gt;Top 20 Web Frameworks for the JVM&lt;/a&gt; 25,992 PV&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2012/10/Ruby-on-Rails-Node-js-LinkedIn&quot;&gt;Ruby on Rails vs. Node.js at LinkedIn&lt;/a&gt; 11,904 PV&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/presentations/Mobile-Web-Development&quot;&gt;Mobile Webdev: The Horror&lt;/a&gt; 11,150 PV&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/articles/rest-introduction&quot;&gt;A Brief Introduction to REST&lt;/a&gt; 8,872 PV
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;Kanban and Scrum - making the most of both&lt;/a&gt; 7,665 PV&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First of all, it&apos;s interesting to see that JVM Web Frameworks is still a hot topic for developers. Whenever I do my Comparing JVM Web Frameworks talk at conferences, I always see a few jabs about &quot;he&apos;s &lt;em&gt;still&lt;/em&gt; doing that talk!?&quot; Yes, it seems strange that a talk I first did in 2004 is still in high demand. &lt;/p&gt;
&lt;p&gt;Secondly, I think InfoQ does good in showing how the frameworks ranked and showing their &lt;em&gt;heatmaps&lt;/em&gt;. Below are their rankings from 1109 participants. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/8161758257/&quot; title=&quot;InfoQ&apos;s Top 20 Web Frameworks for the JVM&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8197/8161758257_ef6d919f5d.jpg&quot; width=&quot;500&quot; height=&quot;395&quot; alt=&quot;InfoQ&apos;s Top 20 Web Frameworks for the JVM&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;According to this research, the top 5 web frameworks for the JVM are Spring MVC, Play, Grails, JSF and Struts (I hope those surveyed meant Struts 2, not Struts 1).&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;http://www.slideshare.net/mraible/comparing-jvm-web-frameworks-jfokus-2012&quot;&gt;my research from last February&lt;/a&gt; (slide 21), I ranked them (with no particular weightings) as Grails, GWT, JRuby on Rails, Spring MVC and Vaadin. So I guess you could say I got 2 out of 5 right (Grails and Spring MVC). Not bad considering InfoQ didn&apos;t even consider GWT and Vaadin.&lt;/p&gt;
&lt;p&gt;Another intriguing data point in this study is each frameworks&apos; heatmap. For example, below are heatmaps for the top 4 frameworks. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a rev=&quot;http://www.flickr.com/photos/mraible/8161758501/&quot; href=&quot;http://farm8.staticflickr.com/7247/8161758501_151b1a839c.jpg&quot; title=&quot;Spring MVC Heatmap&quot; rel=&quot;lightbox[infotop20webframeworks]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7247/8161758501_151b1a839c_m.jpg&quot; width=&quot;240&quot; height=&quot;215&quot; alt=&quot;Spring MVC Heatmap&quot;&gt;&lt;/a&gt;

&lt;a rev=&quot;http://www.flickr.com/photos/mraible/8161762845/&quot; href=&quot;http://farm8.staticflickr.com/7125/8161762845_12cfdc076c.jpg&quot; title=&quot;Grails Heatmap&quot; rel=&quot;lightbox[infotop20webframeworks]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7125/8161762845_12cfdc076c_m.jpg&quot; width=&quot;240&quot; height=&quot;215&quot; alt=&quot;Grails Heatmap&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a rev=&quot;http://www.flickr.com/photos/mraible/8161758399/&quot; href=&quot;http://farm8.staticflickr.com/7255/8161758399_505e8cf4db.jpg&quot; title=&quot;Play Heatmap&quot; rel=&quot;lightbox[infotop20webframeworks]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7255/8161758399_505e8cf4db_m.jpg&quot; width=&quot;240&quot; height=&quot;215&quot; alt=&quot;Play Heatmap&quot;&gt;&lt;/a&gt;

&lt;a rev=&quot;http://www.flickr.com/photos/mraible/8161758341/&quot; href=&quot;http://farm8.staticflickr.com/7256/8161758341_7e1d37e1ea.jpg&quot; title=&quot;JSF Heatmap&quot; rel=&quot;lightbox[infotop20webframeworks]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7256/8161758341_7e1d37e1ea_m.jpg&quot; width=&quot;240&quot; height=&quot;215&quot; alt=&quot;JSF Heatmap&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Notice how Grails and Spring MVC are both &lt;em&gt;hotter&lt;/em&gt; in the bottom right corner? It seems the community&apos;s overall opinions of these two frameworks are more aligned than JSF and Play, which a fair amount of folks rank as hyped and unimportant. &lt;/p&gt;
&lt;p&gt;What I really like about this research is it&apos;s the community&apos;s opinions, visualized. It also confirms that some of my favorite frameworks are still on top. I don&apos;t know if JSF belongs as a top framework, however it seems a lot of folks do. I recently &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Drop-JSF-Support-td4655648.html&quot;&gt;thought about removing it from AppFuse&lt;/a&gt;, but decided to keep it (at least for the next release). I hope InfoQ does more research projects like this, especially if they get their list of web frameworks right. </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/father_s_day_weekend_at</id>
        <title type="html">Father&apos;s Day Weekend at The Oregon Coast</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/father_s_day_weekend_at"/>
        <published>2012-07-02T09:44:00-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/General" label="General" />
        <category term="fathersday" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vacation" scheme="http://roller.apache.org/ns/tags/" />
        <category term="montana" scheme="http://roller.apache.org/ns/tags/" />
        <category term="travel" scheme="http://roller.apache.org/ns/tags/" />
        <category term="thecabin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="oregon" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">For the 5-year anniversary of our &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_father_s_day_camping&quot;&gt;Father&apos;s Day Camping Trip&lt;/a&gt;, we decided to mix things up a bit. My parents were in Oregon for a friend&apos;s wedding, so we decided to fly to meet them there instead of flying them to Colorado. My sister hopped on &quot;Buttercup&quot; (her Harley) and drove to meet us from Washington. We also invited our good friends Clint and Autumn (who you might remember from &lt;a href=&quot;http://raibledesigns.com/rd/entry/costa_rica_was_awesome&quot;&gt;Costa Rica&lt;/a&gt;) and had a great time staying at &lt;a href=&quot;http://www.gearhartcottages.com/&quot;&gt;Gearhart Cottages&lt;/a&gt;. 
&lt;/p&gt;
We didn&apos;t feel too bad about skipping camping since Trish held a &quot;Boot Camp&quot; with the kids and their friends at Stillwater Campground the week before. You might remember Stillwater from &lt;a href=&quot;http://raibledesigns.com/rd/entry/good_times_on_the_annual&quot;&gt;last year&apos;s Father&apos;s Day trip&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Trish&apos;s Uncle John drove out to the coast to meet us and we did a really fun hike along Indian Beach to Ecola State Park. It was a real treat! It was also really fun to meet Clint and Autumn&apos;s 9 month old Brodie. As usual, Trish snapped some &lt;a href=&quot;http://www.flickr.com/photos/mcginityphoto/sets/72157634190527810/&quot;&gt;incredible photos&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a data-href=&quot;http://farm8.staticflickr.com/7284/9071981163_9ecc04ec8f_c.jpg&quot; title=&quot;View from Ecola State Park Oregon&quot; rel=&quot;lightbox[fathersday2012]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7284/9071981163_9ecc04ec8f.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;View from Ecola State Park Oregon&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9071962289/&quot; href=&quot;http://farm4.staticflickr.com/3675/9071962289_a7fc891f15_c.jpg&quot; title=&quot;Raible Family on the Oregon coast&quot; rel=&quot;lightbox[fathersday2012]&quot;&gt;&lt;img src=&quot;//farm4.staticflickr.com/3675/9071962289_a7fc891f15_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Raible Family on the Oregon coast&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9074185440/&quot; href=&quot;http://farm8.staticflickr.com/7404/9074185440_eebccb9acf_c.jpg&quot; title=&quot;Abbie and Jack frolicking in the waves&quot; rel=&quot;lightbox[fathersday2012]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7404/9074185440_eebccb9acf_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Abbie and Jack frolicking in the waves&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;a data-href=&quot;http://www.flickr.com/photos/mcginityphoto/9074188854/&quot; href=&quot;http://farm3.staticflickr.com/2814/9074188854_f0b09a43ca_c.jpg&quot; title=&quot;Kalin and Joe on the beach&quot; rel=&quot;lightbox[fathersday2012]&quot;&gt;&lt;img src=&quot;//farm3.staticflickr.com/2814/9074188854_f0b09a43ca_q.jpg&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;Kalin and Joe on the beach&quot; style=&quot;border: 1px solid black; margin-left: 15px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;That was two weeks ago. We returned to Colorado, had some fun at &lt;a href=&quot;http://raibledesigns.com/rd/entry/play_vs_grails_smackdown_at&quot;&gt;&#220;berConf&lt;/a&gt;, rocked out at a Def Leppard concert then enjoyed a few Rockies games before hopping in the car and heading to Montana. We spent the night at &lt;a href=&quot;http://www.usparklodging.com/yellowstone/roosevelt_lodge_cabins.php&quot;&gt;Roosevelt Lodge Cabins in Yellowstone&lt;/a&gt; and saw a plethora of buffalo, a couple bears and even a beaver while driving through.&lt;/p&gt;
&lt;p&gt;This morning, we woke up at &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_cabin&quot;&gt;the cabin I was born in&lt;/a&gt;. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm9.staticflickr.com/8160/7487341754_795f6ed123.jpg&quot; title=&quot;The Cabin 2012&quot; rel=&quot;lightbox[fathersday2012]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8160/7487341754_795f6ed123_n.jpg&quot; width=&quot;320&quot; height=&quot;238&quot; alt=&quot;The Cabin 2012&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We&apos;ll be working on my parent&apos;s retirement cabin, getting a float ready for the Swan Valley Parade and having a good ol&apos; time with great friends for the next two weeks. After that, we&apos;re taking the kids to Hawaii for the first time. 
&lt;/p&gt;
&lt;p&gt;
Here&apos;s to summer vacations. I hope yours is spent with great people in beautiful places too.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/play_vs_grails_smackdown_at</id>
        <title type="html">Play vs. Grails Smackdown at &#220;berConf</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/play_vs_grails_smackdown_at"/>
        <published>2012-06-25T07:10:57-06:00</published>
        <updated>2013-10-04T17:28:17-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="uberconf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="comparison" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Play and Grails have been hyped as the most productive JVM Web Frameworks for the last couple of years. That hype has recently grown thanks to both frameworks&apos; 2.0 releases. That&apos;s why &lt;a href=&quot;http://jamesward.com&quot;&gt;James Ward&lt;/a&gt; and I decided to do a presentation at &lt;a href=&quot;http://uberconf.com&quot;&gt;&#220;berConf&lt;/a&gt; comparing the two. In April, we proposed the talk to Jay Zimmerman, got accepted and went to work.
&lt;/p&gt;
&lt;p id=&quot;how&quot;&gt;&lt;strong&gt;How we did it&lt;/strong&gt;&lt;br/&gt;
In the beginning of May, we met at a &lt;a href=&quot;http://www.wynkoop.com/&quot;&gt;brewery in LoDo&lt;/a&gt; and sketched out the app we wanted to build. We also came up with a schedule for development and a plan for the presentation. We decided to build two different webapps, each with little-to-no Ajax functionality and a few features that we could use to load test and compare the applications. 
&lt;/p&gt;
&lt;p&gt;
We started out with the name &#8220;Happy Trails&#8221; since we both liked trails and happy hours. Later, James found that www.ubertracks.com was available and purchased the domain. We setup the Grails app to be on bike.ubertracks.com and Play/Java to be on hike.ubertracks.com. We managed our &lt;a href=&quot;https://github.com/jamesward/happytrails&quot;&gt;source code on GitHub&lt;/a&gt;, continuously tested on &lt;a href=&quot;http://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; and deployed to &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt;. Two weeks ago, when we were finishing up our apps, we hired a friend (&lt;a href=&quot;http://www.linkedin.com/pub/linsay-shirley/1/5a0/b4&quot;&gt;Linsay Shirley&lt;/a&gt;) to do QA. 
&lt;/p&gt;
&lt;p&gt;
After fixing bugs, I emailed &lt;a href=&quot;http://blog.lightbody.net/&quot;&gt;Patrick Lightbody&lt;/a&gt;, got some &#8220;cloud dollars&#8221; for &lt;a href=&quot;https://browsermob.com/performance-testing&quot;&gt;Neustar Web Performance&lt;/a&gt; and started running load tests. The Wednesday before last, at 2 in the morning, I recorded &lt;a href=&quot;https://wm2-testscripts-scripts-prod.s3.amazonaws.com/script/b1b78d4286054d159888bc4135379b86/script.js?versionId=J4E28EFR5PzDNnAgPPPfoelw3AhMqI9A&quot;&gt;a simple browsing regions and routes script&lt;/a&gt; and set it to go to 50 users over a 5 minute period and then sustain 50 for another 5 minutes. It was fun to watch the log messages whiz through my console so fast they got blurry. About halfway through testing the Grails app, there was an OOM issue, but it eventually recovered. Limiting db connections to 4 and scaling to 5 Dynos in future tests helped alleviate any issues. 
&lt;/p&gt;
&lt;p&gt;
We took our development experience, the load/performance testing data, and a bunch of ecosystem stats and built &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Play_vs_Grails_Smackdown_UberConf2012/&quot;&gt;our smackdown presentation&lt;/a&gt;. We used &lt;a href=&quot;http://lab.hakim.se/reveal-js/&quot;&gt;reveal.js&lt;/a&gt;, &lt;a href=&quot;http://www.jamesward.com/2012/06/15/dynamically-rendering-github-files-in-web-pages&quot;&gt;GitHub Files&lt;/a&gt; and &lt;a href=&quot;https://developers.google.com/chart/&quot;&gt;Google Charts&lt;/a&gt; to make things more dynamic.
&lt;/p&gt;
&lt;p id=&quot;conclusions&quot;&gt;&lt;strong&gt;What we found&lt;/strong&gt;&lt;br/&gt;
We arrived at a number of &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Play_vs_Grails_Smackdown_UberConf2012/#/10&quot;&gt;conclusions&lt;/a&gt; after doing our research:
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;From a code perspective, Play 2 and Grails 2 are very similar frameworks.&lt;/li&gt;
&lt;li&gt;Code authoring was good in both, but lacking IDE support for Play 2&apos;s Scala Templates.&lt;/li&gt;
&lt;li&gt;Grails Plugin Ecosystem is excellent.&lt;/li&gt;
&lt;li&gt;TDD-Style Development is easy with both.&lt;/li&gt;
&lt;li&gt;Type-safety in Play 2 was really useful, especially routes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Statistical Analysis&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Grails has better support for FEO (YSlow, PageSpeed)&lt;/li&gt;
&lt;li&gt;Grails has less LOC! (6 lines less, but 40% more files)&lt;/li&gt;
&lt;li&gt;1 Dyno - Grails had 2x transactions!
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;Grails experienced OOM about halfway through.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Apache Benchmark with 10K requests:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li style=&quot;text-decoration:line-through&quot;&gt;Play: ~10% failed requests, Grails: 0&lt;/li&gt;
&lt;li style=&quot;text-decoration:line-through&quot;&gt;Requests per second: {Play: 170, Grails: 198}&lt;/li&gt;
&lt;li&gt;Requests per second: {Play: 251, Grails: 198}&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Load Test with 100 Real Users:
&lt;ul style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;Grails: 10% more transactions, 0 errors&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ecosystem Analysis&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Play&quot; is difficult to search for.&lt;/li&gt;
&lt;li&gt;Grails is more mature.&lt;/li&gt;
&lt;li&gt;Play has momentum issues.&lt;/li&gt;
&lt;li&gt;LinkedIn: more people know Grails than Spring MVC.&lt;/li&gt;
&lt;li&gt;Play has 3x user mailing list traffic.&lt;/li&gt;
&lt;li&gt;We had similar experiences with documentation and questions.&lt;/li&gt;
&lt;li&gt;Outdated documentation is a problem for both.&lt;/li&gt;
&lt;li&gt;Play has &lt;em&gt;way&lt;/em&gt; more hype!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
We figured we spent around 100 hours developing the apps, gathering data and creating the presentation. The good news is it&apos;s all open source! This means you can &lt;a href=&quot;https://github.com/jamesward/happytrails&quot;&gt;clone the project on GitHub&lt;/a&gt; (Grails is in the &lt;em&gt;grails2&lt;/em&gt; branch, Play is in the &lt;em&gt;play2_java&lt;/em&gt; branch) and help us improve it. The presentation is in the master branch in the &lt;em&gt;preso&lt;/em&gt; directory. 
&lt;/p&gt;
&lt;p&gt;
All the data we gathered is open for debate and we&#8217;d love to tune our apps to handle more requests per second. In fact, we already had a contributor &lt;a href=&quot;http://twitter.com/pk11/status/216186997126070272&quot;&gt;discover an issue&lt;/a&gt; and &lt;a href=&quot;https://gist.github.com/2973705&quot;&gt;provide a fix&lt;/a&gt; for Play that increases its throughput from 170 req/second to 252 req/second!
&lt;/p&gt;
&lt;p&gt;
Regardless of what the stats and pretty graphs say, we both enjoyed our experiences with Play 2 and Grails 2. If you haven&apos;t tried them yourself, we encourage you to do so.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/upgrading_to_play_2_anorm</id>
        <title type="html">Upgrading to Play 2: Anorm and Testing</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/upgrading_to_play_2_anorm"/>
        <published>2012-06-05T20:55:40-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="specs2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="uberconf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="anorm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play-more" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://playframework.org&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7234/7158522999_066b0e26a1_t.jpg&quot; width=&quot;100&quot; height=&quot;33&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;/&gt;&lt;/a&gt;
This time last year, I decided I wanted to learn Scala. I chose the &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play Framework&lt;/a&gt; as my vehicle for learning and I added &lt;a href=&quot;http://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt; and &lt;a href=&quot;http://scalate.fusesource.org/documentation/jade.html&quot;&gt;Jade&lt;/a&gt; to the mix. I packaged it all up, learned a bunch and &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_html5_with_play_scala&quot;&gt;presented it at Devoxx 2011&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;In January, I added SecureSocial, JSON Services and worked a bit on the mobile client. I presented my findings &lt;a href=&quot;http://raibledesigns.com/rd/entry/comparing_web_frameworks_and_html5&quot;&gt;at Jfokus&lt;/a&gt; shortly after. As part of my aforementioned post, I wrote:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Right before we left for Jfokus, I was able to get everything to work, but didn&apos;t spend as much time as I&apos;d like working on the mobile client. If this talk gets accepted for Devoxx France, I plan on spending most of my time enhancing the mobile client.
&lt;/p&gt;
&lt;p&gt;I had some complications (a.k.a. too much &lt;a href=&quot;http://raibledesigns.com/rd/entry/cruising_around_the_western_caribbean&quot;&gt;vacation&lt;/a&gt;) with Devoxx France and wasn&apos;t able to attend. To make up for it, I submitted the talk to &lt;a href=&quot;http://uberconf.com/conference/denver/2012/06/home&quot;&gt;&#220;berConf&lt;/a&gt;. It got accepted and I started working on my app a couple weeks ago. So far, I&apos;ve spent about 8 hours upgrading it to Play 2 and I hope to start re-writing the mobile client later this week. I plan on using &lt;a href=&quot;http://incubator.apache.org/cordova/&quot;&gt;Cordova&lt;/a&gt;, &lt;a href=&quot;http://www.jqtouch.com/&quot;&gt;jQTouch&lt;/a&gt; and releasing it in the App Store sometime this month.
&lt;/p&gt;
&lt;p&gt;
&lt;p id=&quot;upgrading-to-play2&quot;&gt;&lt;strong&gt;Upgrading to Play 2&lt;/strong&gt;&lt;br/&gt;
When I heard about Play 2, I thought it was a great thing. The developers were re-writing the framework to use Scala at the core and I was already using Scala in my app. Then I learned they were going to throw backwards compatibility out the window and I groaned. &quot;Really? Another web framework (like Tapestry of old) screwing its users and making them learn everything again?!&quot;, I thought. &quot;Maybe they should call it &lt;em&gt;Run&lt;/em&gt; instead of &lt;em&gt;Play&lt;/em&gt;, leaving the old framework that everyone loves intact.&quot; 
&lt;/p&gt;
&lt;p&gt;However, after hearing about it at &lt;a href=&quot;http://raibledesigns.com/rd/entry/play_2_0_a_web&quot;&gt;Devoxx&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/play_framework_2_0_with&quot;&gt;Jfokus&lt;/a&gt;, I figured I should at least &lt;em&gt;try&lt;/em&gt; to migrate. I downloaded Play 2.0.1, created a new project and went to work.
&lt;/p&gt;
&lt;p&gt;The first thing I learned about &lt;em&gt;upgrading&lt;/em&gt; from Play 1.x to Play 2.x is &lt;em&gt;there&apos;s no such thing&lt;/em&gt;. It&apos;s like saying you upgraded from Struts 1 to Struts 2 or Tapestry 4 to Tapestry 5. It&apos;s a migration, with a whole new project.
&lt;/p&gt;
&lt;p id=&quot;evolutions&quot;&gt;&lt;strong&gt;Evolutions&lt;/strong&gt;&lt;br/&gt;
I started by looking around to see if anyone had documented a similar migration. I found two very useful resources right off the bat:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://janhelwich.wordpress.com/2012/03/13/play-2-0-with-scala-and-scaml-part1-setup-of-test-infrastructure-model-and-persistence-with-anorm/&quot;&gt;Play 2.0 with Scala and Scaml, Part1: Setup of test infrastructure, model and persistence with Anorm&lt;/a&gt; by Jan Helwich&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.jamesward.com/2012/02/21/play-framework-2-with-scala-anorm-json-coffeescript-jquery-heroku&quot;&gt;Tutorial: Play Framework 2 with Scala, Anorm, JSON, CoffeeScript, jQuery &amp;amp; Heroku&lt;/a&gt; by James Ward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From Jan&apos;s Blog, I learned to copy my evolutions from my Play 1.x project into &lt;em&gt;conf/evolutions/default&lt;/em&gt;. I changed my &lt;em&gt;application.conf&lt;/em&gt; to use PostgreSQL and wrote an EvolutionsTest.scala to verify creating the tables worked.
&lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
import org.specs2.mutable._

import play.api.db.DB
import play.api.Play.current

import anorm._

import play.api.test._
import play.api.test.Helpers._

class EvolutionsTest extends Specification {

  &quot;Evolutions&quot; should {
    &quot;be applied without errors&quot; in {
      evolutionFor(&quot;default&quot;)
      running(FakeApplication()) {
        DB.withConnection {
          implicit connection =&gt;
            SQL(&quot;select count(1) from athlete&quot;).execute()
            SQL(&quot;select count(1) from workout&quot;).execute()
            SQL(&quot;select count(1) from comment&quot;).execute()
        }
      }
      success
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;Then I began looking for how to load seed data with Play 2.x. In Play 1.x, you could use a BootStrap job that would load sample data with YAML.
&lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
import play.jobs._
import play.Play

@OnApplicationStart
class BootStrap extends Job {

  override def doJob() {

    import models._
    import play.test._

    // Import initial data if the database is empty
    if (Athlete.count().single() == 0) {
      Yaml[List[Any]](&quot;initial-data.yml&quot;).foreach {
        _ match {
          case a: Athlete =&gt; Athlete.create(a)
          case w: Workout =&gt; Workout.create(w)
          case c: Comment =&gt; Comment.create(c)
        }
      }
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;This is no longer a recommended practice in Play 2. Instead, they &lt;a href=&quot;https://groups.google.com/d/msg/play-framework/4pVUPZIRFFM/vh4nVQ-v9UcJ&quot;&gt;recommend you turn your YAML into code&lt;/a&gt;. 10 minutes later, I had a Global.scala that loaded seed data.
  &lt;/p&gt;
&lt;pre class=&quot;brush: scala&quot;&gt;
import models._
import play.api._
import play.api.Play.current

import anorm._

object Global extends GlobalSettings {

  override def onStart(app: Application) {
    InitialData.insert()
  }
}

/**
 * Initial set of data to be loaded
 */
object InitialData {

  def date(str: String) = new java.text.SimpleDateFormat(&quot;yyyy-MM-dd&quot;).parse(str)

  def insert() {

    if (Athlete.count() == 0) {

      Seq(
        Athlete(Id(1), &quot;mraible@gmail.com&quot;, &quot;beer&quot;, &quot;Matt&quot;, &quot;Raible&quot;),
        Athlete(Id(2), &quot;trishmcginity@gmail.com&quot;, &quot;whiskey&quot;, &quot;Trish&quot;, &quot;McGinity&quot;)
      ).foreach(Athlete.create)

      Seq(
        Workout(Id(1), &quot;Chainsaw Trail&quot;,
          &quot;&quot;&quot;
            A beautiful fall ride: cool breezes, awesome views and yellow leaves.

            Would do it again in a heartbeat.
          &quot;&quot;&quot;, 7, 90, date(&quot;2011-10-13&quot;), 1),
        Workout(Id(2), &quot;Monarch Lake Trail&quot;,
          &quot;Awesome morning ride through falling yellow leaves and cool fall breezes.&quot;,
          4, 90, date(&quot;2011-10-15&quot;), 1),
        Workout(Id(3), &quot;Creekside to Flume to Chainsaw&quot;,
          &quot;Awesome morning ride through falling yellow leaves and cool fall breezes.&quot;,
          12, 150, date(&quot;2011-10-16&quot;), 2)
      ).foreach(Workout.create)

      Seq(
        Comment(1, &quot;Jim&quot;, &quot;Nice day for it!&quot;),
        Comment(2, &quot;Joe&quot;, &quot;Love that trail.&quot;),
        Comment(2, &quot;Jack&quot;, &quot;Where there any kittens there?&quot;)
      ).foreach(Comment.create)
    }
  }
}
&lt;/pre&gt;
&lt;p id=&quot;anorm&quot;&gt;&lt;strong&gt;Anorm&apos;s Missing Magic&lt;/strong&gt;&lt;br/&gt;
Before starting with Play 2, I knew it had lost some of its magic. After all, the developers had mentioned they &lt;em&gt;wanted&lt;/em&gt; to get ride of the magic and moving to Scala allowed them to do that. However, I didn&apos;t think I&apos;d miss &lt;a href=&quot;http://www.playframework.org/modules/scala-0.9.1/anorm#AddingsomeMagicT&quot;&gt;Magic[T]&lt;/a&gt; as much as I do. Like &lt;a href=&quot;http://martinfowler.com/bliki/OrmHate.html&quot;&gt;Martin Fowler&lt;/a&gt;, I like ORMs and having to use SQL again seems painful. It seems like a strange shift for Play to reduce type-safety on the backend, but increase it in its templates. Oh well, to each their own. I may eventually move to &lt;a href=&quot;http://squeryl.org&quot;&gt;Squery&lt;/a&gt;, but I wanted to do a side-by-side comparison as part of my migration.
&lt;/p&gt;
&lt;p&gt;Using the aforementioned tutorial from James and Jan&apos;s blog posts, as well as Guillaume&apos;s &lt;a href=&quot;https://gist.github.com/2788715&quot;&gt;Play 2.0/Anorm&lt;/a&gt;, I set about creating new model objects. I wrote a bunch of SQL, typed up some &lt;a href=&quot;http://stackoverflow.com/questions/9371227/there-are-many-similar-dao-methods-in-anorm-is-it-right&quot;&gt;new finders&lt;/a&gt; and migrated my tests from ScalaTest to the new default, &lt;a href=&quot;http://etorreborre.github.com/specs2/&quot;&gt;specs2&lt;/a&gt;. The Mosh Pit&apos;s &lt;a href=&quot;http://tech.mindcandy.com/2012/05/migrating-a-play-1-2-website-to-play-2-0/&quot;&gt;Migrating a Play 1.2 website to Play 2.0&lt;/a&gt; was a great help in migrating tests.&lt;/p&gt;

&lt;p&gt;That&apos;s when I started &lt;a href=&quot;https://groups.google.com/d/topic/play-framework/-oJrmLWYGcg/discussion&quot;&gt;having issues&lt;/a&gt; with Anorm and figuring out how its parser syntax works. After struggling for a few days, I finally found &lt;a href=&quot;https://github.com/kenichiro22/yabe-play20-scala&quot;&gt;yabe-play20-scala&lt;/a&gt;. Since I&apos;d used the &lt;a href=&quot;http://www.playframework.org/documentation/1.2.3/guide1&quot;&gt;yabe tutorial from Play 1.x&lt;/a&gt;, it was familiar and helped me get past my problems. Now, things aren&apos;t perfect (Workouts aren&apos;t ordered by their posted date), but everything compiles and tests pass.
&lt;/p&gt;
&lt;p&gt;To illustrate how little code was required for Anorm 1.x, checkout &lt;a href=&quot;https://gist.github.com/2879214&quot;&gt;Workout.scala in Play 1.x vs. Play 2.x&lt;/a&gt;. The Play 1.x version is 66 lines; Play 2.x requires 193 lines. I don&apos;t know about you, but I kinda like a little magic in my frameworks to reduce the amount of code I have to maintain.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;I was pleasantly surprised by specs2. First of all, it was an easy migration from ScalaTest. Secondly, &lt;a href=&quot;http://www.playframework.org/documentation/2.0/ScalaTest&quot;&gt;Play&apos;s FakeApplication&lt;/a&gt; made it very easy to write unit tests. The line count on my &lt;a href=&quot;https://gist.github.com/2879222&quot;&gt;UnitTests.scala in Play 1.x vs. Play 2.x&lt;/a&gt; is almost identical.
&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;summary&quot;&gt;&lt;/a&gt;
&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
The first few hours of developing with Play 2 were frustrating, mostly because I felt like I had to learn everything over again. However, I was pleased to find good references on migrating from Play 1.x. Last night, I migrated all my Controllers, integrated Scalate and got most of my views rendering. I still have issues &lt;a href=&quot;https://groups.google.com/d/msg/play-framework/J3lXeRyti4M/UjzzYJnMAuQJ&quot;&gt;rendering validation errors&lt;/a&gt;, but I hope to figure that out soon. The last 2 hours have been &lt;em&gt;much&lt;/em&gt; more fun and I feel like my Scala skills are coming along. I think if the Play Team could eliminate those first few hours of struggling (and provide almost instant joy like Play 1.x) they&apos;d really be onto something.
&lt;/p&gt;
&lt;p&gt;As soon as I figure out how to validation and how to add a body class based on the URL, I&apos;ll write another post on the rest of my migration. A Play 2-compatible version of &lt;a href=&quot;https://github.com/jaliss/securesocial&quot;&gt;SecureSocial&lt;/a&gt; just came out this evening, so I may integrate that as well. In the meantime, I&apos;ll be working on the iPhone app and finishing up a Grails 2 application for James Ward and my &lt;a href=&quot;http://uberconf.com/conference/denver/2012/06/session?id=25584&quot;&gt;Grails vs. Play Smackdown&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/deploying_java_and_play_framework</id>
        <title type="html">Deploying Java and Play Framework Apps to the Cloud with James Ward</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/deploying_java_and_play_framework"/>
        <published>2011-11-18T08:14:45-07:00</published>
        <updated>2011-12-02T20:23:49-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sbt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springroo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scala" scheme="http://roller.apache.org/ns/tags/" />
        <category term="heroku" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx2011" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jamesward" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Yesterday, I attended &lt;a href=&quot;http://www.jamesward.com/&quot;&gt;James Ward&lt;/a&gt;&apos;s presentation on &lt;a href=&quot;http://www.devoxx.com/pages/viewpage.action?pageId=5015973&quot;&gt;Deploying Java &amp;amp; Play Framework Apps to the Cloud&lt;/a&gt; at Devoxx. I arrived a bit late, but still managed to get there in time to see a lot of demos and learn more about &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt;. Below are my notes from James&apos;s talk.
&lt;/p&gt;
&lt;p&gt;When I arrived, James was doing a demo using &lt;a href=&quot;http://www.springsource.org/spring-roo&quot;&gt;Spring Roo&lt;/a&gt;. He was using Roo&apos;s Petclinic sample app and showed us how you could use Git to create a local repository of the new project and install Heroku&apos;s command line tool. From there, he ran the following command to create a new application on Heroku.
&lt;/p&gt;
&lt;pre&gt;heroku create -s cedar&lt;/pre&gt;
&lt;p&gt;The &lt;a href=&quot;http://devcenter.heroku.com/articles/cedar&quot;&gt;Cedar Stack&lt;/a&gt; is what supports Java, Scala and Play Framework. It&apos;s the 3rd generation stack for Heroku. The command above created two endpoints, one for HTTP and one for Git. It picks from a list of randomly generated names, which all seem to have some humor in them. James ended up with &quot;electric-sword-8877&quot; for this demo.&lt;/p&gt;
&lt;p&gt;From there, he ran &lt;code&gt;git push heroku master&lt;/code&gt; to deploy the project to Heroku. Unfortunately, this resulted in a login error and there was an akward moment where we all thought the Demo Gods were angry. However, James was able to resolve this by using Heroku&apos;s sharing feature with the following command.
&lt;/p&gt;
&lt;pre&gt;
heroku sharing:add jw@heroku.com
&lt;/pre&gt;
&lt;p&gt;For Java projects, Heroku looks for a pom.xml file in the root directory and runs a Maven build on project. All the dependencies get downloaded on the cloud rather than put them into a WAR and requiring you to upload a large WAR file. You don&apos;t have to upload your source code to Heroku; James did it for the sake of the demo because it was faster.
&lt;/p&gt;
&lt;p&gt;After the build finishes, it creates a &lt;em&gt;slug&lt;/em&gt; file. This file contains everything Heroku needs to run your application. 
&lt;p&gt;Next, James showed a demo of the running application and added a new Pet through its UI. Then he scaled it to two servers using the following command:
&lt;/p&gt;
&lt;pre&gt;
heroku scale web=2
&lt;/pre&gt;
&lt;p&gt;
He proved this was working by running &lt;code&gt;heroku ps&lt;/code&gt;, which showed there were two running processes. He showed the app again, but noted that the record he added was missing. This is because when it started up a new dyno, Hibernate created the schema again and deleted all records. To fix, James changed Hibernate to only update the schema instead of create a new one. If you&apos;re a Hibernate user, you know this is as simple as changing:
&lt;/p&gt;
&lt;pre&gt;
hibernate.hbm2ddl.auto=create
&lt;/pre&gt;
&lt;p&gt;to:
&lt;pre&gt;
hibernate.hbm2ddl.auto=update
&lt;/pre&gt;
&lt;p&gt;After committing this change, James redeployed using Git.
&lt;/p&gt;
&lt;pre&gt;
git push heroku master
&lt;/pre&gt;
&lt;p&gt;The slug file got built again and Heroku deployed the new slug onto both dynos, automatically load balancing the app across two servers. James then ran &lt;code&gt;heroku logs&lt;/code&gt; to see the logs of his dynos and prove that a request to his app&apos;s HTTP endpoint made requests to both dynos. The logging is powered by &lt;a href=&quot;https://github.com/heroku/logplex&quot;&gt;Logplex&lt;/a&gt; and you can read about how it works in the article &lt;a href=&quot;http://blog.heroku.com/archives/2010/12/13/logging/&quot;&gt;Heroku Gets Sweet Logging&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;James mentioned that Roo has a Heroku plugin, but after watching his talk and searching a bit on the internet, it seems it&apos;s just the jetty-runner setup as described in &lt;a href=&quot;http://devcenter.heroku.com/articles/spring-mvc-hibernate&quot;&gt;Getting Started with Spring MVC Hibernate on Heroku/Cedar&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
What about autoscaling? There are some 3rd party tools that do this. Heroku&apos;s Management infrastructure has APIs that these tools talk too. Heroku hasn&apos;t built autoscaling into the platform because they don&apos;t know where the bottlenecks are in your application.
&lt;/p&gt;
&lt;p&gt;
Heroku = Polyglot + PaaS + Cloud Components. It supports Ruby, node.js, Java, Clojure, Play and Scala and they&apos;re working on native Grails and Gradle support. There&apos;s currently 534,374 apps running on Heroku.
&lt;/p&gt;
&lt;p&gt;
Heroku is a cloud application platform and there&apos;s 5 different components. 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Instant deployment&lt;/li&gt;
&lt;li&gt;HTTP Routing / Load Balancing&lt;/li&gt;
&lt;li&gt;Elastic Polyglot Runtime&lt;/li&gt;
&lt;li&gt;Management &amp;amp; Logging&lt;/li&gt;
&lt;li&gt;Component as a Service Ecosystem&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
For instant deployment, it&apos;s a pretty simple process:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;You add files to a git repo&lt;/li&gt;
&lt;li&gt;You provision the app on Heroku (heroku create)&lt;/li&gt;
&lt;li&gt;You upload the files to Heroku (git push heroku master)&lt;/li&gt;
&lt;li&gt;Heroku runs the build and assembles a &quot;slug&quot; file&lt;/li&gt;
&lt;li&gt;Heroku starts a &quot;dyno&quot;&lt;/li&gt;
&lt;li&gt;Heroku copies the &quot;slug&quot; to the &quot;dyno&quot;&lt;/li&gt;
&lt;li&gt;Heroku starts the web application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most apps will contain a &lt;em&gt;Procfile&lt;/em&gt; that contains information about how to run the web process. For Spring Roo, it has:
&lt;/p&gt;
&lt;pre&gt;
web: java $JAVA_OPTS -jar target/dependency/jetty-runner.jar --port $PORT target/*.war
&lt;/pre&gt;
&lt;p&gt;So how does Heroku decide what application server to use? It doesn&apos;t, you do. You need to get your application server into the slug file. 
The easiest way to do this is to specify your application server as a dependency in your pom.xml. In the Roo example, James uses the maven-dependency-plugin to get the jetty-runner dependency and copy it to the target directory. On Heroku, you bring your application server with you.
&lt;/p&gt;
&lt;p&gt;Heroku gives you 750 free dyno hours per app, per month. For developers, it&apos;s very easy to get started and use. Once you extend past one dyno, it&apos;s
  $.05 per dyno hour, which works out to around $30/month.

It&apos;s only when you want to scale beyond one dyno where you get charged by Heroku, no matter how much data you transfer.

&lt;a href=&quot;http://www.scalatest.org/&quot;&gt;Scalatest&lt;/a&gt; is running on Heroku. It has one dyno and is doing fine with that. Bill Venners doesn&apos;t have to pay anything for it.
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://java.herokuapp.com&quot;&gt;java.herokuapp.com&lt;/a&gt; is a site James created that allows you to clone example apps and get started quickly with Heroku&apos;s Cedar Stack.&lt;/p&gt;
&lt;p&gt;
For 
HTTP Routing, 
Heroku uses an Erlang-based routing system to route all the HTTP requests across your dynos. Heroku doesn&apos;t support sticky sessions. Distributed session management does not work well, because it does not scale well. Heroku recommends you use a stateless web architecture or move your state into something like &lt;a href=&quot;http://memcached.org/&quot;&gt;memcached&lt;/a&gt;. Jetty has (in the latest version) the ability to automatically serialize your session into a Mongo system. This works fine on Heroku. The problem with this is if you have 2 dynos running, each request can hit a different dyno and get different session state. Hence the recommendation for an external storage mechanism that can synchronize between dynos.
&lt;/p&gt;
You can also run non-web applications on Heroku. You can have one web process, but as many non-web processes as you want.
&lt;/p&gt;
&lt;p&gt;Heroku has native support for the &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play framework&lt;/a&gt;. To detect Play applications, it look for a &lt;em&gt;conf/application.conf&lt;/em&gt; file. You don&apos;t need to have a Procfile in your root directory because Heroku knows how to start a Play application.
&lt;/p&gt;
&lt;p&gt;At this point, James created a new Play application, created a new Heroku app (he got &quot;young-night-7104&quot; this time) and pushed it to Heroku. He created a simple model object, a controller to allow adding new data and then wrote some jQuery to show new records via Ajax and JSON. He also showed how to configure the application to talk to Heroku&apos;s PostgreSQL database using the DATABASE_URL environment variable. He explained how you can use the &lt;code&gt;heroku config&lt;/code&gt; command to see your environment variables.
&lt;/p&gt;
&lt;p&gt;
The reason they use environment variables is so Heroku can update DATABASE_URL (and other variables) without having to call up all their customers and have them change them in their source code.
&lt;/p&gt;
&lt;p&gt;
Play on Heroku supports Scala if you create your app with Scala. Play 2.0 uses Scala, Akka and SBT. Heroku added support for SBT a couple month ago, so everything will work just fine.
&lt;/p&gt;
&lt;p&gt;Heroku also supports Scala, detecting it by looking for the &lt;code&gt;build.sbt&lt;/code&gt; file in the root directory. Heroku supports SBT 0.11.0 and it builds the &apos;stage&apos; task.
It currently does not support Lift because Lift uses an older version of SBT and because it&apos;s a very stateful framework that would require sticky sessions. Use Play, &lt;a href=&quot;https://github.com/jdegoes/blueeyes&quot;&gt;BlueEyes&lt;/a&gt; or &lt;a href=&quot;http://www.scalatra.org/&quot;&gt;Scalatra&lt;/a&gt; if you want Scala on Heroku.
&lt;/p&gt;
&lt;p&gt;Heroku has &lt;a href=&quot;http://addons.heroku.com&quot;&gt;addons&lt;/a&gt; for adding functionality to your application, including Custom DNS, HTTPS, Amazon RDS, NoSQL and many more. They&apos;re also working on making their add-on and management APIs available via Java, so you&apos;ll (hopefully) be able to use them from your IDE in the future.
&lt;/p&gt;
&lt;p&gt;From there, James showed us how Heroku keeps slug files around so you can do rollbacks with &lt;code&gt;heroku rollback&lt;/code&gt;. He also showed how you can use:
&lt;/p&gt;
&lt;pre&gt;heroku run &quot;your bash command&quot;&lt;/pre&gt;
to run any Bash command on the cloud.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br&gt;
I attended James&apos;s talk because he&apos;s a good friend, but also because I&apos;ve been using Heroku to host &lt;a href=&quot;http://raibledesigns.com/rd/entry/phonegap_to_the_rescue&quot;&gt;my latest adventures with Play, Scala, CoffeeScript and Jade&lt;/a&gt;. I&apos;m glad I attended because I learned some good tips and tricks and more about how Heroku works. 
&lt;/p&gt;
&lt;p&gt;Heroku seems like a great development tool to me. In my experience, it&apos;s been really nice to have instant deployments using Git. In fact, I&apos;ve created a &apos;push&apos; alias so I can push to my project&apos;s repo and heroku at the same time.
&lt;/p&gt;
&lt;pre&gt;
alias push=&apos;git push origin master &amp;&amp; git push heroku master&apos;
&lt;/pre&gt;
&lt;p&gt;I&apos;d like to see more organizations embrace something like Heroku for developers. It&apos;d be great if everyone had their own sandbox that business owners and product managers could see. I can&apos;t help but think this would be awesome for demos, prototyping, etc.
&lt;/p&gt;
&lt;p&gt;
There were some other talks I wanted to attend at the same time, particularly Martin Odersky&apos;s &lt;a href=&quot;http://www.devoxx.com/pages/viewpage.action?pageId=5015952&quot;&gt;What&apos;s in store for Scala?&lt;/a&gt; and &lt;a href=&quot;http://www.devoxx.com/display/DV11/WWW++World+Wide+Wait++A+Performance+Comparison+of+Java+Web+Frameworks&quot;&gt;WWW: World Wide Wait? A Performance Comparison of Java Web Frameworks&lt;/a&gt;. The WWW talk has &lt;a href=&quot;http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/&quot;&gt;posted their presentation&lt;/a&gt; but I&apos;m sure it&apos;d be more fun to watch. 
&lt;/p&gt;
&lt;p&gt;
It&apos;s pretty awesome that all the talks from Devoxx 2011 will be up on &lt;a href=&quot;http://www.parleys.com/&quot;&gt;Parleys.com&lt;/a&gt; soon.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; James has &lt;a href=&quot;http://www.jamesward.com/2011/11/29/heroku-preso-from-devoxx-2011&quot;&gt;posted his slides&lt;/a&gt; from this talk.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/new_macbook_pro_and_imac</id>
        <title type="html">New MacBook Pro and iMac</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/new_macbook_pro_and_imac"/>
        <published>2011-11-06T18:10:17-07:00</published>
        <updated>2011-11-07T00:14:50-07:00</updated> 
        <category term="/Mac OS X" label="Mac OS X" />
        <category term="imac" scheme="http://roller.apache.org/ns/tags/" />
        <category term="apple" scheme="http://roller.apache.org/ns/tags/" />
        <category term="macbookpro" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hardware" scheme="http://roller.apache.org/ns/tags/" />
        <category term="developerhappiness" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Almost a month ago, I wrote about how I was hoping to &lt;a href=&quot;http://raibledesigns.com/rd/entry/increasing_my_developer_happiness&quot;&gt;increase my developer happiness&lt;/a&gt; by getting a new iMac and MacBook Pro. I received a lot of good advice in the comments and proceeded to order place my order with the Business Group at the &lt;a href=&quot;http://www.apple.com/retail/aspengrove/&quot;&gt;Aspen Grove Apple Store&lt;/a&gt; the following Monday. I have to admit, the paperwork to get a lease on the equipment was kinda painful, but I was happy to get a 7% discount for being a business customer. It took until Wednesday for my order to be placed and everything started shipping the following weekend.&lt;/p&gt;
&lt;p&gt;To make my new machines as fast as possible, I purchased &lt;a href=&quot;http://eshop.macsales.com/shop/turnkey/iMac_2011/UpgradeInstall&quot;&gt;OWC&apos;s Turnkey Upgrade Program&lt;/a&gt; for my iMac, with the 240GB OWC Mercury EXTREME Pro 6G SSD and 16GB RAM. I also ordered a 480GB Pro 6G SSD and 8GB RAM for my laptop. I received the laptop about two weeks ago and the iMac a few days later. Instead of building my new laptop from my old one, I chose to simply use Lion and copy all my apps and data over manually. I sent the iMac to OWC as soon as I received it and got it back about 3 days later. I was out of town on business last week, and when I arrived home Thursday night, I found all my new equipment waiting for me. I built my iMac by cloning the drive from my laptop and installed the new SSD and memory into my new laptop.&lt;/p&gt;
&lt;p&gt;For the last week, I&apos;ve been very happy with the speed improvements and the wicked fast snappiness of opening apps, compiling programs and IntelliJ indexing in only a few seconds. However, on October 24th, I received a strange email from &lt;em&gt;Aspen Grove Business&lt;/em&gt; with the subject &lt;strong&gt;MacBook Pro Price Reduction&lt;/strong&gt;. I quickly replied, asking if new MacBook Pro&apos;s came out in the last couple days. I received no response, but learned a couple days ago that indeed they had. One of my office mates bought a new machine and said he got a 2.5GHz processor, while mine had a 2.3GHz.&lt;/p&gt;
&lt;p&gt;Today, I packed up my new laptop and drove down to the Aspen Grove store to see if I could exchange it for a faster one. They hesitantly agreed to exchange it, as long as I put the original hard drive and memory back into it. I drove to my office, which was only a couple miles away in downtown Littleton. I put in the original disk and memory back in and returned to the Apple Store. 20 minutes later, I was walking out with a new, new MacBook Pro and happy to get the fastest Apple laptop on the market. The funny thing about this experience is it&apos;s the 3rd time in a row I&apos;ve experienced buying an Apple laptop and returning it shortly after for a newer one. My &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_15_macbook_pro_with&quot;&gt;last laptop purchase&lt;/a&gt; (March 2009) and Trish&apos;s 13&quot; MacBook Pro (in March) were the first two.&lt;/p&gt;
&lt;p&gt;I&apos;m writing this post to thank Apple for having such great customer service. I&apos;ve been very close to experiencing buyer&apos;s remorse (because I missed laptop upgrades by a few days) and Apple has always been very gracious in helping me out. In fact, with this latest purchase, they said there was a $400 difference between my two-week-old laptop and the latest 2.5GHz. Then they only charged me $50 for &quot;being such a great business customer&quot;.&lt;/p&gt;
&lt;p&gt;Thanks Apple, &lt;em&gt;you rock!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/hyperproductive_jsf_2_0_with</id>
        <title type="html">Hyperproductive JSF 2.0 with Ed Burns at Jazoon</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/hyperproductive_jsf_2_0_with"/>
        <published>2011-06-23T04:53:10-06:00</published>
        <updated>2011-06-23T10:53:10-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="edburns" scheme="http://roller.apache.org/ns/tags/" />
        <category term="productivity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jazoon" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf2" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This morning, I attended Ed Burn&apos;s Talk on &lt;a href=&quot;http://jazoon.com/Conference/Thursday-23-June/Edward-John-Burns&quot;&gt;Hyperproductive JSF 2.0&lt;/a&gt; at &lt;a href=&quot;http://jazoon.com&quot;&gt;Jazoon&lt;/a&gt;. As you might know, I&apos;ve been a critic of JSF for many years. However, it is &lt;a href=&quot;http://www.zeroturnaround.com/java-ee-productivity-report-2011/&quot;&gt;one of the most used Java web frameworks&lt;/a&gt;, so I was hoping to learn how it&apos;s improved in the latest version. Below are my notes from Ed&apos;s presentation.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
Ed&apos;s Plan for our Time Investment:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define a productive development environment&lt;/li&gt;
&lt;li&gt;JSF for greenfield and brownfield projects&lt;/li&gt;
&lt;li&gt;List the top 9 productivity killers with JSF projects and solutions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;&quot;I am always doing that which I cannot do, in order that I may learn how to do it.&quot; -- Pablo Picasso&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
Software is an executable representation of knowledge, a byproduct of learning how to solve a problem. Knowledge is something that changes as more information comes in. A productive environment makes it as easy as possible to learn how to solve a problem. Learning is an iterative process. Early iterations don&apos;t need to be optimal. Later iterations do ... and they need to be maintainable. &lt;em&gt;First&lt;/em&gt; is the hardest. &lt;em&gt;Fast&lt;/em&gt; iterations are they key. Spring Roo and Play are examples of frameworks that make the first iteration very fast.
&lt;/p&gt;
&lt;p&gt;
You should use a tool to jumpstart JSF development: copy from an old project, use a Maven archetype or use your IDE. With greenfield development, you don&apos;t have to bother learning the byproduct of other people&apos;s learning. It&apos;s a great opportunity to pad your resume with the latest hot technologies. With brownfield development, it&apos;s vitally important to understand the existing solution and hidden assumptions. You&apos;re also much more constrained in your technology choices. If you want to change, you&apos;ll need to come up with a migration strategy, which can be difficult. JSF works well for both because it&apos;s not just a runtime framework, it&apos;s also a conceptual framework. You need to understand how your framework handles data conversion, validation, page flow, persistence integration, I18N, L10N, A11Y, Web standards and user friendliness. 
&lt;/p&gt;
&lt;p&gt;
Top 9 JSF Productivity Killers:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Time wasting deployment step&lt;/li&gt;
&lt;li&gt;The perils of &quot;there&apos;s more than one way to do it&quot;&lt;/li&gt;
&lt;li&gt;Lengthy and painful developer on-boarding process&lt;/li&gt;
&lt;li&gt;Misused logging and misunderstood error messages&lt;/li&gt;
&lt;li&gt;Phantoms&lt;/li&gt;
&lt;li&gt;Under-utilized developer tools&lt;/li&gt;
&lt;li&gt;Premature optimization&lt;/li&gt;
&lt;li&gt;Difficulty in doing TDD&lt;/li&gt;
&lt;li&gt;Lack of an app framework&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
&lt;strong&gt;Time wasting deployment step&lt;/strong&gt;&lt;br/&gt;
ZeroTurnaround solves this problem with JRebel, but there&apos;s other ways to do it. Some of the killers of flow state: 1) one large war file, 2) underutilizing dynamic language features, 3) complex server environment and 4) build process is redoing work unnecessarily. To stop the time wasting deployment step, the most important things you can do are as follows:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure your IDE correctly. In Eclipse, compile directly into WEB-INF/classes and use continuous compilation. With NetBeans, use GlassFish.&lt;/li&gt;
&lt;li&gt;Don&apos;t do control-flow programming in XML.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Ed then showed a simple demo that showed how you can use Groovy to create a JSF UI Component. He also mentioned that Groovy can be used to author any JSF artifact. The benefit of this is you can simply edit and save a .groovy file without having to recompile or redeploy. Unfortunately, using Groovy didn&apos;t eliminate the XML syntax for pages or the XML for defining UI components. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;The perils of &quot;there&apos;s more than one way to do it&quot;&lt;/strong&gt;&lt;br/&gt;
JSF is very flexible, but flexibility is, more often than not, abused. There&apos;s a lack of convention for common things (e.g. master-detail, JSF concepts like converter, validator, etc.). The best way to fix this is to establish the norms for a project and stick with them. For example, Neil Griffin has a &lt;a href=&quot;http://www.liferay.com/web/neil.griffin/blog/-/blogs/making-distinctions-between-different-kinds-of-jsf-managed-beans&quot;&gt;good blog entry&lt;/a&gt; for the different kind of managed beans you can create. Develop recommendations like Neil&apos;s and use them on all your projects.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Lengthy developer on-boarding process&lt;/strong&gt;&lt;br/&gt;
Stick with standards when possible (at least have a common project description and build system across projects). Be committed to periodic cleanup cycles, including documenting for re-use. Pick one JSF component library and stick with it. Support for mixing and switching component libraries has improved with JSF 2, but it&apos;s still recommended you use only one.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Misused logging and misunderstood error messages&lt;/strong&gt;&lt;br/&gt;
JSF is notorious for cryptic error messages and very long stack traces. It&apos;s still a problem, but the JSF Team is still working on improving them. Good tip: use the &amp;lt;ui:debug&gt; tag. Its &lt;em&gt;recordStateSize=&quot;true&quot;&lt;/em&gt; attribute can be especially useful. If you&apos;re using &lt;a href=&quot;http://www.primefaces.org/&quot;&gt;PrimeFaces&lt;/a&gt;, add &lt;em&gt;trace=true&lt;/em&gt; to request URLs.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Phantoms&lt;/strong&gt;&lt;br/&gt;
Phantoms is when running code is not the same as the code you are modifying or wrong version of library gets picked up. You should have the capability to hit breakpoints anywhere in your entire software stack, including core Java sources. This is one of the most useful things about open source software. Solutions to phantoms: 1) put a timestamp on every redeploy and have the timestamp appear in the system log 2) write the running library stack to the system log (each library and version being used) and make it easy to compare one developer&apos;s runtime stack with another&apos;s 3) consider doing all work in tightly controlled VMs (checkout the VM at the beginning of the day, do your work, commit your changes and throw your VM away at the end of the day). 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Under-utilizing developer tools&lt;/strong&gt;&lt;br/&gt;
Make sure everyone has the fastest machines available and as much screen real estate as desired. Hardware is much cheaper than developer time. Another tip is to use Hudson as your butler. It&apos;s not just the team CI server. In other words, take advantage of automation wherever you can.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Premature Optimization&lt;/strong&gt;&lt;br/&gt;
Keep in mind the trade-offs between readability and performance. When using frameworks such as JSF, don&apos;t try to outsmart the implementation. Rather, use the framework as intended and use open-source contributions to treat performance problems. Example, EL expressions got a lot faster between EE5 and EE6. If you spent time trying to optimize EL expressions, you might&apos;ve been wasting your time.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Difficulty in doing TDD&lt;/strong&gt;&lt;br/&gt;
Try to figure out why TDD is difficult in your company. For JSF, strongly consider JBoss&apos;s &lt;a href=&quot;http://www.jboss.org/jsfunit&quot;&gt;JSFUnit&lt;/a&gt;. Write your testcases to extend from Cactus ServletTestCase and leverage &lt;a href=&quot;http://htmlunit.sourceforge.net/&quot;&gt;HtmlUnit&lt;/a&gt; (JSFUnit does this for you).
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Lack of an app framework&lt;/strong&gt;&lt;br/&gt;
Create common components: login panel, CRUD components, etc. If you don&apos;t have an app framework, build one over time. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
This was an interesting talk by Ed. The dynamics of the room where a bit interesting. Jazoon is held in a movie theater, much like Devoxx. However, it appears there&apos;s a spotlight on the speaker that makes it very difficult to see the audience. I don&apos;t remember having this problem at Devoxx. Ed asked the audience quite a few questions, but it seemed he had a lot of difficulty in seeing if folks raised their hands. This made for some periods of awkward silence.
&lt;/p&gt;
&lt;p&gt;
Personally, I was hoping to learn some new whizbang tips about JSF that I was not aware of. Unfortunately, I didn&apos;t learn anything new and wasn&apos;t that impressed with the Groovy demo. 
&lt;/p&gt;
&lt;p&gt;
I think Ed&apos;s tips about things outside of JSF were good, especially buying developers good hardware. I&apos;ve seen many companies, including my &lt;a href=&quot;http://www.overstock.com&quot;&gt;current client&lt;/a&gt;, skimp on developer hardware and cause developer frustration because of it. I think it&apos;s great when companies provide developers top-of-the-line hardware and eliminate frustration over CPU and memory resources. LinkedIn and Time Warner Cable both provide their developers with Mac Pros and MacBook Pros as well as huge monitors. IMO, this is one of the best benefits you can provide your engineers.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/2010_a_year_in_review</id>
        <title type="html">2010 - A Year in Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/2010_a_year_in_review"/>
        <published>2011-01-10T11:42:01-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="yearinreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="newyear" scheme="http://roller.apache.org/ns/tags/" />
        <category term="blogging" scheme="http://roller.apache.org/ns/tags/" />
        <category term="2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">2010 was a heckuva year, possibly one of my all-time favorites. It started with lots of &lt;a href=&quot;http://raibledesigns.com/rd/entry/2009_a_year_in_review&quot;&gt;anticipated fun&lt;/a&gt; and ended with lots of travel, skiing and relaxing and I&apos;m only just now finding time to write this post. I had a lot of goals when I started 2010; the top two being my favorite:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Happiness&lt;/li&gt;
&lt;li&gt;Girl&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest of my goals involved running, skiing, mountain biking and finishing The Bus. I also had some professional goals that involved open source, conferences, publishing articles and learning new technologies. I accomplished about 75% of my personal goals and 50% of my professional goals. I&apos;m pretty happy with these percentages considering how much fun I had last year.
&lt;/p&gt;
&lt;p&gt;In December 2009, I started working with &lt;a href=&quot;http://www.timewarnercable.com&quot;&gt;Time Warner Cable&lt;/a&gt; as their Chief Architect of Web Development. I was hired to help them build a team of hard-working developers that could quickly build their online video presence. In January, we started getting our ducks in a row with some &lt;a href=&quot;http://properosolutions.com/services/&quot;&gt;Agile Training&lt;/a&gt; in Virginia, followed by hiring some Agile Coaches. The only technical post I had during this process was about &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_your_preferred_development&quot;&gt;development infrastructure stacks&lt;/a&gt;. Both at TWC and my current gig, I&apos;ve found myself enjoying the following stack:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Source Control: &lt;strong&gt;SVN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Source Viewer: &lt;strong&gt;FishEye&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Wiki: &lt;strong&gt;Confluence&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bug Tracker: &lt;strong&gt;JIRA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Continuous Integration: &lt;strong&gt;Hudson&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We tried Git for a couple months at TWC, but ended up reverting to SVN after we had &quot;code deleted&quot; issues during one of our most intense development cycles. When the kids and I weren&apos;t skiing, we worked on documenting &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_be_a_super&quot;&gt;How to be a Super Hero&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/upside_down_man_saves_the&quot;&gt;The Adventures of Upside Down Man&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In February, I &lt;a href=&quot;http://raibledesigns.com/rd/entry/reviews_for_grails_a_quick&quot;&gt;refreshed my Grails knowledge&lt;/a&gt;, later learning that it was tough to teach Grails to developers that didn&apos;t know Java. First of all, a lot of Grails and Groovy books are targeted at Java Developers. Secondly, the developers I was trying to sell it to had more interest in learning Java. Since I failed to sell Grails, we ended up using Spring + jQuery to build our app. I don&apos;t think was a bad decision as most of our development ended up being UI: ActionScript/Flex, Objective-C and jQuery/HTML.&lt;/p&gt;
&lt;p&gt;My &lt;a href=&quot;http://raibledesigns.com/rd/entry/17_macbook_pro_stolen_from&quot;&gt;laptop was stolen from my living room&lt;/a&gt; in early February. It worked out nicely in the end since I didn&apos;t lose any data (thanks to good backups) and my business insurance covered the loss. My parents came out and helped me finish &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_guest_room_remodel_is&quot;&gt;remodeling my guest room&lt;/a&gt;. I posted about &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_future_of_web_frameworks&quot;&gt;My Future of Web Frameworks Presentations&lt;/a&gt; and became a proud father when &quot;&lt;a href=&quot;http://raibledesigns.com/rd/entry/jack_s_skiing_like_a&quot;&gt;Jack was flying past both Abbie and I and giggling while doing it&lt;/a&gt;&quot;.&lt;/p&gt;
&lt;p&gt;By the beginning of March, we&apos;d &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_we_hired_a_team&quot;&gt;hired a team of 10 at TWC&lt;/a&gt; and I &lt;a href=&quot;http://raibledesigns.com/rd/entry/fantastic_fun_in_jackson_hole&quot;&gt;took a trip to Jackson Hole&lt;/a&gt; to celebrate.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
The thing I enjoyed the most about this trip was how well the group &lt;em&gt;jelled&lt;/em&gt;. Kudos to Chris for assembling such an awesome group and putting such a spectacular trip together. Can&apos;t wait for next year. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4015/4414627855_f2b8c7c794.jpg&quot; title=&quot;Top o&apos; Jackson Hole&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4015/4414627855_f2b8c7c794_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Top o&apos; Jackson Hole&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The next week, I flew to Las Vegas for The ServerSide Java Symposium and enjoyed sessions on &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_cloud_computing_continuum_with&quot;&gt;Cloud&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/developing_rich_web_service_apis&quot;&gt;Web Service APIs&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/highly_interactive_software_with_java&quot;&gt;Flex&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_new_in_spring&quot;&gt;Spring 3&lt;/a&gt; and Cameron&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/c_java_and_net_lessons&quot;&gt;Lessons Learned from the Internet Age&lt;/a&gt;. I posted my &lt;a href=&quot;http://raibledesigns.com/rd/entry/tssjs_2010_presentations_and_summary&quot;&gt;Future of Web Frameworks and GWT vs. Flex Smackdown presentations&lt;/a&gt; after the conference.&lt;/p&gt;
&lt;p&gt;I ended March with &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_trifecta_3_resorts_in&quot;&gt;The Trifecta&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm3.static.flickr.com/2728/4472155910_2a87f5e811.jpg&quot; title=&quot;You are about to experience Copper&apos;s High Alpine&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2728/4472155910_2a87f5e811_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;You are about to experience Copper&apos;s High Alpine&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4061/4472157278_0ed25a10fc.jpg&quot; title=&quot;Nice ride up Storm King&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4061/4472157278_0ed25a10fc_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Nice ride up Storm King&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm3.static.flickr.com/2772/4472157540_503893a227.jpg&quot; title=&quot;Spaulding Bowl&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2772/4472157540_503893a227_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Spaulding Bowl&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm3.static.flickr.com/2732/4472157796_ef3a358c8f.jpg&quot; title=&quot;View from Enchanted Forest&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2732/4472157796_ef3a358c8f_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;View from Enchanted Forest&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;&lt;p&gt;For Easter, I purchased an iPad and &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_ipad_review&quot;&gt;reviewed it a few days later&lt;/a&gt;. Seven months later, I&apos;m not enthralled with the iPad, but I do think it&apos;s a heckuva lot better than the Galaxy Tab. I don&apos;t use it much, except for movies when traveling. My kids are its primary users, mostly using it for games and Netflix. 
&lt;/p&gt;
&lt;p&gt;We visited my parents in Oregon and &lt;a href=&quot;http://raibledesigns.com/rd/entry/celebrating_my_mom_s_retirement&quot;&gt;celebrated my Mom&apos;s retirement&lt;/a&gt;.

&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4039/4583410595_074720572f.jpg&quot; title=&quot;Huckleberry Aficionado&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4039/4583410595_074720572f_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Huckleberry Aficionado&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3327/4584043110_78188e39cf.jpg&quot; title=&quot;Oregon Garden Brewfest&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3327/4584043110_78188e39cf_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Oregon Garden Brewfest&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4002/4584043518_074d446180.jpg&quot; title=&quot;Happy Beer Drinkers&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4002/4584043518_074d446180_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Happy Beer Drinkers&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4052/4583418495_8703f271f0.jpg&quot; title=&quot;Old Friends&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4052/4583418495_8703f271f0_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Old Friends&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The picture I took of my Mom and Abbie that weekend is one of my all-time favorites.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4009/4584047006_4323c67012.jpg&quot; title=&quot;Abbie and Mimi&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4009/4584047006_4323c67012_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Abbie and Mimi&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;/p&gt; 
&lt;p&gt;
At the end of April, I said &lt;a href=&quot;http://raibledesigns.com/rd/entry/farewell_to_the_2009_2010&quot;&gt;farewell to the ski season&lt;/a&gt;, getting in 25 days; a personal best. I&apos;m happy to report I have 10 days in so far this year, so my goal of 30 days looks to be well on track. No helicopter attempts yet, but hopefully soon.&lt;/p&gt;
&lt;p&gt;I ended the month with a work trip to Seattle and &lt;a href=&quot;http://raibledesigns.com/rd/entry/thanks_to_seattle_for_a&quot;&gt;painting the town red with my sister and Mya&lt;/a&gt;. &lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4048/4585489353_cfe91a8aec.jpg&quot; title=&quot;Sweet Seats at the Mariner&apos;s Game&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4048/4585489353_cfe91a8aec_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Sweet Seats at the Mariner&apos;s Game&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4044/4585489443_6d290c0a7b.jpg&quot; title=&quot;Rally Caps!&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4044/4585489443_6d290c0a7b_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Rally Caps!&quot; style=&quot;border: 1px solid black;margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4012/4585491717_0de23a17b7.jpg&quot; title=&quot;Midnight&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4012/4585491717_0de23a17b7_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Midnight&quot; style=&quot;border: 1px solid black;margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3319/4586117300_9bf3d4c6c8.jpg&quot; title=&quot;Wheeeeee!!&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3319/4586117300_9bf3d4c6c8_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Wheeeeee!!&quot; style=&quot;border: 1px solid black;margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I returned to Denver and &lt;a href=&quot;http://twitter.com/#!/mraible/status/13172187335&quot;&gt;turned off my TV for a month&lt;/a&gt;. I &lt;a href=&quot;http://raibledesigns.com/rd/entry/life_without_tv&quot;&gt;wrote about my experience&lt;/a&gt; in early June. For Memorial Day Weekend, I went &lt;a href=&quot;http://raibledesigns.com/rd/entry/mountain_biking_in_moab&quot;&gt;mountain biking in Moab&lt;/a&gt; and had a blast at the &lt;a href=&quot;http://www.desertrocks.org/&quot;&gt;Desert Rocks Music Festival&lt;/a&gt;. The Porcupine Rim ride took us 4.5 hours and we tracked 26.75 miles. The several points in the trail with &quot;death on the right&quot; were truly epic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4046/4662670544_478cb254c5.jpg&quot; title=&quot;Hazard County Trail&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4046/4662670544_478cb254c5_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Hazard County Trail&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4068/4662049049_9761af8d03.jpg&quot; title=&quot;Close to The Edge&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4068/4662049049_9761af8d03_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Close to The Edge&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4038/4662049861_02a837094d.jpg&quot; title=&quot;Awesome Singletrack&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4038/4662049861_02a837094d_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Awesome Singletrack&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4027/4662050007_80627bc86a.jpg&quot; title=&quot;Sweet View&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4027/4662050007_80627bc86a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Sweet View&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;June started with our annual &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_nice_riding_weekend_before&quot;&gt;Ride to Red Rocks&lt;/a&gt;. I slept six hours and did the 25-mile off-road &lt;a href=&quot;http://www.elephantrockride.com/&quot;&gt;Elephant Rock&lt;/a&gt; ride the next morning. The next morning I hopped on a plane to Ireland for the &lt;a href=&quot;http://raibledesigns.com/rd/entry/presentations_from_the_irish_software&quot;&gt;Irish Software Show&lt;/a&gt;. My sister joined me and we had an &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_incredible_trip_to_ireland&quot;&gt;incredible time&lt;/a&gt; with &lt;a href=&quot;http://www.jamievandyke.com/&quot;&gt;Jamie&lt;/a&gt;, Rob, &lt;a href=&quot;http://www.johnmwillis.com/&quot;&gt;John&lt;/a&gt; and &lt;a href=&quot;http://www.joshlong.com/&quot;&gt;Josh&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4006/4699508311_77a05c609a.jpg&quot; title=&quot;Straight to the top!&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4006/4699508311_77a05c609a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Straight to the top!&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4015/4699508737_612d1b1b42.jpg&quot; title=&quot;Mmmmm, Guinness&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4015/4699508737_612d1b1b42_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Mmmmm, Guinness&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4052/4700141820_3943b0dea6.jpg&quot; title=&quot;The Storehouse is shaped like a pint glass&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4052/4700141820_3943b0dea6_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Storehouse is shaped like a pint glass&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm2.static.flickr.com/1285/4700143032_120cd3d789.jpg&quot; title=&quot;Brainwave&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm2.static.flickr.com/1285/4700143032_120cd3d789_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Brainwave&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;Upon returning to work, I got to have an awkward conversation with my client about all the vacation I was taking.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://farm2.static.flickr.com/1359/4723660690_9313a26d78.jpg&quot; title=&quot;Fire in Background, 100 foot tall flames&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm2.static.flickr.com/1359/4723660690_9313a26d78_m.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Fire in Background, 100 foot tall flames&quot; style=&quot;border: 1px solid black&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
For Father&apos;s Day, my parents drove to Denver and we packed up the camping gear for a &lt;a href=&quot;http://raibledesigns.com/rd/entry/another_fun_father_s_day&quot;&gt;fun weekend at The Great Sand Dunes&lt;/a&gt;.
After The Dunes, my parents and kids drove to The Cabin, camping out and touring Yellowstone along the way. That Thursday, June 24th, I attended my good friend &lt;a href=&quot;http://jasonjbarton.com/&quot;&gt;Jason&lt;/a&gt;&apos;s birthday party in Lodo.&lt;/p&gt;
&lt;p&gt;That&apos;s the night I met Trish. &lt;/p&gt;
&lt;p&gt;I saw her switch from a Martini to a Guinness and I knew I had to talk to her. I introduced myself and quickly found myself conflicted with having a soon-to-expire iPhone 4 reservation at the Apple Store. I rushed out to grab the phone, returning because there was something special about Trish. We talked for a couple hours that night ... me mesmerized, her smiling a lot. I was dumbfounded to find such a cool person existed in the world. At the end of the night, I got her number and drove home with a feeling that my life was about to change. 
&lt;/p&gt;
&lt;p&gt;The next day, I began a road trip to The Last Best Place for a &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_summer_vacation_in_montana1&quot;&gt;Montana Summer Vacation&lt;/a&gt;. 

&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4096/4788758981_ea7346ab25.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Big Sky Country&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4096/4788758981_ea7346ab25_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Big Sky Country&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4077/4788762471_187425438b.jpg&quot; title=&quot;Ready for the Parade&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4077/4788762471_187425438b_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Ready for the Parade&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4098/4788767939_d273d4ddf5.jpg&quot; title=&quot;Chris Auchenbach&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4098/4788767939_d273d4ddf5_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Chris Auchenbach&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4143/4789398916_a70dd2077e.jpg&quot; title=&quot;Meadow Lake Golf Course in Columbia Falls&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4143/4789398916_a70dd2077e_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Meadow Lake Golf Course in Columbia Falls&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;During that trip, Trish and I exchanged occasional text messages and I told many friends about the kick-ass girl I met. It was another great Montana vacation.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
My favorite part of this year&apos;s trip to The Cabin was seeing it as a home again. My Mom retired in April and my parents moved back to Montana shortly after. Seeing how happy they are there is truly magical. I especially enjoy the thought of visiting them and all the wonderful folks in the Swan Valley many, many times in the future. 
&lt;/p&gt;
&lt;p&gt;The kids and I drove like bats out of hell and made it back to Denver (950 miles) in 14.25 hours. I quickly scheduled a first date with Trish that Wednesday, and went back to work at TWC with a renewed energy. After our first date, I formed a sort of perma-grin. That Friday was my birthday. I&apos;ve been having a blast with Trish ever since.
&lt;/p&gt;
&lt;p&gt;July ended with a trip to the Lost Coast for &lt;a href=&quot;http://raibledesigns.com/rd/entry/jess_and_lili_s_legendary&quot;&gt;Jess and Lili&apos;s Wedding&lt;/a&gt;. &lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;The reception afterwards was a truly spectacular party that lasted well into the evening. Clint and I vowed to go to bed early, but we ended up having so much fun we closed the place down. Jess and Lili were an instrumental part in creating a spectacular night, especially with their &lt;a href=&quot;http://www.youtube.com/watch?v=zVNYDwQXggI&quot;&gt;wedding dance&lt;/a&gt; and infectious happiness.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4128/4836504101_199c9821ba.jpg&quot; title=&quot;Lili and Jess&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4128/4836504101_199c9821ba_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Lili and Jess&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In August, I celebrated this blog&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_8th_birthday_to_this&quot;&gt;8th birthday&lt;/a&gt; and we started our &quot;60-Day Push&quot; at work. The goal of our 60-Day Push was to re-write our Video Portal, iPad and Sony Blu-ray apps from scratch, without politics dictating their features. We hired &lt;a href=&quot;http://method.com/&quot;&gt;Method&lt;/a&gt; for design, chose our own features and went to work. I &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_s_the_ol_team&quot;&gt;wrote about the success of this effort&lt;/a&gt; in October.
&lt;/p&gt;
&lt;p&gt;
I neglected to write about the Denver Cruisers &lt;a href=&quot;http://www.examiner.com/nightlife-photography-in-denver/denver-cruisers-saints-and-sinners&quot;&gt;Saints and Sinners&lt;/a&gt; ride or how much fun we had listening to &lt;a href=&quot;http://www.redrocksonline.com/CalendarEventDisplay.aspx?id=41820&quot;&gt;B.B. King at Red Rocks&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;
Abbie and Jack&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_first_day_of_school1&quot;&gt;first day of school&lt;/a&gt; was on August 16th.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4121/4899887269_9754511cec.jpg&quot; title=&quot;Pretend like you&apos;re playing Wii Jack!&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4121/4899887269_9754511cec_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Pretend like you&apos;re playing Wii Jack!&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;At the end of August, we celebrated &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157624769760851/&quot;&gt;Jack&apos;s 6th Birthday&lt;/a&gt; and attended my &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157624894607518/&quot;&gt;Cousin Amy&apos;s Wedding&lt;/a&gt; in Missouri. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4084/4965213510_20c8e36f87.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Wheee!&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4084/4965213510_20c8e36f87_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Wheee!&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4152/4964612385_06ac5a0ef4.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Super Mario Bros. Cake&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4152/4964612385_06ac5a0ef4_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Super Mario Bros. Cake&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4132/4965217230_2cd7bc5e37.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Tebow Fan&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4132/4965217230_2cd7bc5e37_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Tebow Fan&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;br/&gt;&lt;br/&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4085/4964754995_cec227df27.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;The Happy Couple&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4085/4964754995_cec227df27_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Happy Couple&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4086/4964743889_4f813aa9ee.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Jack and Abbie&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4086/4964743889_4f813aa9ee_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Jack and Abbie&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4100/4964746601_ee8cbbf3b9.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;The Cousins&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4100/4964746601_ee8cbbf3b9_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Cousins&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;September rolled in, we finished the majority of the work in our 60-Day Push and Trish and I drove up to Estes Park for an &lt;a href=&quot;http://raibledesigns.com/rd/entry/an_epic_weekend_in_estes&quot;&gt;epic weekend&lt;/a&gt; at the &lt;a href=&quot;http://www.scotfest.com/Scottish_Festival/Home.html&quot;&gt;Scottish-Irish Festival&lt;/a&gt;. We rode our bikes in the parade (by accident), enjoyed a few pints and even did a bit of fly-fishing near our riverside accommodations. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4090/4988535019_34fc7a67d7.jpg&quot; title=&quot;Beautiful View&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4090/4988535019_34fc7a67d7_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot; alt=&quot;Beautiful View&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4103/4988536455_db7ccf0b07.jpg&quot; title=&quot;Plane in Sky&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4103/4988536455_db7ccf0b07_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot; alt=&quot;Plane in Sky&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4133/4989142114_f1e7b43e99.jpg&quot; title=&quot;Ride to Stanley Hotel&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4133/4989142114_f1e7b43e99_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot; alt=&quot;Ride to Stanley Hotel&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4154/4989143134_68fb3b7801.jpg&quot; title=&quot;View from The Stanley Hotel&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4154/4989143134_68fb3b7801_s.jpg&quot; width=&quot;75&quot; height=&quot;75&quot; alt=&quot;View from The Stanley Hotel&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;We listened to the 1st 2010 Broncos game while driving back from Estes and slipped into a Rockies game shortly after losing. Our sadness over the Broncos loss was erased within a couple hours as we celebrated &lt;a href=&quot;http://en.wikipedia.org/wiki/Jason_Giambi&quot;&gt;Jason Giambi&apos;s&lt;/a&gt; walk-off home run. Unfortunately, the Rockies didn&apos;t make it to the post-season, but the Broncos looked good at their &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157624879516331/&quot;&gt;home opener&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4109/5011958664_88c02e1dfb.jpg&quot; title=&quot;Fighter Jets&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4109/5011958664_88c02e1dfb_m.jpg&quot; width=&quot;240&quot; height=&quot;179&quot; alt=&quot;Fighter Jets&quot; style=&quot;border: 1px solid black;&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;October came quickly and I wrote &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_s_the_ol_team&quot;&gt;How&apos;s the ol&apos; Team Doing&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/re_moving_from_spring_to&quot;&gt;defended the Age of Frameworks&lt;/a&gt;. At the end of October, we moved into &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625130347727/&quot;&gt;TWC&apos;s Lodo Office&lt;/a&gt; on Wynkoop. That weekend, we dressed up as superheros for &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625285301110/&quot;&gt;Halloween&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;November started off with &lt;a href=&quot;http://raibledesigns.com/rd/entry/abbie_s_8th_birthday_and&quot;&gt;Abbie&apos;s birthday&lt;/a&gt; and Trish got to meet the kids for the first time. From there, we went into traveling-like-madmen mode. We enjoyed &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625463274916/&quot;&gt;suite seats&lt;/a&gt; at the Broncos vs. Kansas City game, then flew to Amsterdam for &lt;a href=&quot;http://devoxx.com/display/Devoxx2K10/Home&quot;&gt;Devoxx&lt;/a&gt; the next morning (performing an &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_1_milestone_2&quot;&gt;AppFuse release&lt;/a&gt; along the way). I presented on Thursday and posted my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks&quot;&gt;Comparing JVM Web Frameworks presentation&lt;/a&gt; shortly after. I &lt;a href=&quot;http://raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam&quot;&gt;wrote about our trip&lt;/a&gt; while &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625547334972/&quot;&gt;at The Cabin for Thanksgiving&lt;/a&gt;. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4111/5205300493_0fa88e937a.jpg&quot; title=&quot;Sunset in Amsterdam&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4111/5205300493_0fa88e937a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Sunset in Amsterdam&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5165/5205310971_8908fc905f.jpg&quot; title=&quot;Waffles at D&#233;sir&#233; de Lille&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5165/5205310971_8908fc905f_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Waffles at D&#233;sir&#233; de Lille&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5047/5205310525_35786d0758.jpg&quot; title=&quot;Partying with the Adobe Folks&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5047/5205310525_35786d0758_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Partying with the Adobe Crew&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4149/5205911660_718ab0bcd4.jpg&quot; title=&quot;Ghent&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4149/5205911660_718ab0bcd4_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Ghent&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I flew back from Montana, stopped in at the Lodo office for a couple days, then hopped on a plane to the Rich Web Experience with Trish. My &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_everything_you_ever_wanted&quot;&gt;presentations&lt;/a&gt; went well, sparked some &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_i_calculated_ratings_for&quot;&gt;controversy&lt;/a&gt;, and we &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_fun_week_in_florida&quot;&gt;raced to Key West&lt;/a&gt; to celebrate the end of the conference season. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5288/5240091611_6af06fa815.jpg&quot; title=&quot;Dreams do come true.&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5288/5240091611_6af06fa815_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Dreams do come true.&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5166/5240688766_45ed6a544e.jpg&quot; title=&quot;Sunset in Key Largo&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5166/5240688766_45ed6a544e_t.jpg&quot; width=&quot;100&quot; height=&quot;74&quot; alt=&quot;Sunset in Key Largo&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5247/5240688882_dceac2f8a5.jpg&quot; title=&quot;Pi&#241;a Coladas in Key Largo&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5247/5240688882_dceac2f8a5_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Pi&#241;a Coladas in Key Largo&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5202/5240092461_5658cb18ed.jpg&quot; title=&quot;Key Largo Sunset&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5202/5240092461_5658cb18ed_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Key Largo Sunset&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
I returned to Denver for my last week at TWC, enjoyed a couple days of skiing, then headed to Utah for an interview with &lt;a href=&quot;http://overstock.com&quot;&gt;Overstock.com&lt;/a&gt;. While I enjoyed my time at TWC, my contract duration was up and being a full-time employee didn&apos;t give me the vacation time I tend to enjoy. My interview with Overstock.com was two days, with the 2nd day &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625716396790/&quot;&gt;on the slopes at Snowbird&lt;/a&gt;. I was very impressed by the company, people and interview process and agreed to work there on the way to the airport.&lt;/p&gt;
&lt;p&gt;
I returned to Denver for &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625590980727/&quot;&gt;Trish&apos;s Birthday Weekend at Breckenridge&lt;/a&gt;, then flew down to Naples on Wednesday to spend &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157625591245697/&quot;&gt;Christmas with her family&lt;/a&gt;. It was my first time meeting her parents, but that didn&apos;t stop us from having a great time talking, beach-going, golfing and relaxing. 
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5003/5311035104_99de319abb.jpg&quot; title=&quot;Trish and her awesome parents&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5003/5311035104_99de319abb_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Trish and her awesome parents&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5163/5310446881_87f57d5506.jpg&quot; title=&quot;Hot Santa&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5163/5310446881_87f57d5506_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Hot Santa&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5207/5311037298_1415347e60.jpg&quot; title=&quot;Scotch: Making White Men Dance since 1494.&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5207/5311037298_1415347e60_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Scotch: Making White Men Dance since 1494.&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5048/5311037698_a5b6b29f8c.jpg&quot; title=&quot;Sunset in Naples&quot; rel=&quot;lightbox[yearinreview2010]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5048/5311037698_a5b6b29f8c_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Sunset in Naples&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
We returned to Denver, I &lt;a href=&quot;http://twitter.com/#!/mraible/status/20247873694203904&quot; title=&quot;Made good progress on fixing AppFuse issues for 2.1.0, but not enough for a release. Will have to wait until next year.&quot;&gt;tried to get AppFuse 2.1 finished&lt;/a&gt; and then we celebrated New Years with friends in Steamboat. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5281/5343664200_4d11c44451.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Good Morning from Steamboat!&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5281/5343664200_4d11c44451_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Good Morning from Steamboat!&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5006/5343055387_8e6cd3e2e3.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Sunrise over Steamboat&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5006/5343055387_8e6cd3e2e3_m.jpg&quot; width=&quot;240&quot; height=&quot;179&quot; alt=&quot;Sunrise over Steamboat&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;As I reminisce about last year, I can&apos;t help but smile. While I&apos;ve been a happy person for a while, having someone to share your life with is a special thing. I feel like I dreamed up Trish a couple years ago. I was looking for someone that liked to do my favorite activities: mountain biking, skiing, traveling the world and enjoying good beer. I found that and more in Trish and couldn&apos;t be happier. 
&lt;/p&gt;
&lt;p&gt;
I didn&apos;t write as many technical posts on this blog as I&apos;d like to, but I attribute that mostly to the lack of learning new things at TWC. At Overstock.com, I expect that to change and hope to have more technical articles in the coming year. 
&lt;/p&gt;
&lt;p&gt;
At the end of last year&apos;s &lt;a href=&quot;http://raibledesigns.com/rd/entry/2009_a_year_in_review&quot;&gt;Year in Review&lt;/a&gt;, I wrote:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I hope to speak at (or attend) 3 conferences, finish up The Bus and do a whole bunch of skiing and mountain biking.
&lt;/p&gt;
&lt;p&gt;I accomplished all but one goal: finishing The Bus. In 2011, I plan on doing two main things: keep rockin&apos; it with Trish and finishing The Bus. Everything else is gravy. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;It&apos;s gonna be a spectacular year.  
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5249/5310864430_3630ce2f5a.jpg&quot; rel=&quot;lightbox[yearinreview2010]&quot; title=&quot;Double Rainbow&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5249/5310864430_3630ce2f5a_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Double Rainbow&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/how_i_calculated_ratings_for</id>
        <title type="html">How I Calculated Ratings for My JVM Web Frameworks Comparison</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/how_i_calculated_ratings_for"/>
        <published>2010-12-06T11:55:18-07:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="devoxx2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lift" scheme="http://roller.apache.org/ns/tags/" />
        <category term="comparingwebframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworksmatrix" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">When I re-wrote my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks&quot;&gt;Comparing JVM Web Frameworks presentation&lt;/a&gt; from scratch, I decided to add a &lt;a href=&quot;http://bit.ly/jvm-frameworks-matrix&quot;&gt;matrix&lt;/a&gt; that allows you to rate a framework based on &lt;a href=&quot;https://docs.google.com/document/pub?id=1jAGPWwlEcYikqOPg8faYgRV7cQNS_iCCoJ1VNc_99M4&quot;&gt;20 different criteria&lt;/a&gt;. The reason I did this was because I&apos;d used this method when &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_framework_analysis_results&quot;&gt;choosing an Ajax framework for Evite&lt;/a&gt; last year. The matrix seemed to work well for selecting the top 5 frameworks, but it also inspired a lot of discussion in the community that my &lt;a href=&quot;http://ptrthomas.wordpress.com/2010/12/04/comparing-jvm-web-frameworks-a-response-to-matt-raible/&quot;&gt;ratings&lt;/a&gt; &lt;a href=&quot;http://blog.frankel.ch/critical-analysis-of-frameworks-comparison&quot;&gt;were&lt;/a&gt; &lt;a href=&quot;http://basementcoders.com/2010/12/episode-27-hudson-oracle-raible-and-astycrapper/&quot;&gt;wrong&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;I expected this, as I certainly don&apos;t know every framework as well as I&apos;d like. The mistake I made was asking for the community to provide feedback on my ratings without describing how I arrived at them. From &lt;a href=&quot;http://ptrthomas.wordpress.com/2010/12/04/comparing-jvm-web-frameworks-a-response-to-matt-raible/&quot;&gt;Peter Thomas&apos;s blog&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
What you are doing is adjusting ratings based on who in the community shouts the loudest. I can&apos;t help saying that this approach comes across as highly arrogant and condescending, you seem to expect framework developers and proponents to rush over and fawn over you to get better ratings, like waiters in a restaurant trying to impress a food-critic for Michelin stars.
&lt;/p&gt;
&lt;p&gt;
I apologize for giving this impression. It certainly wasn&apos;t my intent. By having simple numbers (1.0 == framework does well, 0.5 == framework is OK and 0 == framework not good at criteria) with no rationalization, I can see how the matrix can be interpreted as useless (or to put it bluntly, as &lt;a href=&quot;http://basementcoders.com/2010/12/episode-27-hudson-oracle-raible-and-astycrapper/&quot;&gt;something you should wipe your ass with&lt;/a&gt;). I don&apos;t blame folks for getting angry.&lt;/p&gt;
&lt;p&gt;For my Rich Web Experience presentation, I documented why I gave each framework the rating I did. Hopefully this will allow folks to critique my ratings more constructively and I can make the numbers more accurate. You can view this document below or &lt;a href=&quot;http://bit.ly/jvm-webfwk-ratings-logic&quot;&gt;on Google Docs&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;//docs.google.com/document/pub?id=1X_XvpJd6TgEAMe4a6xxzJ38yzmthvrA6wD7zGy2Igog&amp;amp;embedded=true&quot; style=&quot;width: 100%; border: 1px solid silver; height: 400px&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;In the end, what I was hoping to do with this matrix was to simply highlight a &lt;em&gt;technique&lt;/em&gt; for choosing a web framework. Furthermore, I think adding a &quot;weight&quot; to each criteria is important because things like books often aren&apos;t as important as REST support. To show how this might be done, I added a second sheet to the matrix and made up some weighting numbers. I&apos;d expect anyone that wants to use this to &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/JVM_Web_Framework_Matrix_20101206.xls&quot;&gt;downloaded the matrix&lt;/a&gt;, verify the ratings are accurate for your beliefs and weight the criteria accordingly.
&lt;/p&gt;
&lt;p&gt;
Of course, as I and many others have said, the best way to choose a web framework is to try them yourself. I emphasized this at the end of my presentation with the following two slides.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/5238846712/&quot; title=&quot;Slide #77 from Comparing JVM Web Frameworks Talk at RWX2010&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5281/5238846712_375a63e4c6.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Slide #77 from Comparing JVM Web Frameworks Talk at RWX2010&quot; /&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/5238846740/&quot; title=&quot;Slide #76 from Comparing JVM Web Frameworks Talk at RWX2010&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5129/5238846740_29b06ee0eb.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Slide #76 from Comparing JVM Web Frameworks Talk at RWX2010&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks</id>
        <title type="html">My Comparing JVM Web Frameworks Presentation from Devoxx 2010</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks"/>
        <published>2010-11-18T05:23:10-07:00</published>
        <updated>2015-08-23T18:57:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lift" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This week, I&apos;ve been having a great time in Antwerp, Belgium at the &lt;a href=&quot;http://www.devoxx.com/display/Devoxx2K10/Home&quot;&gt;Devoxx&lt;/a&gt; Conference. This morning, I had the pleasure of delivering my &lt;a href=&quot;http://www.devoxx.com/display/Devoxx2K10/Comparing+JVM+Web+Frameworks&quot;&gt;Comparing JVM Web Frameworks&lt;/a&gt; talk. I thoroughly enjoyed giving this presentation, especially to such a large audience. You can view the presentation below (if you have Flash installed) or &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Comparing_JVM_Web_Frameworks_Devoxx2010.pdf&quot;&gt;download it here&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/uBZoC22SGdjpFy&quot; width=&quot;510&quot; height=&quot;420&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
Unlike previous years, I chose to come up with a &lt;a href=&quot;http://bit.ly/jvm-frameworks-matrix&quot;&gt;spreadsheet matrix&lt;/a&gt; that shows why I chose the 5 I did. This spreadsheet and rankings given to each framework are likely to be debated, as I don&apos;t know all the frameworks as well as I&apos;d like to. Also, the missing column on this spreadsheet is a &quot;weighting&quot; column where you can prioritize certain criteria like I&apos;ve done in the past when &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_framework_analysis_results&quot;&gt;Comparing Ajax Frameworks&lt;/a&gt;. If you believe there are incorrect numbers, please let me know and I&apos;ll try to get those fixed before I do this talk again at &lt;a href=&quot;http://www.therichwebexperience.com/conference/fort_lauderdale/2010/11/home&quot;&gt;The Rich Web Experience&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
One thing that doesn&apos;t come across in this presentation is that I believe &lt;em&gt;anyone&lt;/em&gt; can use this matrix, and weightings, to make &lt;em&gt;any&lt;/em&gt; of these frameworks come out on top. I also believe web frameworks are like spaghetti sauce in &lt;a href=&quot;http://www.gladwell.com/2004/2004_09_06_a_ketchup.html&quot;&gt;The Ketchup Conundrum&lt;/a&gt;. That is, the only way to make more happy spaghetti sauce lovers was to make more &lt;em&gt;types&lt;/em&gt; of spaghetti sauce. You can read more about this in my &lt;a href=&quot;http://raibledesigns.com/rd/entry/there_is_no_best_web&quot;&gt;There is no &quot;best&quot; web framework&lt;/a&gt; article.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If you disagree with the various ratings I gave to web frameworks in this presentation, please provide your opinions by &lt;a href=&quot;http://bit.ly/webmatrixsurvey&quot;&gt;filling out this survey&lt;/a&gt;. Thanks to &lt;a href=&quot;http://twitter.com/sarbogast&quot;&gt;Sebastien Arbogast&lt;/a&gt; for setting this up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Sebastien has posted his survey results at &lt;a href=&quot;http://sebastien-arbogast.com/2010/11/19/jvm-web-framework-survey-first-results/&quot;&gt;JVM Web Framework Survey, First Results&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 12/6:&lt;/strong&gt; A video of this presentation is &lt;a href=&quot;http://parleys.com/d/2118&quot;&gt;now available on Parleys.com&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;
P.S. My current gig is ending in mid-December. If you&apos;re looking for a UI Architect with a passion for open source frameworks, please &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;let me know&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/re_moving_from_spring_to</id>
        <title type="html">RE: Moving from Spring to Java EE 6: The Age of Frameworks is Over</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/re_moving_from_spring_to"/>
        <published>2010-10-16T15:19:07-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="frameworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last Tuesday, Cameron McKenzie wrote an interesting article on TheServerSide titled &lt;a href=&quot;http://www.theserverside.com/discussions/thread.tss?thread_id=61023&quot;&gt;Moving from Spring to Java EE 6: The Age of Frameworks is Over&lt;/a&gt;. In this article, Cameron says the following:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
J2EE represents the past, and Java EE 6 represents the future. Java EE 6 promises us the ability to go beyond frameworks. Frameworks like Spring are really just a bridge between the mistakes of the J2EE past and the success of the Java EE 6 future. Frameworks are out, and extensions to the Java EE 6 platform are in. Now is the time to start looking past Spring, and looking forward to Seam and Weld and CDI technologies.
&lt;/p&gt;
&lt;p&gt;He then links to an article titled &lt;a href=&quot;http://ocpsoft.com/java/spring-to-java-ee-a-migration-guide-cdi-jsf-jpa-jta-ejb/&quot;&gt;Spring to Java EE - A Migration Experience&lt;/a&gt;, an article written by JBoss&apos;s Lincoln Baxter. In this article, Lincoln talks about many of the technologies in Java EE 6, namely JPA, EJB, JSF, CDI and JAX-RS. He highlights all the various XML files you&apos;ll need to know about and the wide variety of Java EE 6 application servers: JBoss AS 6 and GlassFish v3.&lt;/p&gt;
&lt;p&gt;I don&apos;t have a problem with Lincoln&apos;s article, in fact I think it&apos;s very informative and some of the best documentation I&apos;ve seen for Java EE 6. 
&lt;/p&gt;
&lt;p&gt;
I do have some issues with Cameron&apos;s statements that frameworks are mistakes of the J2EE past and that Java EE 6 represents the future. Open source frameworks made J2EE successful. Struts and Hibernate came out in the early days of J2EE and still exist today. Spring came out shortly after and has turned into the do-everything J2EE implementation it was trying to fix. Java EE 6 &lt;em&gt;might be&lt;/em&gt; a better foundation to build upon, but it&apos;s certainly not going to replace frameworks.
&lt;/p&gt;
&lt;p&gt;
To prove my point, let&apos;s start by looking at the persistence layer. We used to have Hibernate based on JDBC, now we have JPA implementations built on top of the JPA API. Is JPA a replacement for all persistence frameworks? I&apos;ve worked with it and think it&apos;s a good API, but the 2.0 version &lt;a href=&quot;https://repository.sonatype.org/index.html#nexus-search;quick~javax.persistence&quot;&gt;isn&apos;t available in a Maven repo&lt;/a&gt; and &lt;a href=&quot;http://wiki.alfresco.com/wiki/Alfresco_Community_3.4.a#Hibernate_Removal&quot;&gt;Alfresco recently moved away from Hibernate&lt;/a&gt; (which == JPA IMO) to iBATIS for greater data access layer control and scalability. Looks like the age of frameworks isn&apos;t over for persistence frameworks.&lt;/p&gt;
&lt;p&gt;The other areas that Java EE 6 covers that I believe frameworks will continue to excel in: EJB, CDI, JSF and JAX-RS. Personally, I don&apos;t have a problem with EJB 3 and think it&apos;s a vast improvement on EJB 2.x. I don&apos;t have an issue with CDI either, and as long as it resembles Guice for dependency injection, it works for me. However, when you get into the space I&apos;ve been living in for the last couple years (high-traffic public internet sites), EJB and things like the &quot;conversation-scope&quot; feature of CDI don&apos;t buy you much. The way to make web application scale is to eliminate state and cache as much as possible, both of which Java EE doesn&apos;t provide much help for. In fact, to disable sessions in a servlet-container, you have to write a Filter like the following:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public class DisabledSessionFilter extends OncePerRequestFilter {

    /**
     * Filters requests to disable URL-based session identifiers.
     */
    @Override
    protected void doFilterInternal(final HttpServletRequest request,
                                    final HttpServletResponse response,
                                    final FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequestWrapper wrappedRequest = new HttpServletRequestWrapper(request) {

            @Override
            public HttpSession getSession(final boolean create) {
                if (create) {
                    throw new UnsupportedOperationException(&quot;Session support disabled&quot;);
                }
                return null;
            }

            @Override
            public HttpSession getSession() {
                throw new UnsupportedOperationException(&quot;Session support disabled&quot;);
            }
        };

        // process next request in chain
        chain.doFilter(wrappedRequest, response);
    }
}
&lt;/pre&gt;
&lt;p&gt;What about JAX-RS? Does it replace the need for frameworks? I like the idea of having a REST API in Java. However, its reference implementation is &lt;a href=&quot;https://jersey.dev.java.net/&quot;&gt;Jersey&lt;/a&gt;, which seems more like a framework than just Java EE. If you choose to use JAX-RS in your application, you still have to choose between CXF, Jersey, RESTEasy and Restlet. &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_experience_with_java_rest&quot;&gt;I compared these frameworks last year&lt;/a&gt; and found the Java EE implementation lacking in the features I needed. 
&lt;/p&gt;
&lt;p&gt;Finally, let&apos;s talk about my-least-framework-web-framework: JSF. The main reason I don&apos;t like JSF is because of its 1.x version. JSF 1.0 was released a year before the Ajax term was coined (see timeline below). Not only did it take forever to develop as a spec, but it tried to be a client-component framework that was very stateful by default. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4067/4378559350_aef7d39d06_o.png&quot; title=&quot;History of Web Frameworks&quot; rel=&quot;lightbox&quot;&gt;
&lt;img src=&quot;//farm5.static.flickr.com/4067/4378559350_13f0755403.jpg&quot; width=&quot;500&quot; height=&quot;234&quot; alt=&quot;History of Web Frameworks&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Now that JSF 2.0 is out, it has Ajax integrated and allows you to use GET instead of POST-for-everything. However, the only people that like Ajax integrated into their web frameworks are programmers scared of JavaScript (who probably shouldn&apos;t be developing your UI). Also, the best component development platform for the web &lt;em&gt;is&lt;/em&gt; JavaScript. I recommend using an Ajax framework for your components if you really want a rich UI. 
&lt;/p&gt;
&lt;p&gt;
Sure you can use the likes of Tapestry and Wicket if you like POJO-based web development, but if you&apos;re looking to develop a webapp that&apos;s easy to maintain and understand, chances are that you&apos;ll do much better with traditional MVC frameworks like Spring MVC and Struts 2. The simplicity and popularity of Rails and Grails further emphasize that developers prefer these types of web frameworks.&lt;/p&gt;
&lt;p&gt;Another reason I don&apos;t like JSF: there&apos;s very few developers in the wild happy with it. The major promoters of JSF are book authors, trainers, Java EE Vendors and MyFaces developers. Whenever I speak at conferences, I ask folks to raise their hands for the various web frameworks they&apos;re using. I always ask the JSF users to keep their hands up if they like it. Rarely do they stay up.
&lt;/p&gt;
&lt;p&gt;
So it looks like we still need web frameworks. 
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jandiandme.blogspot.com/2010/10/spring-vs-java-ee-and-why-i-dont-care.html&quot;&gt;Eberhard Wolff has an interesting post&lt;/a&gt; where he defends Spring and talks about the productivity comparisons between Spring and Java EE. He recommends using Grails or Spring Roo if you want the level of productivity that Ruby on Rails provides. That&apos;s a valid recommendation if you&apos;re building CRUD-based webapps, but I haven&apos;t developed those in quite some time. Nowadays, the apps I develop are true SOFEA apps, where the backend serves up XML or JSON and the frontend client is HTML/JavaScript/CSS, Android, iPad or Sony Blu-Ray players. On my current project, our services don&apos;t even talk to a database, they talk to a CMS via RESTful APIs. We use Spring&apos;s RestTemplate for this and HttpClient when it doesn&apos;t have the features we need. Not much in Java EE 6 for this type of communication. Sure, &lt;a href=&quot;http://blogs.sun.com/enterprisetechtips/entry/consuming_restful_web_services_with&quot;&gt;Jersey has a client&lt;/a&gt;, but it&apos;s certainly not part of the Java EE spec.
&lt;/p&gt;
&lt;p&gt;As far as getting Ruby on Rails&apos; zero-turnaround productivity, I don&apos;t need Grails or Spring Roo, I simply use &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;IDEA&lt;/a&gt; and &lt;a href=&quot;http://www.zeroturnaround.com/jrebel/&quot;&gt;JRebel&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
I don&apos;t see how new features in Java EE 6 can mean the age of frameworks is over. Java SE and J2EE have always been foundations for frameworks. The Java EE 6 features are often frameworks in themselves that can be used outside of a Java EE container. Furthermore, Java EE 6 doesn&apos;t provide all the features you need to build a high-scale web app today. There&apos;s no caching, no stateless web framework that can serve up JSON and HTML and no hot-reload productivity enhancements like JRebel. Furthermore, there&apos;s real excitement in Javaland for languages like Scala, Groovy and JRuby. All of these languages have web frameworks that&apos;ve made many developers happy. 
&lt;/p&gt;
&lt;p&gt;
Here&apos;s to the Age of Frameworks - may it live as long as the JVM!
&lt;/p&gt;
&lt;p style=&quot;padding-top: 5px; border-top: 1px dotted silver; color: #666&quot;&gt;
P.S. If you&apos;d like to hear me talk about web frameworks on the JVM, I&apos;ll be speaking at &lt;a href=&quot;http://www.meetup.com/csopensource/calendar/15088624/&quot; style=&quot;color: #666&quot;&gt;The Colorado Springs Open Source Meetup&lt;/a&gt; and &lt;a href=&quot;http://www.devoxx.com/display/Devoxx2K10/Comparing+JVM+Web+Frameworks&quot; style=&quot;color: #666&quot;&gt;Devoxx 2010&lt;/a&gt; in the near future.&lt;/p&gt;
&lt;p&gt;
&lt;!--p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I am an independent consultant and don&apos;t have any affiliations with Java EE vendors. I do have an affection for open source frameworks, particularly Spring and web frameworks. This is because I&apos;ve seen them successfully implemented at high scale web sites such as LinkedIn, Evite and Time Warner Cable.&lt;/p--&gt; </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/my_incredible_trip_to_ireland</id>
        <title type="html">My Incredible Trip to Ireland</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/my_incredible_trip_to_ireland"/>
        <published>2010-06-14T23:42:55-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="kalin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="guinness" scheme="http://roller.apache.org/ns/tags/" />
        <category term="irishsoftwareshow" scheme="http://roller.apache.org/ns/tags/" />
        <category term="johnwillis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dublin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="joshlong" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jameson" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jamievandyke" scheme="http://roller.apache.org/ns/tags/" />
        <category term="iss2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="glendalough" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ireland" scheme="http://roller.apache.org/ns/tags/" />
        <category term="dublinia" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;em&gt;If you ever get a chance to travel to Ireland, take it!&lt;/em&gt; I don&apos;t know when I heard these words, or how they came into my head, but I remembered them clearly when I was first introduced to &lt;a href=&quot;http://ie.linkedin.com/in/irishdev&quot;&gt;Barry Alistair&lt;/a&gt; by &lt;a href=&quot;http://www.linkedin.com/in/jgenender&quot;&gt;Jeff Genender&lt;/a&gt;. Soon after, I was able to negotiate my way into being a speaker at &lt;a href=&quot;http://epicenter.ie/2010.html&quot;&gt;The 2010 Irish Software Show&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The show was last week and I had a blast traveling to Dublin to speak and explore. &lt;a href=&quot;http://twitter.com/kraible&quot;&gt;My sister&lt;/a&gt; came me on this trip, but missed a connection in Seattle and had to join me a day late.  I left Denver at noon on Monday and arrived at &lt;a href=&quot;http://www.dublinairport.com/&quot;&gt;Dublin Airport&lt;/a&gt; at 7 am. I was on the same flight as &lt;a href=&quot;http://www.joshlong.com/&quot;&gt;Josh Long&lt;/a&gt; and thoroughly enjoyed my iPad as a travel companion. When I got off the plane, my battery life was at 60% and I&apos;d been watching movies and listening to music for 6 hours. 
&lt;/p&gt;
&lt;p&gt;I took a cab through the misty, cool morning to &lt;a href=&quot;http://en.wikipedia.org/wiki/Trinity_Capital_Hotel&quot;&gt;my hotel&lt;/a&gt;. I grabbed a coffee, cleaned up, and walked a few blocks to &lt;a href=&quot;http://www.tcd.ie/&quot;&gt;Trinity College&lt;/a&gt; for the conference. I made it in time for the &lt;a href=&quot;http://epicenter.ie/2010.html?zone_id=19&amp;amp;mode=agenda&amp;amp;session=164%23session&quot;&gt;opening keynote&lt;/a&gt; by &lt;a href=&quot;http://chrisjhorn.wordpress.com&quot;&gt;Chris Horn&lt;/a&gt;. It was an interesting talk, focusing on what needed to happen to make Ireland the Innovation Hub of Europe. After that, I attended &lt;a href=&quot;http://augusttechgroup.com/tim/blog&quot;&gt;Tim Berglund&apos;s&lt;/a&gt; session on &lt;a href=&quot;http://epicenter.ie/2010.html?zone_id=19&amp;amp;mode=agenda&amp;amp;session=160%23session&quot;&gt;Complexity Theory and Software Development&lt;/a&gt;. After lunch and a few more talks, I teamed up with &lt;a href=&quot;http://www.jroller.com/aalmiray/&quot;&gt;Andres Almiray&lt;/a&gt; and Josh Long for a pint at the hotel bar.
&lt;/p&gt;
&lt;p&gt;That evening, we attended &lt;a href=&quot;http://www.linkedin.com/in/jgenender&quot;&gt;Jeff Genender&apos;s&lt;/a&gt; talk on &lt;a href=&quot;http://epicenter.ie/2010.html?zone_id=19&amp;amp;mode=agenda&amp;amp;session=189%23session&quot;&gt;Getting into Open Source&lt;/a&gt;. The free drinks loosened everyone up and Jeff did a great job with a humorous presentation on how to get Committer Status. After Jeff&apos;s talk, about 10 of us headed to a Moroccan restaurant for a late dinner. I was in bed around midnight.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm2.static.flickr.com/1297/4699497085_b551c7a58f.jpg&quot; title=&quot;Andres Almiray and Josh Long&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm2.static.flickr.com/1297/4699497085_b551c7a58f_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Andres Almiray and Josh Long&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4029/4699497659_19812e51bf.jpg&quot; title=&quot;The Genenders&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4029/4699497659_19812e51bf_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Genenders&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4049/4700126996_f29207d60c.jpg&quot; title=&quot;Heading for Indian After Jeff&apos;s Talk&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4049/4700126996_f29207d60c_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Heading for Indian After Jeff&apos;s Talk&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4070/4699498241_c076566b11.jpg&quot; title=&quot;Streets of Dublin in the early morning&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4070/4699498241_c076566b11_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Streets of Dublin in the early morning&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
Wednesday morning, my sister arrived in my hotel room at 8 and promptly fell into bed. I set my alarm to sleep an hour and closed the Vegas-style, no-light-allowed curtains. We awoke much later (12:30) than we&apos;d planned (9:00). We quickly got up and headed for some sight-seeing in Dublin. First off, we hit &lt;a href=&quot;http://www.dublinia.ie/&quot;&gt;Dublinia&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Christ_Church_Cathedral,_Dublin&quot;&gt;Christ Church Cathedral&lt;/a&gt;. Both sites were spectacular and we both learned a lot about the history of Dublin. From there, we skipped across the bridge to &lt;a href=&quot;http://www.jamesonwhiskey.com/Heritage-US/Visitor-Centres/The-Old-Jameson-Distillery-Tour-Info.aspx&quot;&gt;The Old Jameson Distillery&lt;/a&gt; for a tour and a bit of whiskey. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4063/4699499527_602302bea9.jpg&quot; title=&quot;Runes Exhibit in Dublinia&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4063/4699499527_602302bea9_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Runes Exhibit in Dublinia&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4070/4700130192_25a9cfcf52.jpg&quot; title=&quot;Christ Church Cathedral and Dublinia&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4070/4700130192_25a9cfcf52_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Christ Church Cathedral and Dublinia&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4022/4699501899_b92347236e.jpg&quot; title=&quot;Tasting Whiskey&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4022/4699501899_b92347236e_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Tasting Whiskey&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm2.static.flickr.com/1279/4700131426_db95eb5c9b.jpg&quot; title=&quot;The 18 Year&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm2.static.flickr.com/1279/4700131426_db95eb5c9b_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The 18 Year&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The picture below was taken on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Ha%27penny_Bridge&quot;&gt;Ha&apos;penny Bridge&lt;/a&gt; as we were heading back from Jameson. The expression of the girl on the left is priceless. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4033/4700134408_d5f99cb5d0.jpg&quot; title=&quot;Kalin on the Half Penny&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4033/4700134408_d5f99cb5d0_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Kalin on the Half Penny&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;A couple hours later and I was delivering my talk on &lt;a href=&quot;http://raibledesigns.com/rd/entry/presentations_from_the_irish_software&quot;&gt;The Future of Web Frameworks&lt;/a&gt;. The crowd was lively; the Guinness I drank while talking was lovely. My session was followed by a Web Framework Experts Panel with &lt;a href=&quot;http://www.cacoethes.co.uk/blog/&quot;&gt;Peter Ledbrook&lt;/a&gt; (Grails), &lt;a href=&quot;http://www.jamievandyke.com/&quot;&gt;Jamie van Dyke&lt;/a&gt; (Rails), &lt;a href=&quot;http://www.ironshay.com/&quot;&gt;Shay Friedman&lt;/a&gt; (ASP.NET MVC), &lt;a href=&quot;http://blog.fitzell.ca/&quot;&gt;Julian Fitzell&lt;/a&gt; (Seaside) and myself (Java Frameworks). The debate was good and there was much discussion about the right apps for each framework and how important statelessness is for scalable applications. After 3 hours of talking, my sister and I headed back to the hotel. I was particularly happy about the evening since it was the first time a family member of mine had seen me speak.
&lt;/p&gt;
&lt;p style=&quot;font-style: italic; color: #666&quot; class=&quot;quote&quot;&gt;Correction from my Dad: This wasn&apos;t the first time a family member saw me speak. He attended my talk at &lt;a href=&quot;http://raibledesigns.com/rd/entry/what_a_trip_amsterdam_was&quot;&gt;ApacheCon EU 2007&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;A block from the hotel, we spotted a nice looking pub (&lt;a href=&quot;http://www.doylesintown.com/&quot;&gt;Doyles&lt;/a&gt;) and stopped in for a pint. As we bellied up to the end of the bar, we recognized Jamie (from the panel) and got introduced to his friend &lt;a href=&quot;http://yrobs.blogspot.com/&quot;&gt;Rob&lt;/a&gt;. We quickly got lost in conversation, stories and laughter and were surprised when we discovered it was 2:30am. Since I had a talk first thing in the morning, we ducked out shortly after.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4017/4699506393_3b1fedd531.jpg&quot; title=&quot;Web Framework Experts Panel&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4017/4699506393_3b1fedd531_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Web Framework Experts Panel&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4048/4700135162_f3099a46c4.jpg&quot; title=&quot;Barry on Evangelist Night&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4048/4700135162_f3099a46c4_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Barry on Evangelist Night&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4008/4700135912_6b71bcd50c.jpg&quot; title=&quot;The Night we met Jamie and Rob&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4008/4700135912_6b71bcd50c_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Night we met Jamie and Rob&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Thursday started with my talk &lt;a href=&quot;http://raibledesigns.com/rd/entry/presentations_from_the_irish_software&quot;&gt;Comparing Kick-Ass Web Frameworks&lt;/a&gt;. Then my sister and I did some more site-seeing, starting at the &lt;a href=&quot;http://www.guinness-storehouse.com/en/Index.aspx&quot;&gt;Guinness Storehouse&lt;/a&gt;. We met Josh and &lt;a href=&quot;http://www.johnmwillis.com/&quot;&gt;John Willis&lt;/a&gt; as they were leaving and they advised we go straight to The Gravity Bar at the top. We took there advise and were getting great views of Dublin and savoring sweet pints of Guinness moments later. The tour facility was freakin&apos; awesome and I loved how it was shaped like a pint glass. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4006/4699508311_77a05c609a.jpg&quot; title=&quot;Straight to the top!&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4006/4699508311_77a05c609a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Straight to the top!&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4015/4699508737_612d1b1b42.jpg&quot; title=&quot;Mmmmm, Guinness&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4015/4699508737_612d1b1b42_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Mmmmm, Guinness&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4052/4700141820_3943b0dea6.jpg&quot; title=&quot;The Storehouse is shaped like a pint glass&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4052/4700141820_3943b0dea6_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Storehouse is shaped like a pint glass&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm2.static.flickr.com/1285/4700143032_120cd3d789.jpg&quot; title=&quot;Brainwave&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm2.static.flickr.com/1285/4700143032_120cd3d789_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Brainwave&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;
We grabbed some gear from the gift shopped and landed (by accident) at &lt;a href=&quot;http://www.brazenhead.com/&quot;&gt;The Brazen Head&lt;/a&gt; (Ireland&apos;s Oldest Pub, Est. 1198) for a pint of cider and Guinness. Since my sister &lt;a href=&quot;http://raibledesigns.com/rd/entry/chelan_hard_cider&quot;&gt;used to be in the cider business&lt;/a&gt;, she was particularly happy there was so much on tap in Ireland.
&lt;/p&gt;
&lt;p&gt;
From the pub, we headed to &lt;a href=&quot;http://www.johnmwillis.com/&quot;&gt;John Willis&apos;s&lt;/a&gt; session on &lt;a href=&quot;http://epicenter.ie/2010.html?zone_id=21&amp;amp;mode=agenda&amp;amp;session=157#session&quot;&gt;The Cambrian Cloud Explosion&lt;/a&gt;. Following John&apos;s session, we headed to the Speaker&apos;s Dinner for a very fun evening with the hosts and speakers of the conference.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4027/4700144746_2a6f095f07.jpg&quot; title=&quot;John Willis and Barry Alistair&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4027/4700144746_2a6f095f07_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;John Willis and Barry Alistair&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4053/4699515883_49068fc757.jpg&quot; title=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4053/4699515883_49068fc757_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4039/4700145482_9e809aa875.jpg&quot; title=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4039/4700145482_9e809aa875_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4067/4699516499_61333b6e25.jpg&quot; title=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4067/4699516499_61333b6e25_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4004/4699516869_9bdda79ac4.jpg&quot; title=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4004/4699516869_9bdda79ac4_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4022/4699517415_46575ba674.jpg&quot; title=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4022/4699517415_46575ba674_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4016/4700153542_a46fca1c58.jpg&quot; title=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4016/4700153542_a46fca1c58_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Speaker&apos;s Dinner at Irish Software Show 2010&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
On Friday, we woke up in the early afternoon and quickly decided the &lt;a href=&quot;http://en.wikipedia.org/wiki/Book_of_Kells&quot;&gt;Book of Kells&lt;/a&gt; was our best chance of getting some site seeing in. After visiting the Book of Kells, my favorite quote of the conference happened in the courtyard. 
&lt;/p&gt;
&lt;p&gt;
Josh looked at Jamie (with his bad hangover) and exclaimed, &quot;My God Man. Your skin is so white it&apos;s hurting my eyes!&quot;. You probably had to be there (or know Josh) to enjoy the humor, but I wanted to capture the memory in this post so I could laugh whenever I read this in the future. After that, Jamie, Josh, Kalin and I enjoyed a Starbuck&apos;s patio talking about living in the South of France for a couple hours. Then we walked 2 blocks to the &lt;a href=&quot;http://www.porterhousebrewco.com/&quot;&gt;Porterhouse Brewing Co.&lt;/a&gt; to watch the World Cup and enjoy more interesting conversations. 
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4049/4699526381_b93c7d22a4.jpg&quot; title=&quot;The Book of Kells&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4049/4699526381_b93c7d22a4_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Book of Kells&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4025/4700168324_26c13c6b46.jpg&quot; title=&quot;Jamie with the Wenches&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4025/4700168324_26c13c6b46_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Jamie with the Wenches&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4066/4700168582_88b49c92c2.jpg&quot; title=&quot;Lovely Wenches&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4066/4700168582_88b49c92c2_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Lovely Wenches&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4006/4699540829_ca5481a452.jpg&quot; title=&quot;Jamie and his Lady Drink&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4006/4699540829_ca5481a452_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Jamie and his Lady Drink&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;Jamie left the conference that evening and we joined a whole slew of other speakers for dinner at an excellent Lebanese restaurant near Temple Bar. Good times where had afterwards at a nearby Silent Disco.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4044/4700172766_b7b82c29b5.jpg&quot; title=&quot;Kalin and Craig&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4044/4700172766_b7b82c29b5_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Kalin and Craig&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4071/4699543397_e997b2b8ff.jpg&quot; title=&quot;Post Absinthe&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4071/4699543397_e997b2b8ff_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Post Absinthe&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Saturday, we woke up early to catch a tour bus out to &lt;a href=&quot;http://en.wikipedia.org/wiki/Glendalough&quot;&gt;Glendalough&lt;/a&gt; with Josh and John. The bus ride was not pleasant, but the destination was spectacular. We hung out there for several hours, exploring the buildings, walking to the lake and humoring each other.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm5.static.flickr.com/4068/4700176486_aa86563fbf.jpg&quot; title=&quot;Glendalough&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4068/4700176486_aa86563fbf_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Glendalough&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm2.static.flickr.com/1287/4699547639_3904ddaaf1.jpg&quot; title=&quot;Beautiful Views at Glendalough&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm2.static.flickr.com/1287/4699547639_3904ddaaf1_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Beautiful Views at Glendalough&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4031/4700178148_23b6c2852a.jpg&quot; title=&quot;Glendalough&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4031/4700178148_23b6c2852a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Glendalough&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm5.static.flickr.com/4070/4699549013_40916ab088.jpg&quot; title=&quot;Lower Lake at Glendalough&quot; rel=&quot;lightbox[ireland2010]&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4070/4699549013_40916ab088_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Lower Lake at Glendalough&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Our last night in Dublin was an early, relaxing one. As you can tell, I really enjoyed this trip, particularly hanging out with my sister and all the cool people we met. I can easily say that this trip registers as one of my favorite conference experiences to date.
&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;
To see all the pictures I took on this trip, check out my &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157624148828777/&quot; style=&quot;color: #555&quot;&gt;Irish Software Show 2010 set on Flickr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/presentations_from_the_irish_software</id>
        <title type="html">My Presentations from The Irish Software Show 2010</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/presentations_from_the_irish_software"/>
        <published>2010-06-10T07:11:35-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="iss2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This week I&apos;ve been enjoying Dublin, Ireland thanks to the 2nd Annual &lt;a href=&quot;http://epicenter.ie/2010.html&quot;&gt;Irish Software Show&lt;/a&gt;. On Wednesday night, I spoke about &lt;a href=&quot;http://epicenter.ie/2010.html?zone_id=20&amp;amp;mode=agenda&amp;amp;session=152#session&quot;&gt;The Future of Web Frameworks&lt;/a&gt; and  participated in a panel with Grails, Rails, ASP.NET MVC and Seaside developers. It was a fun night with lots of lively discussion. Below is my presentation from this event.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;&lt;object id=&quot;__sse3271151&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofwebframeworks-100225012146-phpapp02&amp;amp;stripped_title=the-future-of-web-frameworks&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed name=&quot;__sse3271151&quot; src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofwebframeworks-100225012146-phpapp02&amp;amp;stripped_title=the-future-of-web-frameworks&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;This morning, I delivered my &lt;a href=&quot;http://epicenter.ie/2010.html?zone_id=20&amp;amp;mode=agenda&amp;amp;session=151#session&quot;&gt;Comparing Kick-Ass Web Frameworks&lt;/a&gt; talk. This presentation contains updated statistics for various metrics comparing Rails vs. Grails and Flex vs. GWT. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;object id=&quot;__sse2644393&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=comparingkickasswebframeworks-091203145644-phpapp02&amp;stripped_title=comparing-kick-ass-web-frameworks&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed name=&quot;__sse2644393&quot; src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=comparingkickasswebframeworks-091203145644-phpapp02&amp;stripped_title=comparing-kick-ass-web-frameworks&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;
Thanks to all who attended my talks this week!
&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;
P.S. I believe audio was recorded on Wednesday night, but I&apos;m unsure how it turned out. I&apos;m pretty sure no recordings were done on this morning&apos;s session. 
&lt;/p&gt;&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_s_new_in_spring</id>
        <title type="html">What&apos;s New in Spring 3.0</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_s_new_in_spring"/>
        <published>2010-03-19T11:46:25-06:00</published>
        <updated>2010-03-19T17:53:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="vmware" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaconfig" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tomcat" scheme="http://roller.apache.org/ns/tags/" />
        <category term="roo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsource" scheme="http://roller.apache.org/ns/tags/" />
        <category term="twitter" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This morning, I attended Rod Johnson&apos;s &lt;a href=&quot;http://javasymposium.techtarget.com/html/sessions.html#RJohnsonKeynote&quot;&gt;What&apos;s New in Spring 3.0&lt;/a&gt; keynote at TSSJS. Rod ditched his slides for the talk and mentioned that this might be risky. Especially since he was pretty jetlagged (flew in from Paris at 11pm last night). Below are my notes from his talk.
&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 10px&quot;&gt;
The most important thing for the future of Java is productivity and cloud computing. The focus at SpringSource is heavily on productivity and not just on improving the Spring codebase. If you look at the comparisons out there between Rails and Spring, it&apos;s not an apples-to-apples comparison. The philosophy with Spring has always been the developer is always right. However, if you look at something like Rails, you&apos;ll see it&apos;s far more prescriptive. That layer of opinionated frameworks is important in that it improves your productivity greatly.
&lt;/p&gt;
&lt;p&gt;
SpringSource is putting a lot of emphasis on improving developer productivity with two opinionated frameworks: Grails and Spring Roo. To show how productive developers can be, Rod started to build a web app with Spring Roo. As part of this demo, he mentioned we&apos;d see many of the new features of Spring 3: RestTemplate, @Value and Spring EL. 
&lt;/p&gt;
&lt;p&gt;
Rod used STS to write the application and built a Twitter client. After creating a new project using File -&gt; New Roo Project, a Roo Shell tab shows up at the bottom. Typing &quot;hint&quot; tells you what you should do write away. The initial message is &quot;Roo requires the installation of a JPA provider and associated database.&quot; The initial command is &quot;persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY&quot;. After running this, a bunch of log messages are shown on the console, most of them indicating that pom.xml has been modified.
&lt;/p&gt;
&lt;p&gt;
The first file that Rod shows is src/main/resources/META-INF/spring/applicationContext.xml. It&apos;s the only XML file you&apos;ll need in your application and includes a PropertyPlaceHolderConfigurer, a context:component-scan for finding annotations and a transaction manager.
&lt;/p&gt;
&lt;p&gt;
After typing &quot;hint&quot; again, Roo indicates that Rod should create entities. He does this by running &quot;ent --class ~.domain.Term --testAutomatically&quot;.  A Term class (with a bunch of annotations) is created, as well as a number of *.aj files and an integration test. Most of the files don&apos;t have anything in them but annotations. The integration test uses @RooIntegrationTest(entity=Term.class) on its class to fire up a Spring container in the test and do dependency injection (if necessary). From there, Rod demonstrated that he could easily modify the test to verify the database existed.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
private SimpleJdbcTemplate jt;

@Autowired
public void init(DataSource ds) {
    this.jt = new SimpleJdbcTemplate(ds);
}

@Test 
public void testDb() {
    jt.queryForInt(&quot;SELECT COUNT(0) FROM TERM&quot;);
}
&lt;/pre&gt;
&lt;p&gt;
Interestingly, after running the test, you could see a whole bunch of tests being run, not just the one that was in the class itself. From there, he modified the Term class to add two new properties: name and searchTerms. He also used JSR 303&apos;s @NotNull annotation to make the fields required.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Entity
@RooJavaBean
@RooToString
@RooEntity
public class Term {

    @NotNull
    private String name;

    @NotNull
    private String searchTerms;
}
&lt;/pre&gt;
&lt;p&gt;
Next, Rod added a new test and showed that the setters for these properties were automatically created and he never had to write getters and setters. This is done by aspects that are generated beside your Java files. Roo is smart enough that if you write toString() methods in your Java code, it will delete the aspect that normally generates the toString() method.
&lt;/p&gt;
&lt;p&gt;
To add fields to an entity from the command lie, you can run commands like &quot;field string --fieldName text --notNull&quot; and &quot;field number --type java.lang.Long --fieldName twitterId --notNull&quot;. The Roo Shell is also capable of establishing relationships between entities. 
&lt;/p&gt;
&lt;p&gt;
After successfully modifying his Entities, Rod started creating code to talk to Twitter&apos;s API. He used RestTemplate to do this and spent a good 5 minutes trying to get Eclipse to import the class properly. The best part of this demo was watching him do what most developers do: searching Google for RestTemplate to get the package name to import.
&lt;/p&gt;
&lt;p&gt;
After awkward silence and some fumbling, he opened an existing project (that had the dependencies properly configured) and used Java Config to configure beans for the project. This was done with a @Configuration annotation on the class, @Value annotations on properties (that read from a properties file) and @Bean annotations for the beans to expose. The first time Rod tried to run the test it failed because a twitter.properties file didn&apos;t exist.  After creating it, he successfully ran the test and successfully searched Twitter&apos;s API. 
&lt;/p&gt;
&lt;p&gt;
The nice thing about @Configuration is the classes are automatically picked up and you don&apos;t need to configure any XML to recognize them. Also, in your Java classes, you don&apos;t have to use @Autowired to get @Bean references injected. 
&lt;/p&gt;
&lt;p&gt;
After this, Rod attempted to show a web interface of the application. He started the built-in SpringSource tc Server and proceeded to show us Tomcat&apos;s 404 page. Unfortunately, Tomcat seemed to startup OK (no errors in the logs), but obviously something didn&apos;t work well. For the next few silent moments, we watched him try to delete web.xml from Eclipse. Unfortunately, this didn&apos;t work and we weren&apos;t able to see the scaffolding the entities that Rod created. 
&lt;/p&gt;
&lt;p&gt;
At this point, Rod opened a completed version of the app and was able to show it to us in a browser. You could hear the murmur of the crowd as everyone realized he was about to show the the &lt;a href=&quot;http://twitter.com/search?q=%23tssjs&quot;&gt;Twitter search results for #tssjs&lt;/a&gt;. Most of the tweets displayed were from folks commenting about how some things didn&apos;t work in the demo. 
&lt;/p&gt;
&lt;p&gt;
In summary, there&apos;s some really cool things in Spring 3: @Configuration, @Value, task scheduling with @Scheduled and one-way methods with @Async. 
&lt;/p&gt;
&lt;p&gt;
Final points of SpringSource and VMWare: they&apos;re committed to Java and middleware. Their big focus is providing an integrated experience from productivity to cloud. There&apos;s other languages that are further along than Java and SpringSource is trying to fix that. One thing they&apos;re working on is a private Java cloud that companies can use and leverage as a VMWare appliance.
&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 10px&quot;&gt;
I think there&apos;s a lot of great things in Spring 3 and most users of Roo seem to be happy with it. It&apos;s unfortunate that the Demo Gods frowned upon Rod, but it was cool to see him do the &quot;no presentation&quot; approach. 
&lt;/p&gt;
&lt;p&gt;

</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_s_happening_in_the</id>
        <title type="html">What&apos;s Happening in the Java World?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_s_happening_in_the"/>
        <published>2010-03-17T10:28:31-06:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="vegas" scheme="http://roller.apache.org/ns/tags/" />
        <category term="oracle" scheme="http://roller.apache.org/ns/tags/" />
        <category term="snorcle" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tssjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jamesgosling" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sun" scheme="http://roller.apache.org/ns/tags/" />
        <category term="glassfish" scheme="http://roller.apache.org/ns/tags/" />
        <category term="netbeans" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javafx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee6" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This morning at &lt;a href=&quot;http://javasymposium.techtarget.com/&quot;&gt;TheServerSide Java Symposium&lt;/a&gt; I attended &lt;a href=&quot;http://javasymposium.techtarget.com/html/speakers.html%23JGosling&quot;&gt;James Gosling&apos;s keynote&lt;/a&gt;. Below are my notes from his talk.&lt;/p&gt;
&lt;p&gt;
The unifying principle for Java is the Network - it ties everything together. Enterprise, Desktop, Web, Mobile, HPC, Media and Embedded. The most important thing in the Java world is the acquisition of Sun by Oracle. James is showing a slide of Duke in a fish tank with a &quot;Snorcle!&quot; title above it.
&lt;/p&gt;
&lt;p&gt;
Obligatory statistics for Java:

&lt;ul&gt;
&lt;li&gt;15 million JRE downloads/week (doesn&apos;t count tax season in Brazil)&lt;/li&gt;
&lt;li&gt;10 billion-ish Java enabled devices (more devices than people)&lt;/li&gt;
&lt;li&gt;1 billion-ish Java enabled desktops&lt;/li&gt;
&lt;li&gt;100 million-ish TV devices&lt;/li&gt;
&lt;li&gt;2.6 billion-ish mobile devices&lt;/li&gt;
&lt;li&gt;5.5 billion-ish smart cards&lt;/li&gt;
&lt;li&gt;6.5 million professional Java developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Java has become &quot;Learn Once, Work Anywhere&quot;. Most college students worldwide have taken a Java course in school. James&apos; daughter is in college but isn&apos;t interested in Java, mostly because her dad&apos;s name is all over the textbooks.
&lt;/p&gt;
&lt;p&gt;
Java EE 6 was approved September 30, 2009. It was many years in the making; the result of large-scale community collaboration. It was built by hardware manufacturers, users, developers and academia. Because of all the politics involved, many engineers had to become diplomats. Most software engineers are from the wrong Myers-Brigg quadrant for this type of negotiation. Needless to say, the process was &lt;em&gt;interesting&lt;/em&gt;.
&lt;/p&gt;
&lt;p&gt;
New and Updated APIs in Java EE 6: Servlet 3.0, JAX-RS 1.1, Bean Validation 1.0, DI 1.0, CDI 1.0, Managed Beans 1.0, JASPIC 1.1, EJB 3.1, JPA 2.0 and many others. Also new is the &lt;strong&gt;Web Profile&lt;/strong&gt;. It&apos;s the first Java EE profile to be defined. It&apos;s a fully-functional, mid-size stack for modern web application development. It&apos;s complete, but not the kitchen sink. It&apos;s what most people use when building a modern web application in Java.
&lt;/p&gt;
&lt;p&gt;Java EE 6 adds dependency injection with DI (JSR-330) and CDI (JSR-299). @Resource is still around, but an @Inject annotation has been added for typesafe injection. It has automatic scope management (request, session, etc.) and is extensible via a BeanManager API.
&lt;/p&gt;
&lt;p&gt;
GlassFish is the world&apos;s most downloaded app server (1 million-ish downloads/month). GFv2 was the EE 5 reference implementation. GFv3 is the reference implementation for EE 6. But it&apos;s not just a reference implementation, it&apos;s a benchmark-winning mission-critical large-scale app server. The FCS was released on December 10, 2009. 
&lt;/p&gt;
&lt;p&gt;Goals of Java EE: ease of use, right-sizing and extensibility. Now Roberto Chinnici (EE 6 spec lead) and another guy are on stage showing a NetBeans and GlassFish demo. With Servlet 3.0, you don&apos;t need a web.xml file, you just need a WEB-INF directory. There&apos;s a new @WebServlet annotation that lets you specify a &quot;urlPattern&quot; value for the servlet-mapping. A new @EJB annotation allows you to easily inject EJBs into your servlet. Roberto wired in an EJB, hit Ctrl+S and refreshed his browser and it all worked immediately. In the background, NetBeans and GlassFish did the redeployment and initialized the EJB container in milliseconds. &lt;/p&gt;
&lt;p&gt;@ManagedBeans and @SessionScope and @Named are all part of CDI. When using @Named, the beans become available to JSTL and you can access them using ${beanName.property}. Interestingly, the CDI annotations are in difference packages: javax.annotation.ManagedBean and javax.enterprise.context.RequestScoped.
&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;http://twitter.com/davidgeary/status/10627196026&quot;&gt;David Geary mentions&lt;/a&gt;, it&apos;s great to see the influence that Ruby on Rails has had on Java EE. 
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Long demo of JEE6 in NetBeans. Spent quite a bit of time extolling the virtues of hot deploy. Thanks, RoR!
&lt;/p&gt;
&lt;p&gt;Now Roberto is showing us the admin console of GlassFish and how modular it is. He&apos;s installing a JMS module, but it&apos;s interesting to see that there&apos;s a Ruby Container installed by default. Apache Felix is the underlying OSGI implementation used by GlassFish. You can telnet into it and see the status of all the bundles installed. After installing the full-profile, Roberto shows that you can restart the server from the console. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Isn&apos;t the whole point of OSGI that you don&apos;t have to restart anything!?&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;The GlassFish management console is definitely impressive &lt;em&gt;and&lt;/em&gt; visually appealing. Apparently, it&apos;s extensible too, so you could easily write plugins to monitor your application and provide memory statistics.&lt;/p&gt;
&lt;p&gt;Changing topics, one of the things that nice about Java is its a two-level spec. The important thing in the Java world isn&apos;t the language, it&apos;s the virtual machine. The magic is in the VM! Scala, Ruby/Rails, Groovy/Grails, Python, PHP, JavaScript, JavaFX and many others. In the same breath of talking about Java.next languages, James mentioned JavaFX Script. It&apos;s a new declarative scripting language for GUIs. It&apos;s similar to Flash or Silverlight, but it&apos;s much better because it has the Java VM under it.
&lt;/p&gt;
&lt;p&gt;At the current rate that we&apos;re going with CPUs and cores, there&apos;s a good chance we&apos;ll have 5220 cores on our desktops by 2030. If you find the concurrency libraries scary, get over it. 
&lt;/p&gt;
&lt;p&gt;For the rest of talk, James talked about what he&apos;s hacking on these days. He&apos;s helping build an Audi TTS for the Pikes Peak Road Rally in Colorado. The goal is to figure out a way to keep the vehicle above 130 MPH for the whole race. Sounds like a pretty cool project to me.
&lt;/p&gt;
&lt;p&gt;I don&apos;t think there was a whole lot of new information covered in James&apos; talk, but I really do like Java EE 6&apos;s Web Profile. However, I think it&apos;s something most of the community has been using for many years with Tomcat + Spring + Hibernate. Now it&apos;s simply been standardized. If you happen to work at one of those companies that frowns on open source and smiles at standards, you&apos;ve finally caught up with the rest of us. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/my_future_of_web_frameworks</id>
        <title type="html">My Future of Web Frameworks Presentation</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/my_future_of_web_frameworks"/>
        <published>2010-02-26T08:55:39-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vegas" scheme="http://roller.apache.org/ns/tags/" />
        <category term="theserverside" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tssjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="future" scheme="http://roller.apache.org/ns/tags/" />
        <category term="presentation" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Earlier this week, I &lt;a href=&quot;http://twitter.com/mraible/status/9467279089&quot;&gt;tweeted about a history of web frameworks timeline&lt;/a&gt; I created for my upcoming &lt;a href=&quot;http://javasymposium.techtarget.com/html/frameworks.html#MRaibleFrameworks&quot;&gt;Future of Web Frameworks talk&lt;/a&gt; at &lt;a href=&quot;http://javasymposium.techtarget.com/&quot;&gt;TSSJS Vegas 2010&lt;/a&gt;. I immediately received a lot of feedback and requests for adding new frameworks and releases. The image below is the result of that Twitter conversation. Thanks to everyone who contributed.
&lt;/p&gt;
&lt;p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/4378559350/&quot; title=&quot;History of Web Frameworks&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4067/4378559350_13f0755403.jpg&quot; width=&quot;500&quot; height=&quot;239&quot; alt=&quot;History of Web Frameworks&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_future_of_web_frameworks&quot;&gt;November&lt;/a&gt;, I wrote about my proposals for TSSJS. I&apos;ve been thinking a lot about web frameworks lately and I can&apos;t help but think we live in a very exciting time. As a Java developer, I&apos;ve been exposed to one of the most vibrant language ecosystems on the planet. As &lt;a href=&quot;http://www.javaworld.com/podcasts/jtech/2009/020909jtech-bray.html&quot;&gt;Tim Bray talks about&lt;/a&gt;, the Java Platform has 3 legs: the language, the virtual machine and a huge, immense library of APIs (both in the JDK and in open source libraries). The diagram below is something I created based on Tim&apos;s podcast.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/4388528613/&quot; title=&quot;Java has 3 Legs&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4003/4388528613_18df5e164f_o.png&quot; width=&quot;418&quot; height=&quot;290&quot; alt=&quot;Java has 3 Legs&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Tim says, &quot;One of those legs is replaceable and that&apos;s the language.&quot; And he&apos;s right, there&apos;s many &lt;a href=&quot;http://blog.thinkrelevance.com/2008/9/24/java-next-overview&quot;&gt;Java.next&lt;/a&gt; languages that run efficiently on the JVM. This is one of the most exciting parts of being a Java web developer today. There&apos;s many proven web frameworks and languages that you can pick to build your next web application. 
&lt;/p&gt;
&lt;p&gt;
The best part is many of the best web frameworks run on the JVM. Not only that, but the best code editors are the IDEs that you&apos;re familiar with and have grown to love. Furthermore, much of the literature for Java.next languages is written &lt;em&gt;for&lt;/em&gt; Java developers. As someone who knows Java, you have wealth of web frameworks and languages just waiting for you to learn them. &lt;!--I think the biggest mistake you can make as developer is to stop learning. Just because you know one language/framework well doesn&apos;t mean you shouldn&apos;t learn about it&apos;s competition. Java vs. Scala, Maven vs. Ant, Rails vs. Grails, GWT vs. Flex, Tomcat vs. Jetty, Spring vs. Guice, Hibernate vs. iBATIS - your knowledge about more than one language/framework can be very rewarding.--&gt;
&lt;/p&gt;
&lt;p&gt;
To create my presentation on the future of web frameworks, I followed the outline I &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_future_of_web_frameworks&quot;&gt;posted previously&lt;/a&gt;. I plan on explaining the evolution and history of web frameworks and how we got to where we are today. From there, I&apos;ll be speculating on what web applications we&apos;ll be developing in the future. Finally, I&apos;ll touch on the necessary features of web frameworks that will allow us to develop these applications. 
&lt;/p&gt;
&lt;p&gt;
Of course, I haven&apos;t actually presented this talk yet, so it&apos;s likely to change in the coming weeks before the conference. The good news is this gives you the opportunity to provide constructive criticism on this presentation and help make it better. I realize that a presentation rarely represents the conversation that takes place during a conference. However, I believe it can portray the jist of my thinking and lead to a meaningful conversation in the comments of this post.
Below is the presentation I created - thanks in advance for any feedback. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofwebframeworks-100225012146-phpapp02&amp;rel=0&amp;stripped_title=the-future-of-web-frameworks&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofwebframeworks-100225012146-phpapp02&amp;rel=0&amp;stripped_title=the-future-of-web-frameworks&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;
For those who will be joining me at TSSJS ... it&apos;s gonna be a great show. St. Patrick&apos;s Day in Vegas, what more could you ask for? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This article has been &lt;a href=&quot;http://java.dzone.com/articles/my-future-web-frameworks&quot;&gt;re-posted on Javalobby&lt;/a&gt; and contains additional community feedback in the comments.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/reviews_for_grails_a_quick</id>
        <title type="html">Reviews for Grails: A Quick-Start Guide and Kanban and Scrum</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/reviews_for_grails_a_quick"/>
        <published>2010-02-01T09:29:40-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="infoq" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bookreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="kanban" scheme="http://roller.apache.org/ns/tags/" />
        <category term="scrum" scheme="http://roller.apache.org/ns/tags/" />
        <category term="books" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">A couple weeks ago, I had a business trip from Denver to Washington, DC. Since I didn&apos;t have any coding to do on the flight, I brought along a couple books and was surprisingly able to finish them both en route. Tech books that can be read in a single flight are my favorite. Another book I recall doing this with was &lt;a href=&quot;http://www.firststepsinflex.com/&quot;&gt;First Steps in Flex&lt;/a&gt; back in December.&lt;/p&gt;
&lt;p&gt;The books I read were Dave Klein&apos;s &lt;a href=&quot;http://www.pragprog.com/titles/dkgrails/grails&quot;&gt;Grails: A Quick-Start Guide&lt;/a&gt; and Henrik Kniberg and Mattias Skarin&apos;s &lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;Kanban and Scrum minibook&lt;/a&gt;. Below are short reviews of each book.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grails: A Quick-Start Guide&lt;/strong&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.pragprog.com/titles/dkgrails/grails&quot;&gt;&lt;img src=&quot;//farm5.static.flickr.com/4009/4317526332_c8d18eb3f9_t.jpg&quot; width=&quot;83&quot; height=&quot;100&quot; class=&quot;picture&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
I&apos;ve developed a few Grails applications, so I didn&apos;t expect to learn a whole lot from this book, but I was pleasantly surprised. Not only did it introduce all the basic concepts in a clear and concise way, it actually made it fun to read. The first chapter does a good job of introducing Groovy; showing you how to use closures and the easy-to-use collections API. From there, you dive into learning about the project, which is actually a real-life web application called &lt;a href=&quot;http://tekdays.com/&quot;&gt;TekDays.com&lt;/a&gt;. Then the foundational Iteration Zero is planned and executed.&lt;/p&gt;

&lt;p&gt;In Chapter 3, you dive right into creating domain classes and their relationships. All the different mapping types are covered: one-to-one, one-to-many and the good ol&apos; many-to-many. Since this is often a difficult part of an application, it&apos;s always nice to see how much Grails simplifies it. I liked the Ajax section in Chapter 7 and especially the part where it showed how to do a TagLib to show threaded comments in a forum.&lt;/p&gt;
&lt;p&gt;Chapter 7 (Security) was a little disappointing in that it showed how to hand-roll your own security rather than using the &lt;a href=&quot;http://grails.org/plugin/acegi&quot;&gt;Spring Security plugin&lt;/a&gt; (formerly Acegi) or the &lt;a href=&quot;http://grails.org/plugin/shiro&quot;&gt;Shiro plugin&lt;/a&gt; (formerly JSecurity). I&apos;d especially have liked to see how to do Ajax authentication where a token is generated for the client and included as a header in each subsequent request.
&lt;/p&gt;
&lt;p&gt;Other than that, I really enjoyed Chapter 10 where I learned how to implement search using dynamic finders, Hibernate&apos;s Criteria API and the &lt;a href=&quot;http://grails.org/Searchable+Plugin&quot;&gt;Searchable Plugin&lt;/a&gt; (which gets its awesomeness from &lt;a href=&quot;http://www.compass-project.org/&quot;&gt;Compass&lt;/a&gt;). Implementing Compass in Java requires many, many annotations. In Grails, it&apos;s as simple as adding the following to your domain class.
&lt;/p&gt;
&lt;pre&gt;
static searchable = true
&lt;/pre&gt;
&lt;p&gt;I truly enjoyed this book, especially with its Agile Development patterns that used iterations to get things done. Grails: A Quick-Start Guide is a code-intensive journey that gets up you to speed on Grails quickly and efficiently. It&apos;s very much like the framework itself. It eliminates the yak shaving and allows you learn without distractions. Kudos to Dave Klein for creating such an enjoyable and easy-to-read book. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Kanban and Scrum&lt;/strong&gt;
&lt;br/&gt;
&lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2732/4317526382_473ba07fa0_t.jpg&quot; width=&quot;81&quot; height=&quot;100&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
In my career, I&apos;ve used Scrum on quite a few projects. Of course, it&apos;s not the processes that typically make a team successful. Rather, it&apos;s often the gelling of the team members, as well as respect for coding practices that are proven to create higher quality code - specifically TDD and pair programming. Before reading this book, I&apos;d heard a bit about Kanban, most of it from &lt;a href=&quot;http://martyhaught.com/&quot;&gt;Marty Haught&apos;s&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/lean_teams_doing_more_with&quot;&gt;Lean Teams: Doing more with less&lt;/a&gt; presentation. 
&lt;/p&gt;
&lt;p&gt;This book did a great job of showing the differences between the two approaches: how Scrum promotes iterations whereas Kanban promotes cycle time. The most interesting part of the book is the Case Study in the 2nd half. This section shows how a team used various techniques to develop a well-oiled development machine. I think the most important thing to note from this section is how the team was willing to change, learn and grow based on their experiences - in a very rapid fashion.&lt;/p&gt;
&lt;p&gt;In my current gig, I&apos;m helping a team of developers move from waterfall to agile processes. We&apos;re leveraging many aspects of Scrum and agile by using a coach, iterations, daily standups, TDD, continuous integration and creating &quot;as built&quot; documentation when we finish developing a feature. The &quot;As Built&quot; documentation is something I picked up from working at &lt;a href=&quot;http://www.chordiant.com&quot;&gt;Chordiant&lt;/a&gt; and I&apos;ve found it to be a great way of education developers (and outsiders) how things were done in an iteration.&lt;/p&gt;
&lt;p&gt;One thing we&apos;ve seen in our first few weeks is that iterations don&apos;t work for all teams or individuals. A Kanban model fits much better for them. Having a Kanban board allows them to visualize (and control) their workload in a much more efficient manner. We haven&apos;t started implementing actual boards on a wall, we&apos;re just using spreadsheets for now. However, we do have two Agile Coaches starting this week so I expect things to improve rapidly. 
&lt;/p&gt;
&lt;p&gt;Back to the book. More than anything, I enjoyed reading this book because it made me excited about the changes I&apos;m helping implement and I believe in many of the practices in both Scrum and Kanban. I enjoy iterations and structured expectations around development, but I can see how Kanban would work better for folks in operations and infrastructure. I look forward to implementing the best parts of both worlds and hopefully a similar Case Study of what worked and what didn&apos;t. With any luck, we&apos;ll be able to learn, evolve and produce at a much higher level than previous waterfall practices achieved.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/2009_a_year_in_review</id>
        <title type="html">2009 - A Year in Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/2009_a_year_in_review"/>
        <published>2010-01-11T10:06:09-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="newyear" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yearinreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="blogging" scheme="http://roller.apache.org/ns/tags/" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I wrote my first &quot;year in review&quot; post in &lt;a href=&quot;http://raibledesigns.com/rd/entry/2005_a_year_in_review&quot;&gt;2005&lt;/a&gt; and continued the tradition in &lt;a href=&quot;http://raibledesigns.com/rd/entry/2006_a_year_in_review&quot;&gt;2006&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/2008_a_year_in_review&quot;&gt;2008&lt;/a&gt;. This year, my December was filled with &lt;a href=&quot;http://twitter.com/mraible/status/6376757616&quot; title=&quot;Arrived home to the sound of a waterfall. Water pipes burst in guest room. Doh!&quot;&gt;unplanned circumstances&lt;/a&gt;, a new job and a houseful of family for the holidays, so I never had time to sit down and write this post. As things are returning to normal, I figured it&apos;s about time I kicked off 2010 with one of my favorite writing reflections.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3099/3218234204_c8a83629c6.jpg&quot; title=&quot;Experts Only&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3099/3218234204_c8a83629c6_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Experts Only&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
2009 started off with a bang: I wrote about my Mom &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_mom&quot;&gt;nailing a bear&apos;s nuts to a tree after she killed it&lt;/a&gt;. My new gig (at Evite) started out fun with &lt;a href=&quot;http://raibledesigns.com/rd/entry/choosing_an_ajax_framework&quot;&gt;choosing an Ajax framework&lt;/a&gt; and a &lt;a href=&quot;http://raibledesigns.com/rd/entry/la_tech_meetup_tonight&quot;&gt;Tech Meetup in LA&lt;/a&gt;. My &lt;a href=&quot;http://raibledesigns.com/rd/entry/r_i_p_giant_fcr3&quot;&gt;bike got stolen&lt;/a&gt;, I started &lt;a href=&quot;http://raibledesigns.com/rd/entry/running_to_work&quot;&gt;running to work&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/traveling_to_tahoe_without_a&quot;&gt;traveled to Tahoe without an ID&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;
February started off with an &lt;a href=&quot;http://raibledesigns.com/rd/entry/epic_weekend_at_silverton_mountain&quot;&gt;epic weekend at Silverton&lt;/a&gt;. I went to &lt;a href=&quot;http://north09.webdirections.org/&quot;&gt;Web Directions North&lt;/a&gt; and attended many good talks:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/changes_in_the_languages_of&quot;&gt;Changes in the Languages of The Web&lt;/a&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/the_state_of_the_web&quot;&gt;The State of the Web 2009&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_the_state_of_the&quot;&gt;Ajax: The State of the Art&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wrote my first &lt;a href=&quot;http://raibledesigns.com/rd/entry/testing_gwt_applications&quot; title=&quot;Testing GWT Applications&quot;&gt;GWT-related entry&lt;/a&gt; and a few posts related to independent consulting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_setup_your_own&quot;&gt;How To Setup Your Own Software Development Company&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/writing_off_home_office_space&quot;&gt;Writing Off Home Office Space&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_the_best_retirement&quot;&gt;What&apos;s the Best Retirement Plan for Independent Consultants?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I ended February with a &lt;a href=&quot;http://raibledesigns.com/rd/entry/enhancing_your_gwt_application_with&quot; title=&quot;Enhancing your GWT Application with the UrlRewriteFilter&quot;&gt;couple&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/gwttestsuite_makes_builds_faster_but&quot; title=&quot;GWTTestSuite makes builds faster, but requires JUnit 4.1&quot;&gt;more&lt;/a&gt; GWT-related entries.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3658/3343506648_caa24e1d39.jpg&quot; title=&quot;On the top&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3658/3343506648_caa24e1d39_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;On the top&quot; class=&quot;picture&quot;/&gt;&lt;/a&gt;

In March, I bought a &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_15_macbook_pro_with&quot;&gt;new 15&quot; MacBook Pro&lt;/a&gt; and shipped it back shortly after to get a 256 GB SSD. I still have nothing but good things to say about the machine. I discovered &lt;a href=&quot;http://raibledesigns.com/rd/entry/nexus_is_a_kick_ass&quot;&gt;Nexus is awesome&lt;/a&gt; and the kids and I went on our &lt;a href=&quot;http://raibledesigns.com/rd/entry/1st_hike_of_2009&quot;&gt;first hike of the year&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;My GWT Journey continued with &lt;a href=&quot;http://raibledesigns.com/rd/entry/gxt_s_mvc_framework&quot;&gt;GXT MVC&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/modularizing_gwt_applications_with_gwt&quot;&gt;modularization&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/optimizing_a_gwt_application_with&quot;&gt;optimization&lt;/a&gt;. I got a &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_office_and_new_bike&quot;&gt;new office and new bike&lt;/a&gt; and proudly witnessed my &lt;a href=&quot;http://raibledesigns.com/rd/entry/congratulations_on_retiring_dad&quot;&gt;Dad&apos;s Retirement&lt;/a&gt;.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;April came and I &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_drunk_on_software_interview&quot;&gt;got Drunk on Software&lt;/a&gt;, had a blast at &lt;a href=&quot;http://raibledesigns.com/rd/entry/jason_and_holly_s_wedding&quot;&gt;Holly and Jason&apos;s Wedding&lt;/a&gt; and published our &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_framework_analysis_results&quot;&gt;Ajax Framework Analysis Results&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3545/3461916124_11582cee7c.jpg&quot; title=&quot;Mr. and Mrs. Harris&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3545/3461916124_11582cee7c_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Mr. and Mrs. Harris&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;At the end of April, I started &lt;a href=&quot;http://raibledesigns.com/rd/entry/life_update_new_treehouse_new&quot;&gt;building the kids a treehouse and inspired smiles with two new kittens&lt;/a&gt;. On May 7th, I had PRK eye surgery and &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_eye_surgery_experience&quot;&gt;wrote about my experience in early June&lt;/a&gt;. I continue to be extremely happy with the results.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3656/3471565132_7a5e4ebdb2.jpg&quot; title=&quot;Day 3 - They love it!&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3656/3471565132_7a5e4ebdb2_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Day 3 - They love it!&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3545/3470751035_d016beb0d9.jpg&quot; title=&quot;Day 4 - Floor completed&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3545/3470751035_d016beb0d9_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Day 4 - Floor completed&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3360/3505899171_3cb4e849b1.jpg&quot; title=&quot;Jack and Olivia&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3360/3505899171_3cb4e849b1_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Jack and Olivia&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3562/3506709142_21fa103252.jpg&quot; title=&quot;Abbie and Mittens&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3562/3506709142_21fa103252_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Abbie and Mittens&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;May ended with &lt;a href=&quot;http://raibledesigns.com/rd/entry/ryan_and_breanne_s_wedding&quot;&gt;Ryan and Breanne&apos;s Wedding in Playa Del Carmen&lt;/a&gt;. Having so many great friends around and the Nuggets vs. Lakers playoffs the same week made this one of the best vacations of my life.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3618/3580803902_449464cf49.jpg&quot; title=&quot;Ready for the Ceremony&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3618/3580803902_449464cf49_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Ready for the Ceremony&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3644/3579992115_05c0cb7b7f.jpg&quot; title=&quot;Vows&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3644/3579992115_05c0cb7b7f_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Vows&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3153/3580823360_3e2e997894.jpg&quot; title=&quot;Mariachi Band&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3153/3580823360_3e2e997894_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Mariachi Band&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3374/3580011379_fa403528cb.jpg&quot; title=&quot;Mr. and Mrs. Johnson&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3374/3580011379_fa403528cb_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Mr. and Mrs. Johnson&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;June brought the news that the &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_end_of_colorado_software&quot;&gt;Colorado Software Summit was over&lt;/a&gt;. There&apos;s been several times in the past few months that I&apos;ve missed the annual experience. Can someone please start a conference at a Colorado mountain resort in the near future? Pretty please! I&apos;ve always experienced this conference with &lt;a href=&quot;http://bsnyderblog.blogspot.com/&quot;&gt;Bruce&lt;/a&gt; and we continued another tradition (riding to Red Rocks) with &lt;a href=&quot;http://raibledesigns.com/rd/entry/2nd_row_at_red_rocks&quot;&gt;2nd Row seats at Big Head Todd&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;My GWT posts continued with a &lt;a href=&quot;http://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete&quot;&gt;Facebook-style Autocomplete&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt&quot;&gt;Implementing OAuth&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/json_parsing_with_javascript_overlay&quot;&gt;JSON Parsing with JavaScript Overlays&lt;/a&gt; and a preview of &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_use_gwt_2&quot;&gt;GWT 2.0&lt;/a&gt;. I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt&quot;&gt;implementing SOFEA with GWT and Grails at Evite.com&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_fun_father_s_day&quot;&gt;had a blast at the Great Sand Dunes on Father&apos;s Day&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm3.static.flickr.com/2461/3655577467_c84ac6e9d7.jpg&quot; title=&quot;Abbie and Cookie at The Dunes&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2461/3655577467_c84ac6e9d7_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Abbie and Cookie at The Dunes&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
My &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_good_ol_job_hunt1&quot;&gt;job hunt&lt;/a&gt; began and I started a month-long vacation in Montana with &lt;a href=&quot;http://raibledesigns.com/rd/entry/raible_road_trip_13&quot;&gt;Raible Road Trip #13&lt;/a&gt;. Vacationing for a summer month in Montana has been one of my goals for several years. Accomplishing it this year made me extremely happy and I hope to make it a summer tradition.&lt;/p&gt;
&lt;p&gt;July was an awesome month in 2009. Granted, April and May were special with tropical weddings, but Montana in July is a particularly tasty treat. &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_summer_vacation_in_montana&quot;&gt;My Summer Vacation in Montana&lt;/a&gt; attempts to capture how much fun we had. It was particularly enjoyable because my parents, children and many life-long friends were involved.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm3.static.flickr.com/2568/3769250242_a002f5d6cb.jpg&quot; title=&quot;View of the Missions from Holland Falls&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2568/3769250242_a002f5d6cb_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;View of the Missions from Holland Falls&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm3.static.flickr.com/2431/3769250820_19d03c599b.jpg&quot; title=&quot;Ready for the Celebrate the Swan Race&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2431/3769250820_19d03c599b_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Ready for the Celebrate the Swan Race&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3293/3769258046_9613fca22c.jpg&quot; title=&quot;Horseshoes&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3293/3769258046_9613fca22c_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Horseshoes&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3612/3768465807_39e1cf17f6.jpg&quot; title=&quot;Floor Pouring Crew&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3612/3768465807_39e1cf17f6_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Floor Pouring Crew&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
As summer began to set, I decided to get back into speaking at conferences, starting with the &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_2009_rich_web_experience&quot;&gt;Rich Web Experience&lt;/a&gt;. I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_to_do_cross_domain&quot; title=&quot;How to do cross-domain GWT RPC with a ProxyServlet&quot;&gt;initial&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/integrating_gwt_with_spring_security&quot; title=&quot;Integrating GWT with Spring Security&quot;&gt;GWT&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/browser_based_username_password_autocomplete&quot; title=&quot;My attempt at browser-based username/password autocomplete with GWT&quot;&gt;work&lt;/a&gt; at my &lt;a href=&quot;http://chordiant.com/&quot; title=&quot;Chordiant Software&quot;&gt;new client&lt;/a&gt;, which included an interesting &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_experience_with_java_rest&quot; title=&quot;My Experience with Java REST Frameworks (specifically Jersey and CXF)&quot;&gt;experience with Java REST Frameworks&lt;/a&gt;. The month ended with one of my favorite holidays: &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_jack3&quot;&gt;Jack&apos;s Birthday&lt;/a&gt;.

&lt;/p&gt;
&lt;p&gt;September was nice and uneventful. I learned about &lt;a href=&quot;http://raibledesigns.com/rd/entry/concurrency_on_the_jvm_using&quot; title=&quot;Concurrency on the JVM Using Scala with Venkat Subramaniam&quot;&gt;Concurrency on the JVM Using Scala&lt;/a&gt;, started using &lt;a href=&quot;http://raibledesigns.com/rd/entry/building_gwt_applications_with_mvp&quot; title=&quot;Building GWT Applications with MVP and Issues with Overlay Types&quot;&gt;MVP with GWT&lt;/a&gt; and learned how to &lt;a href=&quot;http://raibledesigns.com/rd/entry/lean_teams_doing_more_with&quot; title=&quot;Lean Teams: Doing more with less (Derailed)&quot;&gt;do more with less&lt;/a&gt;. I also ran in a &lt;a href=&quot;http://www.fansonthefield.com/&quot;&gt;10K&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;October started out with a family trip to Washington for &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_sister_s_fabulous_wedding&quot;&gt;my sister&apos;s fabulous wedding&lt;/a&gt;. People flew in from all over the US and we had a sweet condo on Lake Chelan for the week. Playing golf, wine tasting and celebrating with good people made for a great start to the fall season.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm3.static.flickr.com/2537/4142221061_af166b8b3b.jpg&quot; title=&quot;Kalin and Mya&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2537/4142221061_af166b8b3b_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;Kalin and Mya&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://farm3.static.flickr.com/2737/4104358666_a4628d6e38.jpg&quot; title=&quot;Abbie and Charles&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2737/4104358666_a4628d6e38_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Abbie and Charles&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
In November, I started writing more, mostly because I was gearing up for &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_future_of_web_frameworks&quot; title=&quot;The Future of Web Frameworks at TSSJS&quot;&gt;upcoming&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/consulting_sofea_grails_and_gwt&quot; title=&quot;Building SOFEA Applications with GWT and Grails&quot;&gt;talks&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_letter_to_the_appfuse&quot; title=&quot;A Letter to the AppFuse Community&quot;&gt;thinking about&lt;/a&gt; / &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_1_milestone_1&quot; title=&quot;AppFuse 2.1 Milestone 1 Released&quot;&gt;working on AppFuse&lt;/a&gt;. I celebrated &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_birthday_abbie5&quot;&gt;Abbie&apos;s Birthday&lt;/a&gt;, did some &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;website&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/adding_expires_headers_with_oscache&quot;&gt;optimization&lt;/a&gt; and chuckled at the comments about my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_hunting_season_adventure_at&quot;&gt;hunting season adventure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Right before Thanksgiving, I got a call from my client letting me know that their budget had run out my contract would end soon. Luckily, I had an interview setup the next day and had great success in finding a new gig.&lt;/p&gt;
&lt;p&gt;I ended November with a trip to Oregon for Thanksgiving and ran in the &lt;a href=&quot;http://www.omroadrace.org/&quot;&gt;Oregon Mid-Valley Road Race&lt;/a&gt;. The followed week, I flew with my kids and parents to The Rich Web Experience and learned about &lt;a href=&quot;http://raibledesigns.com/rd/entry/introduction_to_objective_j_and&quot;&gt;Objective-J and Cappuccino&lt;/a&gt;. I had a near-perfect (high 70s, no lines) Disney World experience with my family, watched the Ducks with the &lt;a href=&quot;http://en.wikipedia.org/wiki/Civil_War_%28college_football_game%29&quot;&gt;Civil War&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/comparing_kick_ass_web_frameworks&quot;&gt;compared kick-ass web frameworks&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm3.static.flickr.com/2767/4253979011_4bc9a5e350.jpg&quot; title=&quot;Kids at Loews Portofino, Universal Studios Florida&quot; rel=&quot;lightbox[2009yearinreview]&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2767/4253979011_4bc9a5e350_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Kids at Loews Portofino, Universal Studios Florida&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In December, I didn&apos;t do much blogging - mostly because I arrived home from Florida to discover a waterfall in my guest room. The water pipes were routed through the ceiling, had &lt;a href=&quot;http://twitpic.com/s9xo9&quot;&gt;busted from the cold&lt;/a&gt;, and water was pouring everywhere. Dealing with that and starting a new job occupied most of my time and I never got a chance to write much down. I ran in the &lt;a href=&quot;http://www.arthritis.org/jingle-bell-run.php&quot;&gt;Jingle Bell 5K&lt;/a&gt; and watched the Broncos lose a lot. Shortly after, my family came for Christmas and a good time was had by all.
&lt;/p&gt;
&lt;p&gt;As I reflect back on last year, my biggest surprise is that I got into running. I ended up running in 5 races last year and even enjoyed doing it a few times. It&apos;s still not my favorite activity (skiing and mountain biking win that title), but I enjoy it enough to do it a couple times each week. The goals I wrote down for last year were: visit 3 foreign countries, take 3 months of vacation and spend 1 month in Montana. I only made it to 1 foreign country (Mexico), but I did take 2 months of vacation and got my month in Montana. I&apos;ll take that.&lt;/p&gt;
&lt;p&gt;In 2010, I hope to speak at (or attend) 3 conferences, finish up The Bus and do a whole bunch of skiing and mountain biking. More than anything, I plan to continue having a lot of fun with my family and implementing a lot of cool technologies along the way. &lt;/p&gt;
&lt;p&gt;It&apos;s gonna be a great year.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/grails_oauth_and_linkedin_apis</id>
        <title type="html">Grails OAuth and LinkedIn APIs</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/grails_oauth_and_linkedin_apis"/>
        <published>2009-12-22T15:37:57-07:00</published>
        <updated>2009-12-23T07:17:35-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="github" scheme="http://roller.apache.org/ns/tags/" />
        <category term="linkedin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="profile" scheme="http://roller.apache.org/ns/tags/" />
        <category term="oauth" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Back in November, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/gwt_oauth_and_linkedin_apis&quot;&gt;how to talk to LinkedIn APIs with GWT&lt;/a&gt;. A week later, I &lt;a href=&quot;http://twitter.com/mraible/status/6195066631&quot;&gt;figured out how to do it with Grails&lt;/a&gt; and contributed a &lt;a href=&quot;http://code.google.com/p/grails-oauth/issues/detail?id=1&quot;&gt;patch&lt;/a&gt; to the grails-oauth plugin. 
&lt;/p&gt;
&lt;p&gt;Since then, a few folks have asked how I did it. Since code speaks louder than words, I took some time and 1) verified the oauth plugin works as expected and 2) created an example application demonstrating functionality. You can find the results in &lt;a href=&quot;http://github.com/mraible/grails-oauth&quot;&gt;my fork of grails-oauth on GitHub&lt;/a&gt;. You can also &lt;a href=&quot;http://demo.raibledesigns.com/grails-oauth&quot;&gt;view the example online&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;border-bottom: 1px dotted silver; padding-bottom: 5px&quot;&gt;Below is a quick tutorial explaining how to integrate LinkedIn into your Grails application.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.grails.org/Download&quot;&gt;Download&lt;/a&gt; and install Grails 1.1.2.&lt;/li&gt;
&lt;li&gt;Run &lt;em&gt;grails create-app&lt;/em&gt; to create your application.&lt;/li&gt;
&lt;li&gt;Add the following to the bottom of &lt;em&gt;grails-app/conf/Config.groovy&lt;/em&gt;:
&lt;pre class=&quot;brush: java&quot;&gt;
oauth {
    linkedin {
        requestTokenUrl=&quot;https://api.linkedin.com/uas/oauth/requestToken&quot;
        accessTokenUrl=&quot;https://api.linkedin.com/uas/oauth/accessToken&quot;
        authUrl=&quot;https://api.linkedin.com/uas/oauth/authorize&quot;
        consumer.key=&quot;XXX&quot;
        consumer.secret=&quot;XXX&quot;
    }
}
&lt;/pre&gt;
You can get your consumer.key and consumer.secret at &lt;a href=&quot;https://www.linkedin.com/secure/developer&quot;&gt;https://www.linkedin.com/secure/developer&lt;/a&gt;. Make sure to set the &lt;em&gt;OAuth Redirect URL&lt;/em&gt; to http://localhost:8080/{your.app.name}/oauth/callback for testing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/mraible/grails-oauth/archives/master&quot;&gt;Download&lt;/a&gt; the oauth-plugin, extract it and build it using &lt;em&gt;grails package-plugin&lt;/em&gt;. Install it in your project using &lt;em&gt;grails install-plugin path/to/zip&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Add a link to the GSP you want to invoke LinkedIn Authentication from:
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;g:oauthLink consumer=&apos;linkedin&apos; returnTo=&quot;&amp;#91;controller:&apos;profile&apos;&amp;#93;&quot;&amp;gt;
    Login with LinkedIn
&amp;lt;/g:oauthLink&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Create &lt;em&gt;grails-app/controllers/ProfileController.groovy&lt;/em&gt; to access your LinkedIn Profile.
&lt;pre class=&quot;brush: java&quot;&gt;
class ProfileController {
    def apiUrl = &quot;http://api.linkedin.com/v1/people/~&quot;
    def oauthService
    
    def index = {
 
        if (session.oauthToken == null) {
            redirect(uri:&quot;/&quot;)
        }
 
        if (params?.apiUrl) apiUrl = params.apiUrl
        
        def response = oauthService.accessResource(
                apiUrl, &apos;linkedin&apos;, &amp;#91;key:session.oauthToken.key, secret:session.oauthToken.secret&amp;#93;, &apos;GET&apos;)
 
        render(view: &apos;index&apos;, model: &amp;#91;profileXML: response, apiUrl: apiUrl&amp;#93;)
    }
 
    def change = {
        if (params?.apiUrl) {
            println(&quot;Setting api url to &quot; + params.apiUrl)
            apiUrl = params.apiUrl
        }
        
        redirect(action:index,params:params)
    }
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Create &lt;em&gt;grails-app/views/profile/index.gsp&lt;/em&gt; to display the retrieved profile and allow subsequent API calls.
&lt;pre class=&quot;brush: html&quot;&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Your Profile&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;a class=&quot;home&quot; href=&quot;${createLinkTo(dir:&apos;&apos;)}&quot;&amp;gt;Home&amp;lt;/a&amp;gt;
&amp;lt;g:hasOauthError&amp;gt;
    &amp;lt;div class=&quot;errors&quot;&amp;gt;
        &amp;lt;g:renderOauthError/&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/g:hasOauthError&amp;gt;

&amp;lt;g:form url=&quot;&amp;#91;action:&apos;change&apos;,controller:&apos;profile&apos;&amp;#93;&quot; method=&quot;get&quot;&amp;gt;
    Your LinkedIn Profile:
    &amp;lt;textarea id=&quot;payload&quot; style=&quot;width: 100%; height: 50%; color: red&quot;&amp;gt;${profileXML}&amp;lt;/textarea&amp;gt;
    &amp;lt;p&amp;gt;
        &amp;lt;g:textField name=&quot;apiUrl&quot; value=&quot;${apiUrl}&quot; size=&quot;100%&quot;/&amp;gt;
        &amp;lt;br/&amp;gt;
        &amp;lt;g:submitButton name=&quot;send&quot; value=&quot;Send Request&quot;/&amp;gt;
    &amp;lt;/p&amp;gt;
&amp;lt;/g:form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Start your app using &lt;em&gt;grails run-app&lt;/em&gt; and enjoy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px&quot;&gt;As mentioned earlier, you can &lt;a href=&quot;http://github.com/mraible/grails-oauth/archives/master&quot;&gt;download the grails-oauth-example&lt;/a&gt; or &lt;a href=&quot;http://demo.raibledesigns.com/grails-oauth&quot;&gt;view it online&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;One improvement I&apos;d like to see is to simplify the parsing of XML into a Profile object, much like the &lt;a href=&quot;http://pivotallabs.com/users/will/blog/articles/1096-linkedin-gem-for-a-web-app&quot;&gt;linkedin gem&lt;/a&gt; does for Rails. 
&lt;/p&gt;
&lt;p&gt;
If you&apos;re interested in learning more about LinkedIn and OAuth, I encourage you to checkout &lt;a href=&quot;http://www.linkedin.com/in/taylorsingletary&quot;&gt;Taylor Singletary&apos;s&lt;/a&gt; presentation &lt;a href=&quot;http://www.slideshare.net/episod/linkedin-oauth-zero-to-hero&quot;&gt;LinkedIn OAuth: Zero to Hero&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I &lt;a href=&quot;http://github.com/mraible/grails-oauth/commit/6db20f3b8341383b869f49d6ca126ebd99ccb364&quot;&gt;updated&lt;/a&gt; the oauth-plugin so it&apos;s backwards-compatible with OAuth 1.0 and added Twitter to the example application to prove it. If you&apos;re seeing &quot;Cannot invoke method remove() on null object&quot;, it&apos;s likely caused by your redirect URL pointing to an application on a different domain.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comparing_kick_ass_web_frameworks</id>
        <title type="html">Comparing Kick-Ass Web Frameworks at The Rich Web Experience</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comparing_kick_ass_web_frameworks"/>
        <published>2009-12-04T08:16:48-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jobs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="richwebexperience" scheme="http://roller.apache.org/ns/tags/" />
        <category term="richweb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="trends" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Yesterday, I delivered my &lt;a href=&quot;http://www.therichwebexperience.com/conference/orlando/2009/12/session?id=15951&quot;&gt;Comparing Kick-Ass Web Frameworks&lt;/a&gt; talk at the Rich Web Experience in Orlando, Florida. Below are the slides I used:&lt;/p&gt;
&lt;div style=&quot;text-align:center; margin-bottom: 10px&quot; id=&quot;__ss_2644393&quot;&gt;
&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=comparingkickasswebframeworks-091203145644-phpapp02&amp;stripped_title=comparing-kick-ass-web-frameworks&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=comparingkickasswebframeworks-091203145644-phpapp02&amp;stripped_title=comparing-kick-ass-web-frameworks&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/div&gt;
&lt;p&gt;Although it&apos;s difficult to convey a presentation in a slide deck, I can offer you my conclusion: &lt;a href=&quot;http://java.dzone.com/news/there-no-best-web-framework&quot;&gt;there is no &quot;best&quot; web framework&lt;/a&gt;. I believe web frameworks are like &lt;a href=&quot;http://www.ted.com/talks/malcolm_gladwell_on_spaghetti_sauce.html&quot;&gt;spaghetti sauce&lt;/a&gt; in that everyone has different tastes and having so many choices is necessary to satisfy everyone. You can read more about the &lt;em&gt;plural nature of perfection&lt;/em&gt; in Malcolm Gladwell&apos;s &lt;a href=&quot;http://www.gladwell.com/2004/2004_09_06_a_ketchup.html&quot;&gt;The Ketchup Conundrum&lt;/a&gt; (a written version of &lt;a href=&quot;http://www.ted.com/talks/malcolm_gladwell_on_spaghetti_sauce.html&quot;&gt;What we can learn from spaghetti sauce&lt;/a&gt;). Even though there is no &quot;best&quot; web framework, I believe GWT, Flex, Rails and Grails are frameworks that every web developer should try. They really do make it fun to develop web applications.
&lt;/p&gt;
&lt;p&gt;You can find the slides for my other RWE talk at &lt;a href=&quot;http://raibledesigns.com/rd/entry/building_sofea_applications_with_gwt&quot;&gt;Building SOFEA Applications with GWT and Grails&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Kudos to &lt;a href=&quot;http://www.nofluffjuststuff.com&quot;&gt;Jay Zimmerman&lt;/a&gt; for putting on a great show in Orlando this year. I had a great time talking with folks and learning in the sessions I attended. I particularly enjoyed bringing my parents and kids and staying at such a nice resort. Disney World (Magic Kingdom) and Universal Studios was very enjoyable due to the short lines. Also, the weather was perfect - especially considering the freezing cold in Denver this week. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/building_sofea_applications_with_gwt</id>
        <title type="html">Building SOFEA Applications with GWT and Grails</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/building_sofea_applications_with_gwt"/>
        <published>2009-11-12T09:30:09-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="evite" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sofea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last night, I spoke at the &lt;a href=&quot;http://denverjug.org&quot;&gt;Denver Java User Group&lt;/a&gt; meeting. The consulting panel with &lt;a href=&quot;http://www.ambientideas.com/blog/&quot;&gt;Matthew&lt;/a&gt;, &lt;a href=&quot;http://www.augusttechgroup.com/tim/blog/&quot;&gt;Tim&lt;/a&gt; and &lt;a href=&quot;http://www.jroller.com/JamesGoodwill/&quot;&gt;Jim&lt;/a&gt; 
a lot of fun and I enjoyed delivering my &lt;a href=&quot;http://raibledesigns.com/rd/entry/consulting_sofea_grails_and_gwt&quot;&gt;Building SOFEA Applications with GWT and Grails&lt;/a&gt; presentation for the first time. The talk was mostly a story about how we &lt;a href=&quot;http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt&quot;&gt;enhanced Evite.com with GWT and Grails&lt;/a&gt; and what we did to make both frameworks scale. I don&apos;t believe the presentation reflects the story format that well, but it&apos;s not about the presentation, it&apos;s about the delivery of it. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot; id=&quot;__ss_2484656&quot;&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sofeawithgwtandgrails-091112101640-phpapp01&amp;rel=0&amp;stripped_title=building-sofea-applications-with-gwt-and-grails&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=sofeawithgwtandgrails-091112101640-phpapp01&amp;rel=0&amp;stripped_title=building-sofea-applications-with-gwt-and-grails&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;d like to hear the story about this successful SOFEA implementation at a high-volume site, I&apos;d recommend attending the &lt;a href=&quot;http://www.therichwebexperience.com&quot;&gt;Rich Web Experience&lt;/a&gt; next month. If you attended last night&apos;s meeting and have any feedback on how this talk can be improved, I&apos;d love to hear it.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/the_future_of_web_frameworks</id>
        <title type="html">The Future of Web Frameworks at TSSJS</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/the_future_of_web_frameworks"/>
        <published>2009-11-10T13:24:39-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="vegas" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tssjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gears" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="html5" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://www.wayfaring.info/2009/08/09/caesars-palace-las-vegas/&quot; title=&quot;Caesars Palace, Las Vegas&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2757/4092935229_4324eb8af9_t.jpg&quot; width=&quot;100&quot; height=&quot;83&quot; alt=&quot;Caesars Palace&quot; style=&quot;border: 1px solid black&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;

For &lt;a href=&quot;http://javasymposium.techtarget.com/&quot;&gt;TSSJS Vegas 2010&lt;/a&gt;, I submitted two proposals for talks: &lt;em&gt;GWT vs. Flex Smackdown&lt;/em&gt; and &lt;em&gt;The Future of Web Frameworks&lt;/em&gt;. As of today, the 2nd is the only one that &lt;a href=&quot;http://javasymposium.techtarget.com/html/frameworks.html#MRaibleFrameworks&quot;&gt;shows up on the conference agenda&lt;/a&gt;, but hopefully the former will get accepted too. Here&apos;s a description of this talk:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
With rich Ajax applications and HTML5 on the horizon, are web frameworks still relevant? Java web frameworks like Struts and Spring MVC were all the rage 5 years ago. Component-based frameworks like Tapestry, JSF and Wicket made it easier to create re-usable applications. But what about the Mobile Web and offline applications?
&lt;br/&gt;&lt;br/&gt;
Are Titanium, Adobe Air and Gears the future? If you&apos;re embracing the RESTfulness of the web, do you even need a web framework, or can you use use JAX-RS with an Ajax toolkit?
&lt;br/&gt;&lt;br/&gt;
These questions and many more are examined, answered and debated in this lively session. Bring your opinions and experiences to this session to learn about what&apos;s dead, what&apos;s rising and what&apos;s here to stay. If you&apos;re a web framework fan, this session is sure to please.
&lt;/p&gt;
&lt;p&gt;I believe this talk will be a lot of fun to create and deliver. To create it, I&apos;d like to make it a collaborative effort with the web framework community (users and developers). To kick things off, below is an initial rough outline/agenda: &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Title&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Introduction&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Problem/Purpose&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Agenda&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;How did we get here?&lt;/li&gt;&lt;li&gt;Where are we going?&lt;/li&gt;&lt;li&gt;How do we get there?&lt;/li&gt;&lt;li&gt;Q and A&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;History of Web Frameworks&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Deep History (CGI, etc.)&lt;/li&gt;&lt;li&gt;Java&apos;s Rise&lt;/li&gt;&lt;li&gt;PHP&lt;/li&gt;&lt;li&gt;Rails -&amp;gt; Grails&lt;/li&gt;&lt;li&gt;Ajax Frameworks&lt;/li&gt;&lt;li&gt;RESTify!&lt;/li&gt;&lt;li&gt;SOFEA, APIs, etc.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;The Future&lt;/li&gt;&lt;ul&gt;&lt;li&gt;HTML5&lt;/li&gt;&lt;li&gt;GWT, Cappucino and Spoutcore (compare to Java and compilers)&lt;/li&gt;&lt;li&gt;The Binary Players (Flex, JavaFX and Silverlight)&lt;/li&gt;&lt;li&gt;Getting Rich&lt;/li&gt;&lt;li&gt;Speed (is it a problem? YES!)&lt;/li&gt;&lt;li&gt;IE 6 will die.&lt;/li&gt;&lt;li&gt;Chrome OS&lt;/li&gt;&lt;li&gt;The Mobile Web&lt;/li&gt;&lt;li&gt;Desktop Webapps (Titanium, AIR, etc.)&lt;/li&gt;&lt;li&gt;Or is this the present? Future is bleeding edge.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Getting There: It&apos;s all about the APIs&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Allows for any client&lt;/li&gt;&lt;li&gt;Web Framework skills transfer to desktop - and phone!&lt;/li&gt;&lt;li&gt;Speed will continue to be *very* important&lt;/li&gt;&lt;li&gt;Innovation, something we haven&apos;t thought of&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Fallout&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Interest in server-side frameworks will continue, but frameworks will become unmaintained&lt;/li&gt;&lt;li&gt;Ajax Frameworks will continue to innovate&lt;/li&gt;&lt;li&gt;HTML5 Frameworks?&lt;/li&gt;&lt;li&gt;IE 6 (hopefully!)&lt;/li&gt;&lt;li&gt;Desktop and Mobile with Web Technologies&lt;/li&gt;&lt;li&gt;Watch out for the next big thing! (or What do you think is the next big thing?)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Conclusion&lt;/li&gt;&lt;li&gt;Q and A&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Is there anything I&apos;m missing that&apos;s important for the future of web frameworks? Are there items that should be removed? Any advice is most welcome.
&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; color: #666; font-style: italic; padding-top: 5px&quot;&gt;
Reminder: I&apos;ll be &lt;a href=&quot;http://raibledesigns.com/rd/entry/consulting_sofea_grails_and_gwt&quot;&gt;speaking at tomorrow&apos;s DJUG&lt;/a&gt; if you&apos;d like to discuss your thoughts in person.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/javascript_and_css_concatenation</id>
        <title type="html">JavaScript and CSS Concatenation with wro4j</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/javascript_and_css_concatenation"/>
        <published>2009-11-09T10:44:44-07:00</published>
        <updated>2009-11-23T18:17:42-07:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <category term="compression" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yuicompressor" scheme="http://roller.apache.org/ns/tags/" />
        <category term="minification" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javascript" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wro4j" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yslow" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jawr" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This past weekend, I decided it was about time to fix my &lt;a href=&quot;http://developer.yahoo.com/yslow/&quot;&gt;YSlow&lt;/a&gt; score on this site. I did the easiest thing first by moving all my JavaScript files to the bottom of each page. Then I turned on GZip compression using Roller&apos;s built-in CompressionFilter. These changes helped, but the most glaring problem continued to be &lt;em&gt;too many requests&lt;/em&gt;. To solve this, I turned to &lt;a href=&quot;http://wro4j.googlecode.com&quot;&gt;wro4j&lt;/a&gt; (as &lt;a href=&quot;http://twitter.com/alexobjelean/status/5481711667&quot;&gt;recommended on Twitter&lt;/a&gt;) to concatenate my JS and CSS files into one.
&lt;/p&gt;
&lt;p&gt;I have to say, I&apos;m very happy with the results. I&apos;m now sitting at a YSlow (V2) score of 75; 90 if I use the &quot;Small Site or Blog&quot; ruleset. I believe I can improve this by adding expires headers to my images, js and css. More than anything, I&apos;m impressed with wro4j, its &lt;a href=&quot;http://groups.google.com/group/wro4j/browse_thread/thread/33b85936c8f1e8b3?hl=en&quot;&gt;great support&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/wro4j/wiki/GettingStarted&quot;&gt;easy setup&lt;/a&gt;. I was looking for a runtime solution (b/c I didn&apos;t want to have to rebuild Roller) and it seems to be perfect for the job. Furthermore, wro4j minifies everything on the fly and they&apos;ll have an &lt;a href=&quot;http://groups.google.com/group/wro4j/msg/b85b4aba0f9500ba?hl=en&quot;&gt;expires header filter in the next release&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://jawr.dev.java.net&quot;&gt;JAWR&lt;/a&gt; and the &lt;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot;&gt;YUI Compressor&lt;/a&gt; are other alternatives to this filter, but I&apos;m currently sold on wro4j. First of all, it passed the 10-minute test. Secondly, it didn&apos;t require me to modify Roller&apos;s build system.  
&lt;/p&gt;
&lt;p&gt;At this point, if I&apos;m going to implement JS/CSS concatenation and minification in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; and &lt;a href=&quot;http://roller.apache.org&quot;&gt;Roller&lt;/a&gt;, wro4j seems like the best option. If you disagree, I&apos;d love to hear your reasoning.&lt;/p&gt;
&lt;p style=&quot;font-style: italic; color: #666; border-top: 1px dotted silver&quot;&gt;
&lt;strong&gt;TIP:&lt;/strong&gt; See &lt;a href=&quot;http://www.sonatype.com/people/2009/11/javascript-compression-in-nexus/&quot;&gt;Javascript Compression in Nexus&lt;/a&gt; for information on using YUI Compressor with Maven.
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/consulting_sofea_grails_and_gwt</id>
        <title type="html">Consulting, SOFEA, Grails and GWT at next week&apos;s Denver JUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/consulting_sofea_grails_and_gwt"/>
        <published>2009-11-05T22:52:37-07:00</published>
        <updated>2009-11-06T06:00:15-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="consulting" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="denver" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="sofea" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="denverjug" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Next Wednesday, I&apos;ll be at Denver&apos;s JUG meeting to talk about Independent Consulting and Building SOFEA Applications with Grails and GWT. The first talk will be a a panel discussion among local independent consultants, including &lt;a href=&quot;http://www.jroller.com/JamesGoodwill/&quot;&gt;James Goodwill&lt;/a&gt;, &lt;a href=&quot;http://www.ambientideas.com/blog/&quot;&gt;Matthew McCullough&lt;/a&gt;, &lt;a href=&quot;http://www.augusttechgroup.com/tim/blog/&quot;&gt;Tim Berglund&lt;/a&gt; and myself.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
This session explores the trials and tribulations of an independent
consultant. How do you find contracts? Should you setup an LLC, an
S-Corp or just be a sole proprietorship? What about health insurance
and benefits? Are recruiters helpful or hurtful? Learn lots of tips
and tricks to get your dream job and your ideal lifestyle.
&lt;/p&gt;
&lt;p&gt;
The Grails and GWT talk is a preview of a talk I&apos;ll be doing at the &lt;a href=&quot;http://www.therichwebexperience.com/conference/speaker/topic_view?topicId=2104&quot;&gt;Rich Web Experience&lt;/a&gt; in December. Below is a rewrite of the abstract in first-person.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;Earlier this year, I participated in a major enhancement of a high-traffic well-known internet site. The company wanted us to quickly re-architect their site and use a modern Ajax framework to do it with. An Ajax Framework evaluation was done to help the team choose the best framework for their skillset. The application was built with a SOFEA architecture using GWT on the frontend and Grails/REST on the backend.
&lt;br/&gt;&lt;br/&gt;
This talk will cover how &lt;a href=&quot;http://www.linkedin.com/in/bryannoll&quot;&gt;Bryan Noll&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/scottthomasnicholls&quot;&gt;Scott Nicholls&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/jgoodwill&quot;&gt;James Goodwill&lt;/a&gt; and I came to choose GWT and Grails, as well as stumbling blocks we encountered along the way. In addition, we&apos;ll explore many topics such as raw GWT vs. GXT/SmartGWT, the Maven GWT Plugin, modularizing your code, multiple EntryPoints, MVP, integration testing and JSON parsing with Overlay Types. 
&lt;/p&gt;
&lt;p&gt;If you&apos;re in Denver next Wednesday night (November 11th), you should stop by the &lt;a href=&quot;http://www.denverjug.org/&quot;&gt;Denver JUG&lt;/a&gt; meeting. It&apos;ll be a fun night and there&apos;s sure to be a few beers afterward. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/a_letter_to_the_appfuse</id>
        <title type="html">A Letter to the AppFuse Community</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/a_letter_to_the_appfuse"/>
        <published>2009-11-04T00:17:17-07:00</published>
        <updated>2009-11-04T07:32:42-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="letter" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springroo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="play" scheme="http://roller.apache.org/ns/tags/" />
        <category term="community" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">The last &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; release was way back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_0_2_released&quot;&gt;May 2008&lt;/a&gt;. Many folks have asked when the next release would be ever since. Often, I&apos;ve said &quot;sometimes this quarter&quot;, but obviously, that&apos;s never happened. For that, I apologize.
&lt;/p&gt;
&lt;p&gt;There are many reasons I haven&apos;t worked on AppFuse for the past 18 months, but it mostly comes down to the fact that I didn&apos;t make time for it. The good news is I&apos;m working on it again and &lt;em&gt;will&lt;/em&gt; have a release out sometime this month. Unfortunately, it probably won&apos;t be a 2.1 final release, but there&apos;s so many things that&apos;ve changed, I feel like a milestone release is a good idea. Here&apos;s a brief summary of changes so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed archetypes to include all source and tests for the &quot;webapp&quot; portion of the application. No more warpath plugin, merging wars and IDE issues. Using &quot;mvn jetty:run&quot; should work as expected.&lt;/li&gt;
&lt;li&gt;Moved from &lt;a href=&quot;http://raibledesigns.com/rd/entry/moving_from_spring_s_xml&quot;&gt;Spring XML to Annotations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;AppFuse Light &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;converted to Maven modules&lt;/a&gt; and now depends on AppFuse&apos;s backend.&lt;/li&gt;
&lt;li&gt;Published easier to use archetype selection form in the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Published &lt;a href=&quot;http://static.appfuse.org/light/archetypes.html&quot;&gt;archetype selection form for AppFuse Light&lt;/a&gt;. I do plan on combining these forms as soon as I figure out the best UI and instructions for users to choose AppFuse or AppFuse Light.&lt;/li&gt;
&lt;li&gt;Upgraded all libraries to latest released versions (Spring 3 hasn&apos;t had a final release yet).&lt;/li&gt;
&lt;li&gt;Upgraded to Tapestry 5 thanks to &lt;a href=&quot;http://code.google.com/p/tapestry5-appfuse/&quot;&gt;Serge Eby&lt;/a&gt;. I still need to complete tests and code generation for tests.&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267&quot;&gt;Compass support&lt;/a&gt; thanks to a patch from &lt;a href=&quot;http://www.kimchy.org/&quot;&gt;Shay Banon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded from &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1125&quot;&gt;XFire to CXF&lt;/a&gt; for Web Services.&lt;/li&gt;
&lt;li&gt;Moved Maven repository to &lt;a href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;Sonatype&apos;s OSS Repository Hosting&lt;/a&gt; for snapshots and releasing to Maven Central. There are no longer any AppFuse-specific artifacts, all are available in central.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I realize there&apos;s many full-stack frameworks that do the same thing as AppFuse with less code. Examples include &lt;a href=&quot;http://rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt;, &lt;a href=&quot;http://grails.org&quot;&gt;Grails&lt;/a&gt;, &lt;a href=&quot;http://seamframework.org&quot;&gt;Seam&lt;/a&gt;, &lt;a href=&quot;http://www.springsource.org/roo&quot;&gt;Spring Roo&lt;/a&gt; and the &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play framework&lt;/a&gt;. However, there seems to be quite a few folks that continue to use AppFuse and it stills serves the community as a nice example of how to integrate frameworks. Furthermore, it helps me keep up with the latest framework releases, their quirks and issues that happen when you try to integrate them. In short, working on it helps me stay up to speed with Java open source frameworks.
&lt;/p&gt;
&lt;p&gt;
For those folks that like the 1.x, Ant-based version of AppFuse, there will &lt;em&gt;not&lt;/em&gt; be a 1.9.5 release. I know I promised it for years, but it&apos;s simply something I will not use, so I&apos;d rather not invest my time in it. I&apos;m sorry for lying to those that expected it.&lt;/p&gt;
&lt;p&gt;So what&apos;s the future of AppFuse? Will it continue to integrate web frameworks with Spring and popular persistence frameworks? Possibly, but it seems more logical to align it with the types of Ajax + REST applications I&apos;m creating these days. I&apos;m currently thinking AppFuse 3.0 would be nice as a RESTful backend with GWT and Flex UIs. I might create the backend with &lt;a href=&quot;http://cxf.apache.org/&quot;&gt;CXF&lt;/a&gt;, but it&apos;s possible I&apos;d use one of the frameworks mentioned above and simply leverage it to create the default features AppFuse users have come to expect.&lt;/p&gt;
&lt;p&gt;More than anything, I&apos;m writing this letter to let you know that the AppFuse project is not dead and you can expect a release in the near future.&lt;/p&gt;
&lt;p&gt;Thanks for your support,&lt;/p&gt;
&lt;p&gt;Matt</content>
    </entry>
</feed>

