<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="http://my.rsscache.com/rsc/rss2.xsl"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:rsscache="http://ns.rsscache.com/1.0"><channel><title>Raible Designs</title><link>http://raibledesigns.com/rd/</link><atom:link rel="self" type="application/rss+xml" href="http://raibledesigns.com/rd/feed/entries/rss" /><description>&lt;img src="/images/pic.jpg" alt="" width="48" height="48" style="float: left; margin: 0 9px 0 0; border-radius: 5px"/&gt;&lt;/a&gt;&lt;a href="http://raibledesigns.com/about.jsp"&gt;Matt Raible&lt;/a&gt; is a Web Architecture Consultant specializing in open source frameworks.</description><language>en-us</language><copyright>Copyright 2012</copyright><lastBuildDate>Fri, 3 Feb 2012 07:59:01 -0700</lastBuildDate><generator>Apache Roller (incubating) 5.0.0 (1304881398305:dave)</generator><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/twitter_s_open_source_summit</guid><title>Twitter's Open Source Summit: Bootstrap 2.0 Edition</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/twitter_s_open_source_summit</link><pubDate>Wed, 1 Feb 2012 11:28:40 -0700</pubDate><category>The Web</category><category>twitter</category><category>nasa</category><category>hogan.js</category><category>opensource</category><category>ossummit</category><category>bootstrap</category><description>Every few months, &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt; hosts an Open Source Summit to talk about tools they're using. Since I happened to be near San Fransisco, I happily attended their latest &lt;a href="https://twitter.com/search?q=%23ossummit"&gt;#ossummit&lt;/a&gt; to learn about &lt;a href="http://twitter.github.com/bootstrap/"&gt;Bootstrap 2.0&lt;/a&gt;. Below are my notes from last night's event.
&lt;/p&gt;
&lt;p&gt;
95% of Twitter's infrastructure is powered by open source. They hope to contributing back to open source by doing 2-3 summits per year. Without open source, there would be no Twitter. You can find a bunch of Twitter's open source contributions at &lt;a href="http://twitter.github.com"&gt;twitter.github.com&lt;/a&gt;. They're also big fans of Apache and commit to a wide variety of projects there.
&lt;/p&gt;
&lt;p id="bootstrap"&gt;
&lt;strong&gt;Bootstrap&lt;/strong&gt;&lt;br/&gt;
Bootstrap is developed by two main guys: &lt;a href="http://twitter.com/mdo"&gt;@mdo&lt;/a&gt; and &lt;a href="http://twitter.com/fat"&gt;@fat&lt;/a&gt;. 
Mark (@mdo) has been a designer at Twitter for 2 years. He started on the Revenue Team with ads, but has been working on redesign for last 4 months. Has been doing HTML and CSS for about 11 years. He used Notepad on Windows to build his GeoCities site. 
&lt;/p&gt;
&lt;p&gt;boot&amp;middot;strap: simple and flexible HTML, CSS, and JavaScript for popular user interface components and interactions.
&lt;/p&gt;
&lt;p&gt;
Work on Bootstrap started about a 1.5 years ago. Internal tools didn't get the proper attention they needed. They figured out there was a lot of people that wanted good looking UIs and interactions. It became Twitter Blueprint and was mostly used internally. Jacob (@fat) started shortly after first release and decided to add some JavaScript on top of it. The JavaScript for Bootstrap was &lt;a href="https://twitter.com/#!/pamelafox/status/164532457654329347"&gt;originally the "Twitter Internal Toolkit" or "TIT"&lt;/a&gt; and was built on Moo Tools. Jacob was like "we gotta open source this, it's gonna be huge!" (he was right).
&lt;/p&gt;
&lt;p&gt;The 1.0 release supported Chrome, Safari and Firefox (everyone at Twitter was on Macs). 1.3 added cross-browser support and JavaScript plugins. 
&lt;/p&gt;
&lt;p&gt;
Now there's Bootstrap 2 (just released!). They rewrote all the documentation and components and removed legacy code. 
&lt;/p&gt;
&lt;p&gt;So, &lt;em&gt;what's new?&lt;/em&gt;
The biggest thing is the docs. Previously had live examples, now shows live examples and why you would do something, as well as additional options. The "topbar" has been renamed to "navbar", but it's still got all the hotness. It's &lt;a href="http://www.alistapart.com/articles/responsive-web-design/"&gt;responsive&lt;/a&gt; with CSS media queries for small devices, tablets, small desktops and large desktops. This means the layout &lt;em&gt;breaks&lt;/em&gt; at certain points and stacks elements to fit on smaller screens.
&lt;/p&gt;
&lt;p&gt;
CSS: smarter defaults, better classes. In 1.4, all forms were stacked. Now they can flow horizontally. Tables are now namespaced so Bootstrap's styles don't apply to all tables. The available table, form and navigation classes are as follows:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
// Tables
.table { ... }
.table-striped { ... }
.table-bordered { ... }
.table-condensed { ... }

// Forms
.form-inline { ... }
.form-search { ... }
.form-horizontal { ... }

// Nav
.nav { ... }
.nav-tabs { ... }
.nav-pills { ... }
&lt;/pre&gt;
&lt;p&gt;The goals with 2.0 are consistency, simplification and future-proofing styles. With 1.4, buttons used "btn primary" and it caused problems if you wanted to have a "primary" class in your project. With 2.0, buttons and all elements are namespaced to avoid collisions (now it's .btn-primary).
&lt;/p&gt;
&lt;p&gt;After Mark finished talking about the design of Bootstrap, Jacob (@fat) started talking about Bootstrap's JavaScript. Jacob works on The Platform Team at Twitter and claims he made a lot of mistakes with 1.x. However, thanks to semantic versioning, 2.0 is a new version and he got to start over!
&lt;/p&gt;
&lt;p&gt;The biggest change in 2.0 is the use of data attributes (a.k.a. data-*). They were using them in 1.x, but not to the full potential of what they can be and should be. The first class API for Bootstrap JavaScript is data attributes (or HTML), not JavaScript.
&lt;/p&gt;
&lt;p&gt;With 1.x, you could add an anchor to close modals and alerts.
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
// 1.x closing modal/alerts
&amp;lt;a class="close" href="#"&gt;&amp;times;&amp;lt;/a&gt;
&lt;/pre&gt;
&lt;p&gt;However, if you put your alerts in your modals, you close them all when you likely only wanted to close one. 2.0 uses a "data-dismiss" attribute.
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;a class="close" data-dismiss="model"&gt;&amp;times&amp;lt;/a&gt;
&lt;/pre&gt;
&lt;p&gt;This allows you to target what you want closed (modals or alerts, etc.). You know exactly what's going to happen just by reading the code. Another example is the "href" attribute of an anchor. Rather than using "href", you can now use "data-target". 
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
// 1.x href = target
&amp;lt;a href="#myModal" data-toggle="modal"&gt;Launch&amp;lt;/a&gt;

// 2.x data-target = target
&amp;lt;a data-target=".fat" data-toggle="modal"&gt;Launch&amp;lt;/a&gt;
&lt;/pre&gt;
&lt;p&gt;If you'd rather turn off the data attribute API, or just part of it, you can do so by using the following:
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
// Turn off all data-api
$('body').off('.data-api')

// Turn off alert data-api
$('body).off('.alert.data-api')
&lt;/pre&gt;
&lt;p&gt;2.0's JavaScript API has the same stuff, but better. You can turn off the data-api and do everything with JavaScript. They copied jQuery UI in a lot of ways (defaults, constructors, etc.). &lt;a href="http://twitter.github.com/bootstrap/javascript.html"&gt;Bootstrap's JavaScript&lt;/a&gt; has 12 plugins. New ones include collapse, carousel and typeahead. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://twitter.github.com/bootstrap/download.html"&gt;Customize&lt;/a&gt; - a new tab that lets you customize and download Bootstrap. It's basically an alternative to customizing .less files and allows you to choose components, select jQuery plugins, customize variables (colors, font-sizes, backgrounds) and download. &lt;/p&gt;

&lt;p&gt;What does the future hold? Internationalization, improving responsiveness, more new features and bug fixes. 
&lt;/p&gt;
&lt;p style="border-top: 1px dotted silver; padding-top: 10px"&gt;
After both Mark and Jacob gave their talks, they talked together about Community and how great it's been. Even if you're not into writing CSS and JavaScript, they mentioned they still wanted to hear from you. To give an example of great community contributions, one guy opened 50 issues in the last 2 days.&lt;/p&gt;
&lt;p&gt;Someone in the audience asked why they used LESS over SASS. Jacob said the main reason they use LESS is because they're good friends with the guy who invented it (&lt;a href="http://cloudhead.io/"&gt;Alexis&lt;/a&gt;). SASS turns CSS into a programming language, but they wanted to maintain the approachability of CSS, which LESS does. There's no plans to do an official SASS port, but there is talk of doing one. One advantage of the current LESS compiler is they rewrote it to have better output so it's far more readable.
&lt;/p&gt;
&lt;p id="nasa"&gt;&lt;strong&gt;NASA&lt;/strong&gt;&lt;br/&gt;
After Mark and Jacob finished, there was a 5 minute break to grab beers and snacks. Then Sean Herron (&lt;a href="http://twitter.com/seanherron"&gt;@seanherron&lt;/a&gt;) (a.k.a. "NASA Bro") talked about Bootstrap at NASA. He actually didn't talk about Bootstrap much, except that they used it for &lt;a href="http://code.nasa.gov"&gt;code.NASA&lt;/a&gt;. He talked about NASA and how it's playing a key role in the movement towards open data, open source and open standards in our federal government. He mentioned how &lt;a href="http://data.nasa.gov/"&gt;data.NASA&lt;/a&gt; was launched last August and that they helped develop &lt;a href="http://openstack.org/"&gt;OpenStack&lt;/a&gt;. Finally, he mentioned &lt;a href="http://open.nasa.gov/"&gt;open.NASA&lt;/a&gt;, which is a collaborative approach to open, direct and transparent communication about our space program.&lt;/p&gt;
&lt;/p&gt;
&lt;p id="hogan.js"&gt;&lt;strong&gt;Hogan.js&lt;/strong&gt;&lt;br/&gt;
Next up, Rob Sayre (&lt;a href="http://twitter.com/sayrer"&gt;@sayrer&lt;/a&gt;) talked about &lt;a href="http://twitter.github.com/hogan.js/"&gt;Hogan.js&lt;/a&gt;. 
Rob has been at Twitter for a few months, before that he wrote JavaScript at other places. Hogan.js is a compiler for &lt;a href="http://mustache.github.com/"&gt;Mustache templates&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Why Mustache?&lt;/em&gt; Because it's similar to HTML and easy to edit. You can mock data as JSON files and programmers are not required.
&lt;/p&gt;
&lt;p&gt;
At Twitter, designers can do the CSS and Mustache without connecting to the backend. It has cross-language support in Ruby, Java and JavaScript. However, client-side template compilation has performance problems, especially in IE7 on a Windows XP box with 4 viruses. 
&lt;/p&gt;
&lt;p&gt;So they had a few choices: work on mustache.js, or use Dust.js or Handlebars.js. The compilers are very nice for Dust.js and Handlebars.js, but they're huge. Handlebar's parser is 4000 lines. The entire Hogan.js file is 500 lines. They decided they were too large to send to the browser's of their users, so they chose to write a better compiler for Mustache.
&lt;/p&gt;
&lt;p&gt;
Hogan.js's main features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compile on the server&lt;/li&gt;
&lt;li&gt;Parser API&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Performance is &lt;em&gt;much&lt;/em&gt; better with Hogan.js than Mustache.js. On IE7 - Hogan is 5x faster than Mustache. On an iPhone, it's about the same (and an iPhone's browser is faster than IE7 on a decent computer). With modern browsers (Chrome 17, Safari 5 and Firefox 10), it's more than 10x faster.
&lt;/p&gt;
&lt;p&gt;Hogan.js is currently used at Twitter for Tweet embedding, the Bootstrap build process and soon, Twitter.com.
&lt;/p&gt;
&lt;p style="border-top: 1px dotted silver; padding-top: 10px"&gt;
It's been awhile since I got excited about an open source project. Bootstrap has helped me a lot recently, in my &lt;a href="http://raibledesigns.com/rd/entry/my_html5_with_play_scala"&gt;&lt;em&gt;Play More!&lt;/em&gt;&lt;/a&gt; mobile app, on some client projects and I'm in the process of &lt;a href="http://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with"&gt;refreshing AppFuse's UI to use it&lt;/a&gt;. I love how you can add a class or two to an element and all of a sudden they pop with good looks. The main problem with Bootstrap at this point is that a lot of Bootstrapped apps look the same. There's talk of adding themes in a future release to help alleviate this problem. In the meantime, there's a lot to get excited about with 2.0.
&lt;/p&gt;
&lt;p&gt;Thanks to Twitter for hosting this event and kudos to Mark and Jacob (and the community!) for such a fantastic project. &lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=96526994&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=96526994&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=96526994 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with</guid><title>Refreshing AppFuse's UI with Twitter Bootstrap</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with</link><pubDate>Tue, 31 Jan 2012 17:12:17 -0700</pubDate><category>Java</category><category>appfuse</category><category>springmvc</category><category>ui</category><category>bootstrap</category><category>css</category><category>struts2</category><category>twitter</category><description>The last time AppFuse had an update done to its look and feel was in way back in 2006. I've done a lot of consulting since then, which has included a fair bit of page speed optimization, HTML5 development and integrating smarter CSS. It was way back in '05 when we first started looking at adding a CSS Framework to AppFuse.  It was Mike Stenhouse's &lt;a href="http://www.contentwithstyle.co.uk/content/a-css-framework/"&gt;CSS Framework&lt;/a&gt; that provided the &lt;a href="http://raibledesigns.com/rd/entry/a_css_framework"&gt;inspiration&lt;/a&gt; and my &lt;a href="http://raibledesigns.com/rd/entry/css_framework_design_contest_final"&gt;CSS Framework Design Contest&lt;/a&gt; that provided its current themes (&lt;a href="http://css.appfuse.org/themes/puzzlewithstyle"&gt;puzzlewithstyle&lt;/a&gt;, &lt;a href="http://css.appfuse.org/themes/andreas01"&gt;andreas01&lt;/a&gt; and &lt;a href="http://css.appfuse.org/themes/simplicity"&gt;simplicity&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;Since then, a lot of CSS Frameworks have been invented, including &lt;a href="http://www.blueprintcss.org/"&gt;Blueprint&lt;/a&gt; in 2007 and &lt;a href="http://compass-style.org/"&gt;Compass&lt;/a&gt; in 2008. However, neither has taken the world by storm like &lt;a href="http://twitter.github.com/bootstrap/"&gt;Twitter Bootstrap&lt;/a&gt;. From &lt;a href="http://www.alistapart.com/articles/building-twitter-bootstrap/"&gt;Building Twitter Bootstrap&lt;/a&gt;:
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
A year-and-a-half ago, a small group of Twitter employees set out to improve our team’s internal analytical and administrative tools. After some early meetings around this one product, we set out with a higher ambition to create a toolkit for anyone to use within Twitter, and beyond. Thus, we set out to build a system that would help folks like us build new projects on top of it, and Bootstrap was conceived.&lt;br/&gt;
...&lt;br/&gt;
Today, it has grown to include dozens of components and has become the most popular project on GitHub with more than 13,000 watchers and 2,000 forks.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;The fact that Bootstrap has become the most popular project on GitHub says a lot. For &lt;a href="http://appfuse.547863.n4.nabble.com/AppFuse-next-td3634415.html"&gt;AppFuse.next&lt;/a&gt;, I'd like to integrate a lot of my learnings over the past few years, as well as support HTML5 and modern browsers as best we can. This means &lt;a href="http://code.google.com/speed/page-speed/docs/rules_intro.html"&gt;page speed optimizations&lt;/a&gt;, getting rid of Prototype and Scriptaculous in favor of jQuery, adding &lt;a href="http://code.google.com/p/wro4j/"&gt;wro4j&lt;/a&gt; for resource optimization and integrating &lt;a href="http://html5boilerplate.com/"&gt;HTML5 Boilerplate&lt;/a&gt;. I've used Twitter Bootstrap for my &lt;a href="http://raibledesigns.com/rd/entry/my_html5_with_play_scala"&gt;&lt;em&gt;Play More!&lt;/em&gt; app&lt;/a&gt;, as well as some recent client projects. Its excellent documentation has made it easy to use and I love the way you can simply add classes to elements to make them transform into something beautiful.
&lt;/p&gt;
&lt;p&gt;Last week, I spent a couple late nights integrating &lt;a href="http://thinkvitamin.com/design/twitter-bootstrap-2-0/"&gt;Twitter Bootstrap 2.0&lt;/a&gt; into the Struts 2 and Spring MVC versions of AppFuse. The layout was pretty straightforward thanks to &lt;a href="http://markdotto.com/bs2/docs/scaffolding.html"&gt;Scaffolding&lt;/a&gt;. Creating the Struts Menu Velocity template to produce &lt;a href="http://markdotto.com/bs2/docs/javascript.html#dropdowns"&gt;dropdowns&lt;/a&gt; wasn't too difficult. I added &lt;a href="http://markdotto.com/bs2/docs/base-css.html#tables"&gt;class="table table-condensed"&lt;/a&gt; to the list screen tables, &lt;a href="http://markdotto.com/bs2/docs/base-css.html#forms"&gt;class="well form-horizontal"&lt;/a&gt; to forms and &lt;a href="http://markdotto.com/bs2/docs/base-css.html#buttons"&gt;class="btn primary"&lt;/a&gt; to buttons. 
&lt;/p&gt;
&lt;p&gt;  
I also added validation errors with the "help-inline" class. This is also where things got tricky with Struts and Spring MVC. For the form elements in Bootstrap, they recommend you use a "control-group" element that contains your label and a "controls" element. The control contains the input/select/textarea and also the error message if there is one. Here's a sample element waiting for data: 
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;div class="control-group"&amp;gt;
    &amp;lt;label for="name" class="control-label"&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;div class="controls"&amp;gt;
        &amp;lt;input type="text" id="name" name="name"&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Below is what that element should look like to display a validation error:&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;div class="control-group error"&amp;gt;
    &amp;lt;label for="name" class="control-label"&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;div class="controls"&amp;gt;
        &amp;lt;input type="text" id="name" name="name" value=""&amp;gt;
        &amp;lt;span class="help-inline"&amp;gt;Please enter your name.&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You can see this markup is pretty easy, you just need to add an "error" class to &lt;em&gt;control-group&lt;/em&gt; and span to show the error message. With Struts 2, this was pretty easy thanks to its customizable templates for its &lt;a href="http://struts.apache.org/2.x/docs/struts-tags.html"&gt;tags&lt;/a&gt;. All I had to do was create a "template/css_xhtml" directory in &lt;em&gt;src/main/webapp&lt;/em&gt; and modify checkbox.ftl, controlfooter.ftl, controlheader-core.ftl and controlheader.ftl to match Bootstrap's conventions. 
&lt;/p&gt;
&lt;p&gt;
Spring MVC was a bit trickier. Since its tags don't have the concept of writing an entire control (label and field), I had to do a bit of finagling to get things to work. In the current implementation, Struts 2 forms have a single line for a &lt;em&gt;control-group&lt;/em&gt; and its &lt;em&gt;control-label&lt;/em&gt; and &lt;em&gt;controls&lt;/em&gt;.&lt;/p&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;s:textfield key="user.firstName" required="true"/&gt;&lt;/pre&gt;
&lt;p&gt;With Spring MVC, it's a bit more complex:&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;spring:bind path="user.firstName"&amp;gt;
&amp;lt;fieldset class="control-group${(not empty status.errorMessage) ? ' error' : ''}"&amp;gt;
&amp;lt;/spring:bind&amp;gt;
    &amp;lt;appfuse:label styleClass="control-label" key="user.firstName"/&amp;gt;
    &amp;lt;div class="controls"&amp;gt;
        &amp;lt;form:input path="firstName" id="firstName" maxlength="50"/&amp;gt;
        &amp;lt;form:errors path="firstName" cssClass="help-inline"/&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You could probably overcome this verbosity with &lt;a href="http://today.java.net/pub/a/today/2003/11/14/tagfiles.html"&gt;Tag Files&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Figuring out if a &lt;em&gt;control-group&lt;/em&gt; needed an error class before the input tag was rendered was probably the hardest part of this exercise. This was mostly due to Bootstrap's great documentation and useful examples (viewed by inspecting the markup). Below are some screenshots of the old screens and new ones. 
&lt;/p&gt;
&lt;p style="text-align: center; vertical-align: top"&gt;
&lt;a href="http://farm8.staticflickr.com/7173/6787781357_c4c65c7c74_b.jpg" title="Old UI - Login" rel="lightbox[appfuse-bootstrap]"&gt;&lt;img src="http://farm8.staticflickr.com/7173/6787781357_c4c65c7c74_t.jpg" width="100" height="60" alt="Old UI - Login"&gt;&lt;/a&gt;

&lt;a href="http://farm8.staticflickr.com/7142/6787781421_0c7851b414_b.jpg" title="Old UI - Users" rel="lightbox[appfuse-bootstrap]"&gt;&lt;img src="http://farm8.staticflickr.com/7142/6787781421_0c7851b414_t.jpg" width="100" height="60" alt="Old UI - Users" style="margin-left: 10px"&gt;&lt;/a&gt;

&lt;a href="http://farm8.staticflickr.com/7035/6787781725_3a1f0218c1_b.jpg" title="Old UI - Edit Profile" rel="lightbox[appfuse-bootstrap]"&gt;&lt;img src="http://farm8.staticflickr.com/7035/6787781725_3a1f0218c1_t.jpg" width="100" height="82" alt="Old UI - Edit Profile" style="margin-left: 10px"&gt;&lt;/a&gt;

&lt;p&gt;  
&lt;p style="text-align: center; vertical-align: top"&gt;
&lt;a href="http://farm8.staticflickr.com/7025/6787781477_ec2ac7a93b_b.jpg" title="New UI - Login" rel="lightbox[appfuse-bootstrap]"&gt;&lt;img src="http://farm8.staticflickr.com/7025/6787781477_ec2ac7a93b_t.jpg" width="100" height="60" alt="New UI - Login"&gt;&lt;/a&gt;
  
&lt;a href="http://farm8.staticflickr.com/7015/6787781597_6558d94bb5_b.jpg" title="New UI - Users" rel="lightbox[appfuse-bootstrap]"&gt;&lt;img src="http://farm8.staticflickr.com/7015/6787781597_6558d94bb5_t.jpg" width="100" height="60" alt="New UI - Users" style="margin-left: 10px"&gt;&lt;/a&gt;
  
  &lt;a href="http://farm8.staticflickr.com/7010/6787781681_81b7977414_b.jpg" title="New UI - Edit Profile" rel="lightbox[appfuse-bootstrap]"&gt;&lt;img src="http://farm8.staticflickr.com/7010/6787781681_81b7977414_t.jpg" width="100" height="82" alt="New UI - Edit Profile" style="margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="color: #666; text-align: center"&gt;Check out the &lt;a style="color: #666" href="http://www.flickr.com/photos/mraible/sets/72157629094630763/"&gt;full set on Flickr&lt;/a&gt; if you'd like a closer look.
  &lt;/p&gt;
  &lt;p&gt;
Even though I like the look of the old UI, I can't help but think a lot of the themes are designed for blogs and content sites, not webapps. The old &lt;a href="http://wufoo.com/"&gt;Wufoo&lt;/a&gt; forms were a lot better looking though. And if you're going to develop &lt;a href="http://blogs.atlassian.com/2012/01/modern-principles-in-web-development/"&gt;kick-ass webapps&lt;/a&gt;, you need to make them look good. Bootstrap goes a long way in doing this, but it certainly doesn't replace a good UX Designer. Bootstap simply helps you get into HTML5-land, start using CSS3 and it takes the pain out of making things work cross-browser. Its fluid layouts and responsive web design seems to work great for business applications, which I'm guessing AppFuse is used for the most. 
&lt;/p&gt;
&lt;p&gt;
I can't thank the Bootstrap developers enough for helping me make this all look good. With Bootstrap 2 &lt;a href="http://www.markdotto.com/2012/01/24/bootstrap-2-ready-for-testing-and-feedback/"&gt;dropping this week&lt;/a&gt;, I can see myself using this more and more on projects. In the near future, I'll be helping integrate Bootstrap into AppFuse's &lt;a href="http://appfuse.547863.n4.nabble.com/Tapestry-5-3-2-td4339578.html"&gt;Tapestry 5 and JSF versions&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;What do you think of this CSS change? Do you change your CSS and layout a fair bit when starting with AppFuse archetypes? What can we do to make AppFuse apps look better out-of-the-box?&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=96477706&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=96477706&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=96477706 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/2011_a_year_in_review</guid><title>2011 - A Year in Review</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/2011_a_year_in_review</link><pubDate>Wed, 11 Jan 2012 09:45:20 -0700</pubDate><category>Roller</category><category>roller</category><category>yearinreview</category><category>2011</category><category>blogging</category><atom:summary type="html" xmlns:atom="http://www.w3.org/2005/Atom">&lt;a href="http://raibledesigns.com/rd/entry/2010_a_year_in_review"&gt;2010 was an awesome year&lt;/a&gt;, but 2011 rocked the house! At the end of last year, I kept my goals simple:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
In 2011, I plan on doing two main things: keep rockin' it with Trish and finishing The Bus. Everything else is gravy. 
&lt;/p&gt;
&lt;p&gt;As predicted, it &lt;em&gt;was&lt;/em&gt; a spectacular year, but I only accomplished 50% of my goals. That is, Trish and I had a great time skiing (especially in Utah), moving in together, traveling the world and getting engaged in Versailles. I even satisfied some 5-year goals: building a sauna in my basement and getting a ski shack in the mountains.&lt;/p&gt;
&lt;p&gt;However, I didn't get much done with The Bus. Or rather, the guys at &lt;a href="http://www.motorworksrestorations.com/"&gt;MotorWorks Restorations&lt;/a&gt; didn't drain me for all I'm worth in 2011. We did make good progress with estimating the final cost and obtaining many hard-to-find parts though. I now have a Porsche 911 Engine (1983 3.0L 6 cylinder), a Porsche 901 5 speed transmission, Porsche "Turbo Twist" wheels and a &lt;a href="https://www.facebook.com/media/set/?set=a.10150332577286054.392700.672811053&amp;amp;type=1"&gt;Custom Air Ride Front Beam&lt;/a&gt; from &lt;a href="http://www.franklinsvwwerks.com/"&gt;Franklin's VW Works&lt;/a&gt;. The thing that slowed our progress the most was the custom beam, as it took almost 6 months from order to delivery. When it arrived in September, I decided to put things on hold. I didn't want to get my bus back in the midst of winter and not be able to drive it.&lt;/p&gt;</atom:summary><description>&lt;a href="http://raibledesigns.com/rd/entry/2010_a_year_in_review"&gt;2010 was an awesome year&lt;/a&gt;, but 2011 rocked the house! At the end of last year, I kept my goals simple:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
In 2011, I plan on doing two main things: keep rockin' it with Trish and finishing The Bus. Everything else is gravy. 
&lt;/p&gt;
&lt;p&gt;As predicted, it &lt;em&gt;was&lt;/em&gt; a spectacular year, but I only accomplished 50% of my goals. That is, Trish and I had a great time skiing (especially in Utah), moving in together, traveling the world and getting engaged in Versailles. I even satisfied some 5-year goals: building a sauna in my basement and getting a ski shack in the mountains.
&lt;/p&gt;
&lt;p&gt;However, I didn't get much done with The Bus. Or rather, the guys at &lt;a href="http://www.motorworksrestorations.com/"&gt;MotorWorks Restorations&lt;/a&gt; didn't drain me for all I'm worth in 2011. We did make good progress with estimating the final cost and obtaining many hard-to-find parts though. I now have a Porsche 911 Engine (1983 3.0L 6 cylinder), a Porsche 901 5 speed transmission, Porsche "Turbo Twist" wheels and a &lt;a href="https://www.facebook.com/media/set/?set=a.10150332577286054.392700.672811053&amp;amp;type=1"&gt;Custom Air Ride Front Beam&lt;/a&gt; from &lt;a href="http://www.franklinsvwwerks.com/"&gt;Franklin's VW Works&lt;/a&gt;. The thing that slowed our progress the most was the custom beam, as it took almost 6 months from order to delivery. When it arrived in September, I decided to put things on hold. I didn't want to get my bus back in the midst of winter and not be able to drive it.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://farm5.staticflickr.com/4136/5396188811_040d0519de.jpg" title="Welcome to Alta" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm5.staticflickr.com/4136/5396188811_040d0519de_t.jpg" width="100" height="74" alt="Welcome to Alta" class="picture" style="margin-top: 5px"&gt;&lt;/a&gt;
  
In January, I started working at &lt;a href="http://overstock.com"&gt;Overstock.com&lt;/a&gt; and flew out to Salt Lake City the first two weeks to ramp up. In setting up my development environment, I discovered some inefficiencies and wrote about how I fixed them in &lt;a href="http://raibledesigns.com/rd/entry/making_code_generation_smarter_with"&gt;Making Code Generation Smarter with Maven&lt;/a&gt;. I also discovered that JRebel slowed my build process down by almost 50% and stopped using it as part of my daily process. Now I simply run in debug mode or use &lt;a href="http://www.playframework.org/"&gt;fancy frameworks&lt;/a&gt; that allow instant reload.
&lt;/p&gt;
&lt;p&gt;At the end of the month, I &lt;a href="http://raibledesigns.com/rd/entry/alta"&gt;skied Alta&lt;/a&gt; for the first time on a blue bird day. That night, I flew back to Denver, had a gorgeous &lt;a href="http://farm5.static.flickr.com/4119/5396080419_7cd9f5cb87.jpg" rel="lightbox[yearinreview2011]" title="Dear Denver: You're the best."&gt;lunch ride&lt;/a&gt; in 70&amp;deg;F weather on Friday afternoon, then picked up my lovely girlfriend, Trish, and drove to Crested Butte for a &lt;a href="http://raibledesigns.com/rd/entry/crested_butte"&gt;weekend of skiing with James Ward and friends&lt;/a&gt;. It was my first time visiting Crested Butte and I can see why people call it Paradise.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm6.static.flickr.com/5096/5407159019_e7463c982e.jpg" title="Crested Butte, The Town" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5096/5407159019_e7463c982e_m.jpg" width="240" style="border: 1px solid black" height="179" alt="Crested Butte, The Town"&gt;&lt;/a&gt;
&lt;a href="http://farm6.static.flickr.com/5094/5407165843_01010d16d3.jpg" title="Top of Crested Butte" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5094/5407165843_01010d16d3_m.jpg" width="240" style="border: 1px solid black; margin-left: 10px" height="179" alt="Top of Crested Butte"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;As of February 1st, Trish and I both had 17 ski days. As I'm writing this, we're both up to 14 for this season and very proud to say Abbie and Jack each have 10. Both kids are shredding like I've always dreamed they would.
&lt;/p&gt;
&lt;p&gt;My parents (both retired) came to visit for the month of February and helped me start building a sauna in my basement. This was something I've wanted to do for years, so it was a lot of fun getting things started. While we didn't finish construction, we did get the plumbing/electrical done, stove installed and walls framed. We also had a fun night with &lt;a href="http://www.flickr.com/photos/mraible/sets/72157626083451336/"&gt;Chef Navarro and Friends&lt;/a&gt;.
&lt;p&gt;
The rest of my posts in February were purely technical. I wrote about how I &lt;a href="http://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry"&gt;implemented extensionless URLs with Tapestry, Spring MVC, Struts 2 and JSF&lt;/a&gt;. Then I started delving into &lt;a href="http://raibledesigns.com/rd/entry/integration_testing_with_http_https"&gt;security-related topics&lt;/a&gt;, largely motivated by a new feature I was working on at Overstock. When I wrote about &lt;a href="http://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery"&gt;Implementing Ajax Authentication using jQuery, Spring Security and HTTPS&lt;/a&gt;, I explained what I was trying to accomplish.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
The feature hasn't been released yet, but basically boils down to allowing users to login without leaving a page. For example, if they want to leave a review on a product, they would click a link, be prompted to login, enter their credentials, then continue to leave their review. The login prompt and subsequent review would likely be implemented using a lightbox. While lightboxes are often seen in webapps these days because they look good, it's also possible Lightbox UIs provide a poor user experience.
&lt;/p&gt;
&lt;p&gt;I was able to get everything working, &lt;a href="http://demo.raibledesigns.com/ajax-login/"&gt;posted a demo&lt;/a&gt; and wrote about &lt;a href="http://raibledesigns.com/rd/entry/upcoming_conferences_tssjs_in_las"&gt;upcoming conferences in Las Vegas and Krak&amp;#243;w&lt;/a&gt;. In that article, I described a new talk I was going to create: &lt;em&gt;Webapp Security: Develop. Penetrate. Protect. Relax.&lt;/em&gt; I ended the month with a post on &lt;a href="http://raibledesigns.com/rd/entry/fixing_xss_in_jsp_2"&gt;how to fix XSS in JSP 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;On February 25th, I experienced &lt;a href="http://raibledesigns.com/rd/entry/the_greatest_snow_on_earth"&gt;The Greatest Snow on Earth&lt;/a&gt; with thigh-deep powder and face shots on every run.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;iframe width="500" height="311" frameborder="0" src="http://www.youtube.com/embed/viBBPot4WKY?rel=0&amp;amp;hd=1" title="YouTube video player"&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;That night, we saw &lt;a href="http://www.hotbutteredrum.net/"&gt;Hot Buttered Rum&lt;/a&gt; and woke up early for 27" of fresh powder at Alta. The picture of Trish free-heeling at Alta is one of my favorites of the year.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm6.staticflickr.com/5216/5490614643_00cb94c020.jpg" title="Free Heeling at Alta" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.staticflickr.com/5216/5490614643_00cb94c020.jpg" width="500" height="375" alt="Free Heeling at Alta" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In early March, we experienced a &lt;a href="http://www.flickr.com/photos/mraible/sets/72157626199804847/"&gt;suite night at the Avs game&lt;/a&gt;, then I kept it technical and &lt;a href="http://raibledesigns.com/rd/entry/upgraded_to_apache_roller_5"&gt;upgraded this blog to Apache Roller 5.0, RC4&lt;/a&gt;. I &lt;a href="http://raibledesigns.com/rd/entry/upgrading_to_jsf_2"&gt;upgraded AppFuse to JSF 2&lt;/a&gt;, wrote about &lt;a href="http://raibledesigns.com/rd/entry/jsr_303_and_web_framework"&gt;JSR 303 and web framework support&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/adding_search_to_appfuse"&gt;added search to AppFuse using Compass&lt;/a&gt;. When writing about JSF 2, I mentioned replacing Ajax4JSF with RichFaces. 9 months later, it seems like &lt;a href="http://primefaces.org/"&gt;PrimeFaces&lt;/a&gt; has more momentum, so I may try that instead.
&lt;/p&gt;
&lt;p&gt;For St. Patrick's Day, we flew to Vegas for TSSJS and &lt;a href="http://raibledesigns.com/rd/entry/livin_it_up_in_vegas"&gt;had a blast&lt;/a&gt;. Not only did my talks go well, but we had a bunch of friends in town and had much success gambling the nights away.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm6.static.flickr.com/5305/5550023760_e8f128457a.jpg" title="Caesars Pool" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5305/5550023760_e8f128457a_m.jpg" width="240" height="159" alt="Caesars Pool" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm6.static.flickr.com/5053/5550024190_b272c2f012.jpg" title="The Bellagio Fountains" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5053/5550024190_b272c2f012_m.jpg" width="240" height="159" alt="The Bellagio Fountains" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;After delivering my Comparing JVM Web Frameworks talk, I had a very interesting conversation with &lt;a href="http://macstrac.blogspot.com/"&gt;James Strachan&lt;/a&gt;. He recommended I take a look at &lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt; and &lt;a href="http://jade-lang.com/"&gt;Jade&lt;/a&gt;. A couple months later, when I was thinking of talks for &lt;a href="http://devoxx.com"&gt;Devoxx&lt;/a&gt;, I added these to my list of technologies to learn and submitted a talk about HTML5 with Play Scala, CoffeeScript and Jade.
&lt;/p&gt;
&lt;p&gt;That Friday, we returned to Denver, got a good night's sleep then headed on a &lt;a href="http://raibledesigns.com/rd/entry/peter_estin_hut_trip_in"&gt;hut trip in Colorado's High Country&lt;/a&gt;. The name of the hut was &lt;a href="http://www.huts.org/hut_details/peter_estin_hut_details.html"&gt;Peter Estin Hut&lt;/a&gt; and it was a bit of a hike to get to. My friend, Joe, set my expectations correctly when he warned me it'd be a &lt;em&gt;5 hour death march&lt;/em&gt;. It took us 4 hours, 30 minutes and we skied up 2200 vertical feet of switchbacks.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a rel="lightbox[yearinreview2011]" title="Livin' it up, hut style" href="http://farm6.static.flickr.com/5251/5549474427_56d389dc71.jpg"&gt;&lt;img width="100" height="66" style="border: 1px solid black" alt="Livin' it up, hut style" src="http://farm6.static.flickr.com/5251/5549474427_56d389dc71_t.jpg"&gt;&lt;/a&gt;

&lt;a rel="lightbox[yearinreview2011]" title="We made it!" href="http://farm6.static.flickr.com/5027/5549475091_bcff5560a0.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black; margin-left: 10px" alt="We made it!" src="http://farm6.static.flickr.com/5027/5549475091_bcff5560a0_t.jpg"&gt;&lt;/a&gt;

&lt;a rel="lightbox[yearinreview2011]" title="At the top of Charles Peak" href="http://farm6.static.flickr.com/5025/5550058284_18d8a3b874.jpg"&gt;&lt;img width="100" height="66" style="border: 1px solid black; margin-left: 10px" alt="At the top of Charles Peak" src="http://farm6.static.flickr.com/5025/5550058284_18d8a3b874_t.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Trish and I started off April with a bang by moving in together, then embarking on a &lt;a href="http://raibledesigns.com/rd/entry/two_opening_days_with_a"&gt;whirlwind trip of two opening days with a stopover in Kraków&lt;/a&gt;. We flew Business Class from Chicago to Munich (releasing &lt;a href="http://raibledesigns.com/rd/entry/appfuse_2_1_released"&gt;AppFuse 2.1&lt;/a&gt; just before departing) and were very impressed with Kraków's Old Town upon arrival.
  &lt;p style="text-align: center"&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="St. Mary's Basilica, Kraków" href="http://farm6.static.flickr.com/5188/5618498585_0267da32ce.jpg"&gt;&lt;img width="75" height="75" style="border: 1px solid black" alt="St. Mary's Basilica, Kraków" src="http://farm6.static.flickr.com/5188/5618498585_0267da32ce_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Main Market Square" href="http://farm6.static.flickr.com/5268/5618498729_613983abaf.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="Main Market Square" src="http://farm6.static.flickr.com/5268/5618498729_613983abaf_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="St. Mary's" href="http://farm6.static.flickr.com/5101/5619084930_87a76dee6b.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="St. Mary's" src="http://farm6.static.flickr.com/5101/5619084930_87a76dee6b_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Flowers" href="http://farm6.static.flickr.com/5030/5618499011_462ac088a6.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="Flowers" src="http://farm6.static.flickr.com/5030/5618499011_462ac088a6_s.jpg"&gt;&lt;/a&gt;

  &lt;/p&gt;
  &lt;p&gt;On that trip, I especially enjoyed meeting Trish's brother for the first time and watching the Red Sox win their first game of the year.&lt;/p&gt;
  &lt;p style="text-align: center"&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Fenway Paak!" href="http://farm6.static.flickr.com/5222/5618502949_cdfbc9d030.jpg"&gt;&lt;img width="75" height="75" style="border: 1px solid black" alt="Fenway Paak!" src="http://farm6.static.flickr.com/5222/5618502949_cdfbc9d030_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Morse and Kidder" href="http://farm6.static.flickr.com/5263/5618503117_28b4b2b8cc.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="Morse and Kidder" src="http://farm6.static.flickr.com/5263/5618503117_28b4b2b8cc_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Happy Siblings" href="http://farm6.static.flickr.com/5061/5618503321_c766f1e7bc.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="Happy Siblings" src="http://farm6.static.flickr.com/5061/5618503321_c766f1e7bc_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Erika and Julie" href="http://farm6.static.flickr.com/5146/5619089798_4aca920bfb.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="Erika and Julie" src="http://farm6.static.flickr.com/5146/5619089798_4aca920bfb_s.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="Red Sox Win!" href="http://farm6.static.flickr.com/5145/5619090216_2198246d63.jpg"&gt;&lt;img width="75" height="75" style="margin-left: 10px; border: 1px solid black" alt="Red Sox Win!" src="http://farm6.static.flickr.com/5145/5619090216_2198246d63_s.jpg"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;After returning, I realized I lost a lot of data in my Roller 5 upgrade and &lt;a href="http://raibledesigns.com/rd/entry/be_careful_when_switching_mysql"&gt;wrote about what happened and how I recovered it&lt;/a&gt;. Then we &lt;a href="http://raibledesigns.com/rd/entry/farewell_to_the_2010_2011"&gt;bid farewell to the 2010-2011 ski season&lt;/a&gt; and got ready for mountain bike season.
  &lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
For next year, I think I'll keep my goal at 30 days. If everything works out as planned, we'll have a place in the mountains this fall and it'll be a bit easier to hit the slopes without sitting in traffic. For now, I'm pumped about the beginning of mountain bike season.
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="lightbox[yearinreview2011]" ref="http://farm3.staticflickr.com/2181/5712084350_217de950a5.jpg" title="Door to Sauna"&gt;&lt;img src="http://farm3.staticflickr.com/2181/5712084350_217de950a5_t.jpg" width="100" height="75" alt="Door to Sauna" class="picture"&gt;&lt;/a&gt;
  
May arrived and Trish and I started looking for a place in the mountains. We found an &lt;a href="https://www.facebook.com/media/set/?set=a.10150158165601712.292395.571296711&amp;amp;type=1&amp;amp;l=80b0b43473"&gt;very cool cabin&lt;/a&gt;, but later decided it was &lt;em&gt;too&lt;/em&gt; nice and we'd rather have a condo. I finished &lt;a href="http://raibledesigns.com/rd/entry/the_basement_sauna_project"&gt;The Basement Sauna Project&lt;/a&gt; and wrote about Java Web Application Security: &lt;a href="http://raibledesigns.com/rd/entry/java_web_application_security_part"&gt;Java EE 6&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/entry/java_web_application_security_part1"&gt;Spring Security&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/java_web_application_security_part2"&gt;Apache Shiro&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;On May 21st, we again visited Winter Park and Fraser to look at condos, then drove back to Denver for &lt;a href="http://www.denverpost.com/commented/ci_18114909"&gt;U2 at Mile High Stadium&lt;/a&gt;. I'm not a big fan of U2, but this was quite possibly the best concert I've ever been to. The experience of 70,000+ fans, all screaming, doing the wave, and loving life was epic. We decided that night that we liked one of the condos more than the rest and put in an offer the following week. The kids headed off to Florida for a month with their Mom and we drove to Utah for &lt;a href="http://raibledesigns.com/rd/entry/music_mountain_biking_and_memories"&gt;Desert Rocks and mountain biking in Moab&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/253034_2099846942595_1438065285_32404850_2382489_n.jpg" title="La Sal Mountains from Desert Rocks" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://fbcdn-photos-a.akamaihd.net/hphotos-ak-snc6/253034_2099846942595_1438065285_32404850_2382489_a.jpg" width="180" height="120" alt="La Sal Mountains from Desert Rocks" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/249284_2099847662613_1438065285_32404857_4135397_n.jpg" title="Scenic Byway" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/249284_2099847662613_1438065285_32404857_4135397_n.jpg" width="180" height="120" alt="Scenic Byway" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a href="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/250385_2099847942620_1438065285_32404860_1801230_n.jpg" title="Bar-B or Killer B?" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/250385_2099847942620_1438065285_32404860_1801230_n.jpg" width="180" height="120" alt="Bar-B or Killer B?" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/251086_2099848702639_1438065285_32404869_3632310_n.jpg" title="Three Gossips and Tower of Babel" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc6/251086_2099848702639_1438065285_32404869_3632310_n.jpg" width="180" height="120" alt="Three Gossips and Tower of Babel" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I &lt;a href="http://raibledesigns.com/rd/entry/upgraded_to_roller_5_and"&gt;Upgraded to Roller 5.0&lt;/a&gt; in June and showed how to add a &lt;a href="https://developers.facebook.com/docs/reference/plugins/like/"&gt;Facebook Like button&lt;/a&gt;. Next, I transcribed a couple more Java Web Application Security articles: &lt;a href="http://raibledesigns.com/rd/entry/java_web_application_security_part3"&gt;programmatic login APIs&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/java_web_application_security_part4"&gt;penetrating with Zed Attack Proxy&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The kids returned to us just before the &lt;a href="http://raibledesigns.com/rd/entry/good_times_on_the_annual"&gt;annual Father's Day Camping Trip&lt;/a&gt;. We drove to Lake Granby and stayed at &lt;a href="http://campincolorado.com/federal/arapaho_roosevelt_nf/stillwater/stillwater.html"&gt;Stillwater Campground&lt;/a&gt; for the weekend.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm6.static.flickr.com/5275/5850616117_57971bfd55.jpg" title="Stillwater Campground Rocks!" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5275/5850616117_57971bfd55_m.jpg" width="240" height="180" alt="Stillwater Campground Rocks!" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm4.static.flickr.com/3182/5851171484_b745090d35.jpg" title="Beautiful Colorado" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm4.static.flickr.com/3182/5851171484_b745090d35_m.jpg" width="240" height="180" alt="Beautiful Colorado" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;From my Father's Day post:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;I really enjoyed spending so much time with my family this weekend. The good news is we get to do it again when I meet them at The Cabin in Montana next week. In the meantime, Trish and I are off to &lt;a href="http://jazoon.com/"&gt;Jazoon&lt;/a&gt; for a few days of fun in Switzerland.
&lt;/p&gt;
&lt;p&gt;A few days later, we were &lt;a href="http://raibledesigns.com/rd/entry/a_sweet_trip_to_switzerland"&gt;in Zurich for the first time&lt;/a&gt;, enjoying our accommodations and marveling at Switzerland's excellent transportation system.
I experienced an interesting situation while speaking, but quickly forgot when we visited Rhine Falls, celebrated our anniversary at Gruelich and played in the Swiss Alps.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a href="http://farm7.static.flickr.com/6030/5879428306_a793f2a67e.jpg" title="View from Great Church" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6030/5879428306_a793f2a67e_s.jpg" width="75" height="75" alt="View from Great Church" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm6.static.flickr.com/5080/5879428652_e847f2ff0c.jpg" title="Happy Couple in Zürich" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5080/5879428652_e847f2ff0c_s.jpg" width="75" height="75" alt="Happy Couple in Zürich" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;
&lt;a href="http://farm6.static.flickr.com/5108/5879429020_21dd2b6ddf.jpg" title="Riding the Train" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5108/5879429020_21dd2b6ddf_s.jpg" width="75" height="75" alt="Riding the Train" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;
&lt;a href="http://farm7.static.flickr.com/6005/5879429424_275a73ac3d.jpg" title="Rhine Falls!" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6005/5879429424_275a73ac3d_s.jpg" width="75" height="75" alt="Rhine Falls!" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a href="http://farm6.static.flickr.com/5112/5878867297_cac4cd43c9.jpg" title="Whoa!" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5112/5878867297_cac4cd43c9_m.jpg" width="240" height="180" alt="Whoa!" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm6.static.flickr.com/5183/5881479860_7ef4ba409e.jpg" title="Rhine Falls Flowers" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5183/5881479860_7ef4ba409e_m.jpg" width="240" height="180" alt="Rhine Falls Flowers" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a href="http://farm6.static.flickr.com/5320/5880917345_38968f556c.jpg" title="Olives and Sprouts" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5320/5880917345_38968f556c_t.jpg" width="100" height="75" alt="Olives and Sprouts" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm6.static.flickr.com/5144/5880917787_cfcb0012ce.jpg" title="Scallops and Tomato" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5144/5880917787_cfcb0012ce_t.jpg" width="100" height="75" alt="Scallops and Tomato" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm7.static.flickr.com/6018/5878966083_8bef3238da.jpg" title="Dessert at Greulich" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6018/5878966083_8bef3238da_t.jpg" width="100" height="75" alt="Dessert at Greulich" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm6.static.flickr.com/5151/5878966527_7634f8a94e.jpg" title="Greulich's Backyard Trees" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm6.static.flickr.com/5151/5878966527_7634f8a94e_t.jpg" width="100" height="75" alt="Greulich's Backyard Trees" style="margin-left: 10px; border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;We arrived back in Denver at 6pm on Sunday, June 26th and I flew to Montana at 8am the next morning. I worked from The Cabin that week and &lt;a href="http://raibledesigns.com/rd/entry/agile_hiring_book_review"&gt;wrote a book review for Agile Hiring&lt;/a&gt;.
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
I think Sean [Landis] does a great job in showing how you can apply agile principles (people over process, tracking tools, failing fast, continuous improvement, constant feedback) to improve your hiring process. As a person that interviews often, I think it also gives great insights into how companies interview and what they're looking for. I've often thought that being honest about my skills and what I'm looking for is a good tactic and this book seems to confirm that.
&lt;/p&gt;
&lt;p&gt;That weekend, it was the "90s Reunion" for the Seeley Swan High School, which I attended my freshman and sophomore year of high school. There were several highlights of the trip, but one of my favorites was our float in the Swan Valley Parade. Abbie came up with the idea (Happy Birthday America) and we decorated an old trailer with streamers, balloons and a birthday cake to celebrate. Abbie made up a song and sang it throughout the entire parade (with a portable microphone and amp).
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Abbie singing &amp;quot;Happy Birthday America&amp;quot;" href="http://farm7.static.flickr.com/6130/5934498303_10250c2760.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black" alt="Abbie singing &amp;quot;Happy Birthday America&amp;quot;" src="http://farm7.static.flickr.com/6130/5934498303_10250c2760_t.jpg"&gt;&lt;/a&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Abbie before getting dunked" href="http://farm7.static.flickr.com/6020/5934498549_38f1793c46.jpg"&gt;&lt;img width="100" height="75" style="margin-left: 0px; border: 1px solid black" alt="Abbie before getting dunked" src="http://farm7.static.flickr.com/6020/5934498549_38f1793c46_t.jpg"&gt;&lt;/a&gt;
&lt;a rel="lightbox[4thofjuly2011]" title="Fiddlin' Trish" href="http://farm7.static.flickr.com/6002/5934499269_c40b347316.jpg"&gt;&lt;img width="100" height="75" style="margin-left: 0px; border: 1px solid black" alt="Fiddlin' Trish" src="http://farm7.static.flickr.com/6002/5934499269_c40b347316_t.jpg"&gt;&lt;/a&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Paddleboating" href="http://farm7.static.flickr.com/6123/5935065040_59657b06fa.jpg"&gt;&lt;img width="100" height="75" style="margin-left: 0px; border: 1px solid black" alt="Paddleboating" src="http://farm7.static.flickr.com/6123/5935065040_59657b06fa_t.jpg"&gt;&lt;/a&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Lake McDonald, Glacier National Park" href="http://farm7.static.flickr.com/6006/5935068822_cfd7c86009.jpg"&gt;&lt;img width="100" height="75" style="margin-left: 0px; border: 1px solid black" alt="Lake McDonald, Glacier National Park" src="http://farm7.static.flickr.com/6006/5935068822_cfd7c86009_t.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I went swimming with my iPhone 4 that Sunday and Trish and her Dad showed up a few hours later. On the 4th, we had a blast celebrating the holiday with mine and my parents' old friends. The next day, we adventured to Glacier National Park, where Trish shot an &lt;a href="http://www.mcginityphoto.com/Nature/Nature/4725995_JRpvJB/9/1373210164_W4mgd99#!i=1373210164&amp;amp;k=W4mgd99"&gt;awesome sunrise at Lake McDonald&lt;/a&gt;.
She also captured a beautiful picture of The Cabin at sunset that week.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[4thofjuly2011]" title="The Raible Cabin by Trish McGinity" href="http://farm7.static.flickr.com/6122/5933924991_8dde37f131.jpg"&gt;&lt;img width="500" height="333" style="border: 1px solid black" alt="The Raible Cabin" src="http://farm7.static.flickr.com/6122/5933924991_8dde37f131.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In between vacationing in Montana and writing about it, I wrote some technical posts:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_oauth_with_appfuse_and"&gt;Integrating OAuth with AppFuse and its REST API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/installing_openjdk_7_on_os"&gt;Installing OpenJDK 7 on OS X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We returned to Denver in mid-July and shipped the kids off to Florida just before my annual Birthday Golf Debacle. We teed off at Wellshire Golf Course and had one of the most well-behaved rounds in a few years. The next weekend, we closed on our "Ski Shack" in Fraser and I penned &lt;a href="http://raibledesigns.com/rd/entry/another_dream_realized_mountain_views"&gt;Another Dream Realized: Mountain Views&lt;/a&gt;. Trish's &lt;a href="http://www.mcginityphoto.com/Nature/Nature/4725995_szrsM#!i=1532788498&amp;k=gvjfKJh&amp;lb=1&amp;s=S"&gt;October Sunset photo&lt;/a&gt; is one of my favorite glimpses of our view.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://www.mcginityphoto.com/Nature/Nature/i-gvjfKJh/2/L/OctoberSunsetFraserfromourDock-L.jpg" rel="lightbox[yearinreview2011]" title="October Sunset from our dock"&gt;&lt;img src="http://www.mcginityphoto.com/Nature/Nature/i-gvjfKJh/2/S/OctoberSunsetFraserfromourDock-S.jpg" alt="October Sunset in Fraser" width="400" height="269" style="border: 1px solid black" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Next, I blogged about &lt;a href="http://raibledesigns.com/rd/entry/how_do_you_get_started"&gt;How do you get started in programming?&lt;/a&gt; and we headed to the airport a few hours later for a whirlwind trip from Oregon to Cape Cod. &lt;em&gt;That&lt;/em&gt; was a wonderful trip and it took me almost a month &lt;a href="http://raibledesigns.com/rd/entry/oregon_cape_cod_and_fun"&gt;to write about it&lt;/a&gt;. We flew into Portland and spent the weekend hiking in Silver Falls and drinking good beer at the &lt;a href="http://www.oregonbrewfest.com/"&gt;Oregon Brewers Festival&lt;/a&gt; and &lt;a href="http://www.mcmenamins.com/54-edgefield-home"&gt;Edgefield&lt;/a&gt;. We stayed with my good friends Clint and Autumn (married in &lt;a href="http://raibledesigns.com/rd/entry/costa_rica_was_awesome"&gt;Costa Rica in 2008&lt;/a&gt;), who had their first child only a few weeks after our visit (August 26th).
&lt;/p&gt;
&lt;p&gt;We had an awful early flight out of Portland to Boston that Sunday. On Monday afternoon, we picked up Abbie and Jack from the Boston airport. They flew up from West Palm Beach on their first unaccompanied minors flight. We drove them to Cape Cod and settled into Trish's parents house near the water. The rest of the week, we had a blast with our friends Chris and Julie and the entire McGinity clan. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Wheeee!!" href="http://farm7.static.flickr.com/6022/6008443089_cc4f752c0f.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black" alt="Wheeee!!" src="http://farm7.static.flickr.com/6022/6008443089_cc4f752c0f_t.jpg"&gt;&lt;/a&gt;

&lt;a rel="lightbox[yearinreview2011]" title="Hercules!" href="http://farm7.static.flickr.com/6006/6008999952_78fd13f415.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black; margin-left: 10px" alt="Hercules!" src="http://farm7.static.flickr.com/6006/6008999952_78fd13f415_t.jpg"&gt;&lt;/a&gt;

&lt;a rel="lightbox[yearinreview2011]" title="Michael and Jack" href="http://farm7.static.flickr.com/6125/6044153539_84019058e4.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black; margin-left: 10px" alt="Michael and Jack" src="http://farm7.static.flickr.com/6125/6044153539_84019058e4_t.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Monkey Shadows" href="http://farm7.static.flickr.com/6133/6044703126_cb16505a0c.jpg"&gt;&lt;img width="240" height="180" style="border: 1px solid black; margin-left: 10px" alt="Monkey Shadows" src="http://farm7.static.flickr.com/6133/6044703126_cb16505a0c_m.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
We spent the rest of August going to concerts at Red Rocks, beer festivals in Winter Park, mountain biking, hiking, taking the kids to the Ski Shack and playing with Crazy Sagan. 
&lt;a href="http://farm7.staticflickr.com/6087/6044208823_60c83e67c9.jpg" title="Crazy Sagan!" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.staticflickr.com/6087/6044208823_60c83e67c9_t.jpg" width="100" height="75" alt="Crazy Sagan!" class="picture" style="margin-top: 5px"&gt;&lt;/a&gt;
In my only August post, I talked a lot about the Broncos, Hawaii, Devoxx and leaving Overstock.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
  That pretty much catches you up-to-date with the goings on in my life. As you can tell, it's been a &lt;em&gt;great&lt;/em&gt; summer so far. I'm really looking forward to the fall too. Broncos season, a trip to Hawaii, learning new technologies, talking about them at Devoxx and a new gig.
  &lt;br/&gt;...&lt;br/&gt;
  Tomorrow is Jack's birthday. I gotta run ... it's time to go buy a bike, play a little golf, hit the pool and go to the BBQ before tonight's CD Release Party. 
&lt;/p&gt;
&lt;p&gt;We watched proudly as Jack turned 7 the next day and loved his excitement when he got his first mountain bike.&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://farm7.staticflickr.com/6173/6168228852_44f34ab78d.jpg" title="7 Miles and ready for more" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.staticflickr.com/6173/6168228852_44f34ab78d_m.jpg" width="240" height="180" alt="7 Miles and ready for more" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;September started with mountain breezes and &lt;a href="http://raibledesigns.com/rd/entry/labor_day_weekend_in_grand"&gt;fishing at Lake Granby&lt;/a&gt;. Lots of friends, family and delicious food make for a heckuva 3-day weekend. Jack was the only one to catch a fish and you couldn't wipe the smile off his face for the rest of the day.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="The delicious fish that Jack caught at Lake Granby" href="http://farm7.static.flickr.com/6189/6112833896_59bd8ecc99.jpg"&gt;&lt;img width="500" height="375" style="border: 1px solid black" alt="The delicious fish that Jack caught at Lake Granby" src="http://farm7.static.flickr.com/6189/6112833896_59bd8ecc99.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I described my &lt;a href="http://raibledesigns.com/rd/entry/the_digital_diet"&gt;Digital Diet&lt;/a&gt; and wrote my first article related to my Devoxx talk: &lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;Integrating Scalate and Jade with Play 1.2.3&lt;/a&gt;. The 2nd weekend in September, we enjoyed a &lt;a href="http://www.flickr.com/photos/mraible/sets/72157627717258988/"&gt;September Sports Weekend&lt;/a&gt;, going to two Rockies games and the Monday night Broncos Opener before heading to Kauai. While the Broncos didn't win that game, Trish's shot of Brett, Joe and I sums up many-a-game this season.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm7.staticflickr.com/6168/6185423596_e62d1e1efd.jpg" title="Broncos Home Opener" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.staticflickr.com/6168/6185423596_e62d1e1efd.jpg" width="500" height="333" alt="Broncos Home Opener" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;As expected, &lt;a href="http://raibledesigns.com/rd/entry/mahalo_kauai"&gt;Kauai blew our minds&lt;/a&gt;. We saw several spectacular sunsets, did some Stand Up Paddling (it's harder than it looks), played golf, took a doorless helicopter ride and kayaked along the Na Pali coast. &lt;/p&gt;
&lt;table style="margin: 0 auto 5px auto" cellspacing="10"&gt;
  &lt;tr&gt;
    &lt;td rowspan="3"&gt;
  &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6154/6174598580_b6ace6880c.jpg" title="HDR Sunset next to the palm trees on the beach at Hanalei Bay by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6154/6174598580_b6ace6880c_m.jpg" width="156" height="240" alt="HDR Sunset next to the palm trees on the beach at Hanalei Bay" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;
    &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6153/6174087039_b147ec5f65.jpg" title="Hanalei Bay Sunset HDR by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6153/6174087039_b147ec5f65_t.jpg" width="100" height="66" alt="Hanalei Bay Sunset HDR" style="border: 1px solid black"&gt;&lt;/a&gt;
    &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6159/6174622520_0f9b50e427.jpg" title="Makai Golf Club my pitch out of the sand is next to the pin.  Matt's is on the edge of the green :) by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6159/6174622520_0f9b50e427_t.jpg" width="100" height="67" alt="Makai Golf Club my pitch out of the sand is next to the pin.  Matt's is on the edge of the green :)" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;
    &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6154/6174624336_e84fa0c139.jpg" title="Bougainvillia on the Makai Golf course looking across Hanalei Bay by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6154/6174624336_e84fa0c139_t.jpg" width="100" height="66" alt="Bougainvillia on the Makai Golf course looking across Hanalei Bay" style="border: 1px solid black"&gt;&lt;/a&gt;
    &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6153/6174630996_b292dbe061.jpg" title="2 Blue Hawai'i on the beach in Hanalei Bay by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6153/6174630996_b292dbe061_t.jpg" width="100" height="67" alt="2 Blue Hawai'i on the beach in Hanalei Bay" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;
    &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6178/6174149421_a06193f2ee.jpg" title="Rainbow to Kalalau Valley Napali Coast State Park by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6178/6174149421_a06193f2ee_t.jpg" width="100" height="67" alt="Rainbow to Kalalau Valley Napali Coast State Park" style="border: 1px solid black"&gt;&lt;/a&gt;
    &lt;a rel="lightbox[yearinreview2011]" href="http://farm7.staticflickr.com/6174/6174681482_93a457f09b.jpg" title="Wahooo That was Awesome! :) by McGinityPhoto, on Flickr"&gt;&lt;img src="http://farm7.staticflickr.com/6174/6174681482_93a457f09b_t.jpg" width="100" height="67" alt="Wahooo That was Awesome! :)" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;We never got bored of the view from our room.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a rel="lightbox[yearinreview2011]" title="Aloha in the morning at the St Regis Hanalei Bay by McGinityPhoto, on Flickr" href="http://farm7.static.flickr.com/6157/6174599098_da19a2c72a.jpg"&gt;&lt;img width="500" height="331" style="border: 1px solid black; margin-left: 10px" alt="Aloha in the morning at the St Regis Hanalei Bay" src="http://farm7.static.flickr.com/6157/6174599098_da19a2c72a.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Upon our return, I &lt;a href="http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work"&gt;tried to make CoffeeScript work with Scalate&lt;/a&gt; and 
&lt;a href="http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"&gt;integrated HTML5 Boilerplate with Play&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="lightbox[yearinreview2011]" href="https://fbcdn-sphotos-a.akamaihd.net/hphotos-ak-snc7/309585_10150334101446712_571296711_8306949_270832760_n.jpg" title="Halloween"&gt;&lt;img src="https://fbcdn-photos-a.akamaihd.net/hphotos-ak-snc7/309585_10150334101446712_571296711_8306949_270832760_a.jpg" alt="Halloween" width="180" height="139" class="picture" style="margin-top: 10px"&gt;&lt;/a&gt;
October was a quiet month on this blog. I only wrote two articles, one about &lt;a href="http://raibledesigns.com/rd/entry/increasing_my_developer_happiness"&gt;increasing my developer happiness&lt;/a&gt; and another about &lt;a href="http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and"&gt;developing with HTML5, CoffeeScript and Twitter's Bootstrap&lt;/a&gt;. Watching the Broncos in October was painful at first, buy many rejoiced when Tebow started against Miami (10/23) and we had the amazing comeback to win. We went to the next game against the Lions and were quickly shown they had a long ways to go. We dressed up as the Scary Family for Halloween and had a ball.
&lt;/p&gt;
&lt;p&gt;I made up for October's lack of writing by writing 9 articles in November. I started with &lt;a href="http://raibledesigns.com/rd/entry/play_scala_s_anorm_heroku"&gt;complaints about Play Scala's Anorm and PostgreSQL&lt;/a&gt;, then &lt;a href="http://raibledesigns.com/rd/entry/happy_9th_birthday_abbie"&gt;celebrated Abbie's 9th Birthday&lt;/a&gt; with a &lt;a href="http://www.flickr.com/photos/mraible/6316702824"&gt;Magic Show&lt;/a&gt;.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm7.staticflickr.com/6117/6316702372_40594e7cbf.jpg" title="Happy Kids" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.staticflickr.com/6117/6316702372_40594e7cbf_m.jpg" width="240" height="160" alt="Happy Kids" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm7.staticflickr.com/6047/6316702824_e46bacdc72.jpg" title="Birthday Crew" rel="lightbox[yearinreview2011]"&gt;&lt;img src="http://farm7.staticflickr.com/6047/6316702824_e46bacdc72_m.jpg" width="240" height="160" alt="Birthday Crew" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;The next week, I wrote about my &lt;a href="http://raibledesigns.com/rd/entry/new_macbook_pro_and_imac"&gt;new MacBook Pro and iMac&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/more_scalate_goodness_for_play"&gt;more Scalate goodness for Play&lt;/a&gt;. At this point, I was scrambling to finish up my &lt;em&gt;Play More!&lt;/em&gt; application for &lt;a href="http://www.devoxx.com/display/DV11/Home"&gt;Devoxx&lt;/a&gt; and worked a lot of late nights. That weekend, I &lt;a href="http://raibledesigns.com/rd/entry/phonegap_to_the_rescue"&gt;used PhoneGap&lt;/a&gt; to turn my webapp into a native app and finished everything in the nick of time. We flew to Paris that Monday, took the train to Antwerp on Tuesday and settled in for a memorable week of interesting talks.
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/play_2_0_a_web"&gt;Play 2.0, A web framework for a new era&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/phonegap_for_hybrid_app_development"&gt;PhoneGap for Hybrid App Development&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/deploying_java_and_play_framework"&gt;Deploying Java and Play Framework Apps to the Cloud with James Ward&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/my_html5_with_play_scala"&gt;My HTML5 with Play Scala, CoffeeScript and Jade Presentation from Devoxx 2011&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Crew at Devoxx dinner by McGinity Photo" href="http://farm8.staticflickr.com/7006/6448345655_df403b1cfd.jpg"&gt;&lt;img width="100" height="67" style="border: 1px solid black" alt="Matt Raible and Crew at Devoxx dinner" src="http://farm8.staticflickr.com/7006/6448345655_df403b1cfd_t.jpg"&gt;&lt;/a&gt;

  
  &lt;a rel="lightbox[yearinreview2011]" title="At Pelgrom by McGinity Photo" href="http://farm8.staticflickr.com/7019/6448347213_5e9c59ba8c.jpg"&gt;&lt;img width="100" height="67" style="border: 1px solid black; margin-left: 10px" alt="Matt Raible at Pelgrom" src="http://farm8.staticflickr.com/7019/6448347213_5e9c59ba8c_t.jpg"&gt;&lt;/a&gt;

  &lt;a rel="lightbox[yearinreview2011]" title="James Ward speaking on Heroku at Devoxx by McGinity Photo" href="http://farm8.staticflickr.com/7147/6448349163_313bc48dd5.jpg"&gt;&lt;img width="100" height="67" style="border: 1px solid black; margin-left: 10px" alt="James Ward speaking on Heroku at Devoxx" src="http://farm8.staticflickr.com/7147/6448349163_313bc48dd5_t.jpg"&gt;&lt;/a&gt;
  &lt;a rel="lightbox[yearinreview2011]" title="Speaking at Devoxx Belgium 2011 by McGinity Photo" href="http://farm8.staticflickr.com/7031/6448350561_e62da3327b.jpg"&gt;&lt;img width="100" height="67" style="border: 1px solid black; margin-left: 10px" alt="Matt Raible speaking at Devoxx Belgium 2011" src="http://farm8.staticflickr.com/7031/6448350561_e62da3327b_t.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
  &lt;a rel="lightbox[yearinreview2011]" title="Antwerp Town Square by McGinity Photo" href="http://farm8.staticflickr.com/7142/6448355157_16f8487f6b.jpg"&gt;&lt;img width="240" height="160" style="border: 1px solid black" alt="Antwerp Town Square" src="http://farm8.staticflickr.com/7142/6448355157_16f8487f6b_m.jpg"&gt;&lt;/a&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Riverside in Antwerp by McGinity Photo" href="http://farm8.staticflickr.com/7010/6448353693_f63f7afee6.jpg"&gt;&lt;img width="240" height="160" style="border: 1px solid black; margin-left: 10px" alt="Riverside in Antwerp" src="http://farm8.staticflickr.com/7010/6448353693_f63f7afee6_m.jpg"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;That Saturday, we took the train back to Paris and checked into our hotel for a few days of romance. I proposed to Trish at Versailles on Sunday at sunset and we rolled around in our joy for a few days before we told any of our friends. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a rel="lightbox[yearinreview2011]" title="The Versailles Orangerie" href="http://farm8.staticflickr.com/7009/6402228135_6ffc860b9f.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black" alt="The Versailles Orangerie" src="http://farm8.staticflickr.com/7009/6402228135_6ffc860b9f_t.jpg"&gt;&lt;/a&gt;
  &lt;a rel="lightbox[yearinreview2011]" title="Château de Versailles" href="http://farm8.staticflickr.com/7141/6402228667_2e908c6fb0.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black; margin-left: 10px" alt="Château de Versailles" src="http://farm8.staticflickr.com/7141/6402228667_2e908c6fb0_t.jpg"&gt;&lt;/a&gt;
  &lt;a rel="lightbox[yearinreview2011]" title="Gardens of Versailles" href="http://farm8.staticflickr.com/7161/6402229087_0d34f8f6f9.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black; margin-left: 10px" alt="Gardens of Versailles" src="http://farm8.staticflickr.com/7161/6402229087_0d34f8f6f9_t.jpg"&gt;&lt;/a&gt;
  &lt;a rel="lightbox[yearinreview2011]" title="Trees in the Versailles Gardens" href="http://farm8.staticflickr.com/7023/6402230475_9251f0664c.jpg"&gt;&lt;img width="100" height="75" style="border: 1px solid black; margin-left: 10px" alt="Trees in the Versailles Gardens" src="http://farm8.staticflickr.com/7023/6402230475_9251f0664c_t.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Bassin d’Apollon &amp;ndash; the Apollo Fountain by McGinity Photo" href="http://farm8.staticflickr.com/7166/6448369805_70a43560c4.jpg"&gt;&lt;img width="500" height="329" alt="Bassin d’Apollon &amp;ndash; the Apollo Fountain" src="http://farm8.staticflickr.com/7166/6448369805_70a43560c4.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;  
&lt;p&gt;
We flew back to the US the Wednesday before Christmas and spent the weekend in Boston with Trish's family. For full details of that trip, see &lt;a href="http://raibledesigns.com/rd/entry/our_engaging_trip_to_paris"&gt;Our Engaging Trip to Paris and Antwerp&lt;/a&gt;.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Happy" href="http://farm7.staticflickr.com/6031/6402231033_9a0f51938c.jpg"&gt;&lt;img width="240" height="180" style="border: 1px solid black" alt="Happy" src="http://farm7.staticflickr.com/6031/6402231033_9a0f51938c_m.jpg"&gt;&lt;/a&gt;
&lt;a rel="lightbox[yearinreview2011]" title="Versailles Sunset" href="http://farm8.staticflickr.com/7018/6402232723_e61d57cc98.jpg"&gt;&lt;img width="240" height="180" style="border: 1px solid black; margin-left: 10px" alt="Versailles Sunset" src="http://farm8.staticflickr.com/7018/6402232723_e61d57cc98_m.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;To end the year, I kept it light and only spun up one blog post in December: &lt;a href="http://raibledesigns.com/rd/entry/what_have_i_been_working"&gt;What have I been working on at Taleo?&lt;/a&gt; A week after writing that post, we moved to the Ski Shack for 3 weeks and enjoyed a &lt;a href="http://www.flickr.com/photos/mraible/sets/72157628628439665/"&gt;wonderful holiday break&lt;/a&gt; with &lt;a href="http://www.flickr.com/photos/mraible/sets/72157628725392081/"&gt;many visitors&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a rel="lightbox[yearinreview2011]" href="http://farm8.staticflickr.com/7150/6638934399_2fb67c7883.jpg" title="Shredders"&gt;&lt;img src="http://farm8.staticflickr.com/7150/6638934399_2fb67c7883_m.jpg" width="240" height="180" alt="Shredders" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a rel="lightbox[yearinreview2011]" href="http://farm8.staticflickr.com/7031/6638937219_8623aa8e63.jpg" title="Happy New Year!"&gt;&lt;img src="http://farm8.staticflickr.com/7031/6638937219_8623aa8e63_m.jpg" width="240" height="180" alt="Happy New Year!" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Yes, 2011 was a spectacular year. We traveled to four different countries, did a lot of camping and mountain biking and accomplished 2/3 of my 5 year goals (basement sauna and mountain views). I wrote a lot of technical blog posts in the 2nd half of the year; most inspired my extracurricular activities&lt;/a&gt;. I plan to continue that this year as I learn more about HTML5, Play Framework, Scala and CoffeeScript. At the end of last year's &lt;a href="http://raibledesigns.com/rd/entry/2010_a_year_in_review"&gt;Year in Review&lt;/a&gt;, I wrote:
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
In 2011, I plan on doing two main things: keep rockin' it with Trish and finishing The Bus.
&lt;/p&gt;
&lt;p&gt;I think I can safely say I kept it rockin' with Trish - we're living together, engaged and still amazed we found one another. As for The Bus, I think &lt;a href="http://www.motorworksrestorations.com/"&gt;MotorWorks Restorations&lt;/a&gt; and I are in a good position to make a final push and finish the sucker. My hope is to have it done by May so I can start driving it and taking it to VW Shows. In the meantime, Trish has started working on &lt;a href="http://www.mcginityphoto.com/"&gt;McGinity Photo&lt;/a&gt; full-time and loving it. We have trips planned to Stockholm (for &lt;a href="http://jfokus.se"&gt;Jfokus&lt;/a&gt;), Madrid (for &lt;a href="http://www.springio.net/"&gt;Spring I/O&lt;/a&gt;) and Paris (for &lt;a href="http://www.devoxx.fr/display/FR12/Accueil"&gt;Devoxx Paris&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;Last weekend, we &lt;a href="http://www.flickr.com/photos/mraible/sets/72157628804308427/"&gt;witnessed&lt;/a&gt; one of the greatest playoff games &lt;em&gt;ever&lt;/em&gt; when the Broncos beat the Steelers. I think the picture of Trish celebrating the final touchdown pretty much sums up 2011. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a rel="lightbox[yearinreview2011]" href="http://farm8.staticflickr.com/7161/6671393297_d6f01b715f.jpg" title="Broncos Win!"&gt;&lt;img src="http://farm8.staticflickr.com/7161/6671393297_d6f01b715f.jpg" width="500" height="375" alt="Broncos Win!" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;I look forward to all the skiing, celebrating, camping, traveling and bus rides in 2012. It's gonna be a fantastic year.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=95801094&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=95801094&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=95801094 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security</guid><title>Upgrading AppFuse to Spring Security 3.1 and Spring 3.1</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security</link><pubDate>Thu, 5 Jan 2012 08:58:21 -0700</pubDate><category>Java</category><category>appfuse</category><category>springsecurity</category><category>spring</category><description>Before the holiday break, I spent some time upgrading &lt;a href="http://appfuse.org"&gt;AppFuse&lt;/a&gt; to use the latest releases of Spring and Spring Security. I started with Spring Security in early December and quickly discovered its 3.1 XSD required some changes. After changing to the &lt;a href="http://www.springframework.org/schema/security/spring-security-3.1.xsd"&gt;3.1 XSD&lt;/a&gt; in my &lt;em&gt;security.xml&lt;/em&gt;, I had to change its &amp;lt;http&amp;gt; element to use &lt;code&gt;security="none"&lt;/code&gt; instead of &lt;code&gt;filters="none"&lt;/code&gt;. With Spring Security 3.0.5, I had:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;http auto-config="true" lowercase-comparisons="false"&gt;
    &amp;lt;intercept-url pattern="/images/**" filters="none"/&gt;
    &amp;lt;intercept-url pattern="/styles/**" filters="none"/&gt;
    &amp;lt;intercept-url pattern="/scripts/**" filters="none"/&gt;
&lt;/pre&gt;
After upgrading to 3.1, I had to change this to:
&lt;pre class="brush: xml"&gt;
&amp;lt;http pattern="/images/**" security="none"/&gt;
&amp;lt;http pattern="/styles/**" security="none"/&gt;
&amp;lt;http pattern="/scripts/**" security="none"/&gt;

&amp;lt;http auto-config="true"&gt;
&lt;/pre&gt;
&lt;p&gt;The next thing I had to change was &lt;a href="http://source.appfuse.org/browse/appfuse/trunk/service/src/main/java/org/appfuse/service/UserSecurityAdvice.java?r1=3329&amp;r2=3582"&gt;UserSecurityAdvice.java&lt;/a&gt;. Instead of using &lt;code&gt;Collection&amp;lt;GrantedAuthority&amp;gt;&lt;/code&gt; for Authentication's &lt;em&gt;getAuthority()&lt;/em&gt; method, I had to change it to use &lt;code&gt;Collection&amp;lt;? extends GrantedAuthority&amp;gt;&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
Authentication auth = ctx.getAuthentication();
Collection&amp;lt;? extends GrantedAuthority&gt; roles = auth.getAuthorities();
&lt;/pre&gt;
&lt;p style="text-align: left"&gt;Lastly, I discovered that &lt;code&gt;SPRING_SECURITY_CONTEXT_KEY&lt;/code&gt; &lt;a href="http://source.appfuse.org/browse/appfuse/trunk/web/common/src/main/java/org/appfuse/webapp/listener/UserCounterListener.java?r1=3579&amp;r2=3582"&gt;moved to  HttpSessionSecurityContextRepository&lt;/a&gt;. &lt;a href="http://source.appfuse.org/changelog/appfuse/?cs=3582"&gt;Click here&lt;/a&gt; to see the changelog for this upgrade in AppFuse's FishEye.
&lt;/p&gt;
&lt;p&gt;You can read more about &lt;a href="http://www.infoq.com/news/2011/12/spring-security-3.1"&gt;what's new in Spring Security 3.1 on InfoQ&lt;/a&gt;. I'm especially pumped to see http-only cookie support for Servlet 3.0. I discovered Spring Security didn't support this when &lt;a href="http://raibledesigns.com/rd/entry/java_web_application_security_part4"&gt;Pen-Testing with Zed Attack Proxy&lt;/a&gt;.
&lt;p id="spring-3.1"&gt;&lt;strong&gt;Upgrading to Spring Framework 3.1&lt;/strong&gt;&lt;br/&gt;
Compared to the Spring Security upgrade, upgrading to Spring 3.1 &lt;a href="http://source.appfuse.org/changelog/appfuse/?cs=3585"&gt;was a breeze&lt;/a&gt;. The first thing I discovered after changing my pom.xml's version was that Spring Security required some additional exclusions in order to get the latest Spring versions. Of course, this was communicated to me through the following cryptic error.
&lt;/p&gt;
&lt;pre&gt;
-------------------------------------------------------------------------------
Test set: org.appfuse.dao.LookupDaoTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.004 sec &lt;&lt;&lt; FAILURE!
testGetRoles(org.appfuse.dao.LookupDaoTest)  Time elapsed: 0.001 sec  &lt;&lt;&lt; ERROR!
java.lang.NoSuchMethodError: org.springframework.context.support.GenericApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment;
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:97)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
	at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
	at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
	at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
&lt;/pre&gt;
&lt;p&gt;
Without these additional exclusions, Spring Security pulled in Spring 3.0.6. I had to exclude spring-expression, spring-context and spring-web from spring-security-taglibs to get the 3.1.0.RELEASE version of Spring.
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-taglibs&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&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-expression&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;/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;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I also had to exclude spring-context from spring-security-config and spring-context and spring-expression from spring-security-core. &lt;em&gt;Isn't Maven wonderful?&lt;/em&gt;
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-core&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&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-expression&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;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-config&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&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-context&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;After making these changes, I got a bit further, but ended up being blocked by a &lt;a href="https://issues.apache.org/jira/browse/TAP5-1788"&gt;bug in Tapestry 5's Spring support&lt;/a&gt;. Basically, after upgrading to Spring 3.1, I started seeing the following error:
&lt;/p&gt;
&lt;pre&gt;
java.lang.RuntimeException: Service id 'environment' has already been defined by 
org.apache.tapestry5.services.TapestryModule.buildEnvironment(PerthreadManager) 
&lt;/pre&gt;
&lt;p&gt;Luckily, I was able to easily fix this with advice I &lt;a href="http://tapestry.1045711.n5.nabble.com/tapestry-5-2-4-and-spring-3-1M1-td4462226.html"&gt;found on Tapestry's mailing list&lt;/a&gt;. Unfortunately, even though I submitted a fix on December 15th, it didn't make it into &lt;a href="http://tapestry.apache.org/2011/12/21/announcing-tapestry-531.html"&gt;Tapestry's 5.3.1 release on December 21st&lt;/a&gt;. As soon as Tapestry 5.3.2 is released, I hope to get the AppFuse's build passing again (it's &lt;a href="http://builds.appfuse.org/browse/APF-TRUNK-535"&gt;currently failing&lt;/a&gt;). 
&lt;/p&gt;
&lt;p&gt;I hope this article helps you upgrade your AppFuse-started applications to the latest versions of Spring and Spring Security. Over the next few weeks, I'll be exploring many of &lt;a href="http://blog.springsource.org/2011/12/13/spring-framework-3-1-goes-ga/"&gt;Spring 3.1's new features&lt;/a&gt; and implementing them as I see fit. Right now, I'm thinking environments/profiles, Servlet 3 / Java 7 support and Hibernate 4 support. These seem to be the best new features to learn about for &lt;a href="http://www.meetup.com/SV-SUG/events/43376082/"&gt;my talk in a few weeks&lt;/a&gt;.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=95675971&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=95675971&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=95675971 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/what_have_i_been_working</guid><title>What have I been working on at Taleo?</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/what_have_i_been_working</link><pubDate>Fri, 9 Dec 2011 12:57:36 -0700</pubDate><category>Java</category><category>javascript</category><category>taleo</category><category>jquery</category><category>overstock</category><category>happiness</category><description>2011 has been a year of great clients for me. I started working with &lt;a href="http://overstock.com"&gt;O.co&lt;/a&gt; and very much enjoyed my time there, especially on &lt;a href="http://raibledesigns.com/rd/entry/the_greatest_snow_on_earth"&gt;powder days in Utah&lt;/a&gt;. The people were great, the contract was great (no end date), but the work was not my forte. I was on a project to &lt;em&gt;modularize&lt;/em&gt; the main shopping site's codebase, which involved mostly refactoring. By refactoring, I mean creating new Maven projects, modifying lots of pom.xml files and literally moving files from one directory to another. IntelliJ made this easy, the hard part was refactoring tests, moving from EasyMock to Mockito and splitting classes into interfaces and implementations where appropriate. As a developer who likes developing UIs and visually seeing my accomplishments, the project wasn't that exciting. However, I knew that it was strategically important to O.co, so I didn't complain much.
&lt;/p&gt;
&lt;p&gt;In mid-May, I received a &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt; message from the Director of Software Engineering at &lt;a href="http://www.taleo.com/"&gt;Taleo&lt;/a&gt;. 
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
This is OB, I am the Director of Software Engineering at Taleo. We are the 2nd largest Software as a Service company. I am building a new specialist UI team that will take the product to the next level. I am looking for someone to lead this initiative. If you are interested to have a chat about it, please let me know.
&lt;/p&gt;
&lt;p&gt;At that time, I'd never heard of Taleo and quickly recommended they not hire me.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
This probably isn't the best position for me. While I am a good leader, I'm not willing to relocate from Denver. I've found that leaders usually do best when face-to-face with their developers.
&lt;/p&gt;
&lt;p&gt;This conversation continued back-and-forth where I explained how I wasn't willing to go full-time and I didn't want to leave Overstock. In the end, OB was persistent and explained how the position would entail lots of UI work and wouldn't require me to travel much. Our negotiations trailed off in June and resumed in July after I returned &lt;a href="http://raibledesigns.com/rd/entry/4th_of_july_adventures_in"&gt;from vacation in Montana&lt;/a&gt;. Shortly after, we met each other's expectations, agreed on a start date and I started working at Taleo in early September. 
&lt;/p&gt;
&lt;p&gt;When I started, there were three features they wanted to add to to &lt;a href="http://www.taleo.com/solutions/taleo-business-edition"&gt;Taleo Business Edition&lt;/a&gt;: Profile Pictures, Talent Cards and Org Charts. They knew the schedule was tight (8 weeks), but I was confident I could make it happen. At first, I groaned at the fact that they were using Ant to build the project. Then I smiled when I learned they'd standardized on IntelliJ and set things up so you could do everything from the IDE. After using Maven for many years, this setup has actually become refreshing and I rarely have to restart or long for something like JRebel. Of course, a &lt;a href="http://raibledesigns.com/rd/entry/new_macbook_pro_and_imac"&gt;new kick-ass laptop&lt;/a&gt; and &lt;a href="http://blogs.jetbrains.com/idea/2011/12/intellij-idea-11-is-out-get-ready-for-a-productivity-takeoff/"&gt;awesome IDE&lt;/a&gt; make it so I rarely wait for anything to happen.
&lt;/p&gt;
&lt;p&gt;
To give you a taste of how I implemented each of these new features in 8 weeks, I've broken them into sections below.
&lt;/p&gt;
&lt;p id="profile-pictures"&gt;&lt;strong&gt;Profile Pictures&lt;/strong&gt;&lt;br/&gt;
Adding profile pictures was a pretty simple concept, one you see on my social networking sites today. I needed to give users the ability to upload a JPEG or PNG and crop it so it looked good. The uploading was a pretty straightforward process and I used a lot of internal APIs to grab the file from the request and save it to disk. The more difficult part was scaling the image to certain dimensions on upload (to save space) and allowing users to crop it after. 
&lt;/p&gt;
&lt;p&gt;Most of Taleo Business Edition (TBE) is written in good ol' servlets and JSPs, with lots of scriptlets in their JSPs. When I saw the amount of HTML produced from Java, I laughed out loud and cringed. Soon after, I breathed a sigh of relief when I learned that any new features could be written using &lt;a href="http://freemarker.sourceforge.net/"&gt;FreeMarker&lt;/a&gt; templates, which IntelliJ has excellent support for.
&lt;/p&gt;
&lt;p&gt;For image resizing on upload, I used Chris Campbell's &lt;a href="http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html"&gt;Image.getScaledInstance() tutorial&lt;/a&gt;. For creating thumbnails, I used a combination of scaling, &lt;a href="http://docs.oracle.com/javase/6/docs/api/java/awt/image/BufferedImage.html#getSubimage(int, int, int, int)"&gt;getSubimage()&lt;/a&gt; and the &lt;a href="http://docs.oracle.com/javase/6/docs/api/javax/imageio/package-summary.html"&gt;Java Image I/O API&lt;/a&gt;. I made sure to &lt;a href="http://stackoverflow.com/questions/3204280/is-imageio-write-buffered"&gt;write to BufferedOutputStream&lt;/a&gt; for scalability. For cropping images client-side, I used &lt;a href="http://jqueryui.com/demos/dialog/"&gt;jQuery UI's Dialog&lt;/a&gt; and &lt;a href="http://deepliquid.com/content/Jcrop.html"&gt;Jcrop&lt;/a&gt;, the jQuery image cropping plugin. Below is a screenshot of what the cropping UI looks like:
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm8.staticflickr.com/7142/6475456591_6831fd119e_b.jpg" title="Taleo's TBE: Profile Picture" rel="lightbox[taleo]"&gt;&lt;img src="http://farm8.staticflickr.com/7142/6475456591_6831fd119e.jpg" width="500" height="176" alt="Taleo's TBE: Profile Picture"&gt;&lt;/a&gt;
&lt;/a&gt;
&lt;/p&gt;
&lt;p id="talent-cards"&gt;&lt;strong&gt;Talent Cards&lt;/strong&gt;&lt;br/&gt;
Talent Cards were a whole different beast. Not only did they need to display profile pictures, they also needed to contain contact information, work history and a number of other data points. Not just for employees, but for candidates as well. 
They also needed to be rendered with tabs at the bottom that allowed you to navigate between different data sections. 
&lt;/p&gt;
&lt;p&gt;

&lt;a href="http://farm8.staticflickr.com/7032/6475456677_ae342be56e_o.png" title="Taleo's TBE: Talent Card" rel="lightbox[taleo]"&gt;&lt;img src="http://farm8.staticflickr.com/7032/6475456677_a06514020d_m.jpg" width="187" height="240" alt="Taleo's TBE: Talent Card" class="picture" style="border: 0"&gt;&lt;/a&gt;

I'll admit, most of the hard work for this feature was done by the server-side developers (Harish and &lt;a href="http://www.linkedin.com/in/vladimirbazarsky"&gt;Vlad&lt;/a&gt;) on my team. Vlad built the tabbed interface and Harish built the administrative section that allows you to add/remove/sort fields, as well as show and hide certain tabs. I performed most of my magic with jQuery, its &lt;a href="http://plugins.learningjquery.com/cluetip/"&gt;clueTip plugin&lt;/a&gt; and good ol' CSS. I was particularly thankful for CSS3 and its border-radius, box-shadow and Justin Maxwell's tutorial on &lt;a href="http://mattsnider.com/css/css-string-truncation-with-ellipsis/"&gt;CSS String Truncation with Ellipsis&lt;/a&gt;. I used &lt;a href="http://directwebremoting.org/dwr/index.html"&gt;DWR&lt;/a&gt; to fetch all the data from the server using Ajax. 
&lt;/p&gt;
&lt;p&gt;Talent Cards are a slick feature in TBE 11.5 and I think they're a great way to see a lot of information about someone very quickly. If you enable them for your company, you'll be able to mouse over any employee or candidate's names and see their information.
&lt;/p&gt;
&lt;p id="org-chart"&gt;&lt;strong&gt;Org Chart&lt;/strong&gt;&lt;br/&gt;
The last feature I completed in this 8-week sprint was creating an organization chart. For this, I was given a rough prototype based on &lt;a href="http://www.capricasoftware.co.uk/corp/index.php"&gt;Caprica Software's&lt;/a&gt; &lt;a href="http://www.capricasoftware.co.uk/jquery/orgchart/orgchart.html"&gt;JQuery/CSS Organisation Chart&lt;/a&gt;. When I received it, it had all kinds of cool CSS 3 transformations (like &lt;a href="http://css3.bradshawenterprises.com/flip/"&gt;this one&lt;/a&gt;), but they only worked in Safari and Chrome. I ended up removing the transformations and adding the ability to navigate up and down the org tree with Ajax (we currently only show three levels at a time). 
&lt;/p&gt;
&lt;p&gt;
The Org Chart feature also allows you to see how many direct/indirect reports an employee has, as well as access their Talent Card by hovering over their name. It's one of my favorite features because it's so visual and because it builds upon all the other features we've built.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;&lt;a href="http://farm8.staticflickr.com/7148/6483181659_619285347d_o.png" rel="lightbox[taleo]" title="Taleo's TBE: Org Chart"&gt;&lt;img src="http://farm8.staticflickr.com/7148/6483181659_7434afaeee.jpg" width="487" height="500" alt="Taleo's TBE: Org Chart"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
As you might've guessed by now, I've been having a lot of fun doing UI development over the last few months. While I seem to have a knack for backend Java development, I enjoy developing UIs a lot more. The smile you see on people's faces during demos is priceless. I can't help but think this kind of thing contributes greatly to my developer happiness. All these features will be in next week's release of TBE and I couldn't be happier.
&lt;/p&gt;
&lt;p&gt;If you'd like to work on my team at Taleo (or even take over my current role as UI Architect), please &lt;a href="http://raibledesigns.com/contact.jsp"&gt;drop me a line&lt;/a&gt;. If you live near their headquarters (Dublin, CA), it'd also be great to see you at the next Silicon Valley Spring User Group meetup. I'll be speaking about &lt;a href="http://www.meetup.com/SV-SUG/events/43376082/"&gt;What's New in Spring 3.1 on February 1st&lt;/a&gt;.
&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=94740509&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=94740509&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=94740509 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/our_engaging_trip_to_paris</guid><title>Our Engaging Trip to Paris and Antwerp</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/our_engaging_trip_to_paris</link><pubDate>Sun, 4 Dec 2011 16:02:34 -0700</pubDate><category>General</category><category>vacation</category><category>trish</category><category>travel</category><category>engagement</category><category>paris</category><category>antwerp</category><category>devoxx</category><description>If you're a technologist, you should attend the &lt;a href="http://devoxx.com"&gt;Devoxx&lt;/a&gt; conference at least once in your life. It's one of the finest conferences on the planet. 
If you're a fan of Belgian beer, you owe it to yourself to visit &lt;a href="http://en.wikipedia.org/wiki/Belgium"&gt;Belgium&lt;/a&gt; to savor a taste. If you're a romantic, Paris is a recommended destination. Since I'm a technologist, love Belgian beer and consider myself a romantic, I went for the trifecta a couple weeks ago on what's becoming an annual trek to Devoxx. When Trish and I traveled to Devoxx &lt;a href="http://raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam"&gt;last year&lt;/a&gt;, we flew to Amsterdam and took the train to Antwerp. This year, we decided to fly to Paris and take the train. 
&lt;/p&gt;
&lt;p&gt;Much like last year, we witnessed another &lt;a href="http://www.denverpost.com/sports/ci_19328138"&gt;Broncos over Chiefs&lt;/a&gt; victory the Sunday before we left. That night, I stayed up until the wee hours of the morning finishing my Devoxx presentation. We left Denver around noon and met up with &lt;a href="http://www.jamesward.com/"&gt;James Ward&lt;/a&gt; at the Red Carpet Club in Chicago. While sipping cocktails and catching up, I wrote a blog post about &lt;a href="http://raibledesigns.com/rd/entry/phonegap_to_the_rescue"&gt;how PhoneGap rescued me a couple days earlier&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
  We slept soundly on the flight over, thanks to little sleep the night before. After arriving in Paris, we took the train to the the &lt;a href="http://en.wikipedia.org/wiki/Notre_Dame_de_Paris"&gt;Notre Dame de Paris&lt;/a&gt; and had some breakfast nearby. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7018/6448341993_6d9028e480.jpg" title="Notre Dame Cathedral Paris by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7018/6448341993_6d9028e480.jpg" width="500" height="333" alt="Notre Dame Cathedral Paris" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
We were planning on exploring throughout the day, but quickly realized that hauling our bags around was no fun and headed to Gare du Nord to catch a Thalys train to Brussels. We gasped at the cost of two first-class tickets, but soon forgot when we settled into our seats with free wi-fi, Belgian beers and power. After talking a local train to Antwerp, we finished our 21-hour journey by checking into the &lt;a href="http://www1.hilton.com/en_US/hi/hotel/ANRHITW-Hilton-Antwerp-hotel/index.do"&gt;Hilton Antwerp&lt;/a&gt; in the city center. We were &lt;a href="http://twitter.com/#!/mraible/status/136493371001810946"&gt;warmly welcomed with excellent Belgian beers on ice in our room&lt;/a&gt; and celebrated with a delicious meal at &lt;a href="http://www.tripadvisor.com/Restaurant_Review-g188636-d809942-Reviews-De_Godevaart-Antwerp_Antwerpen.html"&gt;De Godevaart&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;On Wednesday, I headed to Devoxx and attended a couple of great talks: &lt;a href="http://raibledesigns.com/rd/entry/play_2_0_a_web"&gt;Play 2.0, A web framework for a new era&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/phonegap_for_hybrid_app_development"&gt;PhoneGap for Hybrid App Development&lt;/a&gt;. As you can imagine, both talks were extremely interesting for me since I'd been using Play for several months and was recently saved by PhoneGap. Play 2.0 Beta was announced just before the Play talk and my &lt;a href="http://raibledesigns.com/rd/entry/play_2_0_a_web"&gt;blog post about the Play 2.0 session&lt;/a&gt; was picked up by &lt;a href="http://news.ycombinator.com/item?id=3242984"&gt;Hacker News&lt;/a&gt; and the hits rolled in.
&lt;/p&gt;
&lt;p&gt;That afternoon, I headed back to my hotel with James Ward and met up with Trish for a couple beers. We spent a few hours in our hotel lobby updating presentations, editing videos, editing photos and getting ready for our talks on Thursday. That evening, we enjoyed a scrumptious dinner in the dungeon-like &lt;a href="http://www.pelgrom.be"&gt;Pelgrom&lt;/a&gt; and conversations with &lt;a href="http://www.devoxx.com/display/DV11/Kevin+Nilson"&gt;Kevin Nilson&lt;/a&gt;, &lt;a href="http://devoxx.com/display/DV11/Sadek+Drobi"&gt;Sadek Drobi&lt;/a&gt;, &lt;a href="http://devoxx.com/display/DV11/Guillaume+Bort"&gt;Guillaume Bort&lt;/a&gt; and &lt;a href="http://www.devoxx.com/display/DV11/David+Geary"&gt;David Geary&lt;/a&gt;. I was pleased to find out from Sadek and Guillaume that Play 2.0 will include many &lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;fast website best practices&lt;/a&gt;, including concatenation, minification and gzipping of static assets. We retired early to get a good night's sleep before my talk on Thursday.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  
  &lt;a href="http://farm8.staticflickr.com/7030/6448346335_2f26b9f0f2.jpg" title="Kwak Kwak Kwak! by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7030/6448346335_2f26b9f0f2_m.jpg" width="160" height="240" alt="Kwak Kwak Kwak!" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7150/6448344501_25b5d5d12e.jpg" title="Candle at Pelgrom by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7150/6448344501_25b5d5d12e_m.jpg" width="160" height="240" alt="Candle at Pelgrom " style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm8.staticflickr.com/7006/6448345655_df403b1cfd.jpg" title="Crew at Devoxx dinner by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7006/6448345655_df403b1cfd_t.jpg" width="100" height="67" alt="Matt Raible and Crew at Devoxx dinner" style="border: 1px solid black"&gt;&lt;/a&gt;

  
  &lt;a href="http://farm8.staticflickr.com/7019/6448347213_5e9c59ba8c.jpg" title="At Pelgrom by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7019/6448347213_5e9c59ba8c_t.jpg" width="100" height="67" alt="Matt Raible at Pelgrom" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;On Thursday, both Trish and I journeyed to Devoxx to watch James Ward talk about &lt;a href="http://www.jamesward.com/2011/11/29/heroku-preso-from-devoxx-2011"&gt;how to deploy Java, Play Framework, and Scala apps on Heroku&lt;/a&gt;. &lt;a href="http://raibledesigns.com/rd/entry/my_html5_with_play_scala" title="My HTML5 with Play Scala, CoffeeScript and Jade Presentation from Devoxx 2011"&gt;My talk&lt;/a&gt; was an hour later and I gulped as I stood up front and watched the (very large) auditorium fill up with Devoxxians. Since I'd never rehearsed my talk or timed it, I was a bit nervous. Luckily, it ended up being one of my best-timed performances and there was even time for Q and A at the end. You can imagine the smile on my face as AC/DC's Thunderstruck blasted through the speakers during my &lt;a href="http://www.youtube.com/watch?v=bBqtPPfM2xQ"&gt;video demo&lt;/a&gt;. After my talk finished, it was great to see all the positive feedback on Twitter and enjoy an "&lt;a href="http://blogs.atlassian.com/2008/12/atlassian_developer_tools_get_props_from_java_posse_at_devoxx/"&gt;Atlas Beer&lt;/a&gt;" while watching &lt;a href="http://javaposse.com/webpage/java-posse-370-live-from-devoxx-11"&gt;Java Posse Live&lt;/a&gt;.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7147/6448349163_313bc48dd5.jpg" title="James Ward speaking on Heroku at Devoxx by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7147/6448349163_313bc48dd5_t.jpg" width="100" height="67" alt="James Ward speaking on Heroku at Devoxx" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7031/6448350561_e62da3327b.jpg" title="Speaking at Devoxx Belgium 2011 by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7031/6448350561_e62da3327b_t.jpg" width="100" height="67" alt="Matt Raible speaking at Devoxx Belgium 2011" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7033/6448349735_724255267d.jpg" title="Audience at Matt Raible's Presentation Devoxx Belgium by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7033/6448349735_724255267d_m.jpg" width="240" height="160" alt="Audience at Matt Raible's Presentation Devoxx Belgium" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
That evening, we had dinner with the Java Posse crew and James Ward before heading to the &lt;a href="http://www.eventbrite.com/event/2412608176"&gt;Devoxx Party @ Noxx&lt;/a&gt;.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7142/6448352559_4f174e1ef2.jpg" title="Devoxx Party @ Noxx by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7142/6448352559_4f174e1ef2_m.jpg" width="240" height="160" alt="Devoxx Party @ Noxx"&gt;&lt;/a&gt;
  &lt;/a&gt;
&lt;p&gt;Yes, we had an &lt;em&gt;awesome&lt;/em&gt; time at Devoxx. I was pleased with the positive response from my talk and learned a bunch from the few talks I attended. Thanks to &lt;a href="http://www.devoxx.com/display/DV11/Stephan+Janssen"&gt;Stephan&lt;/a&gt; for inviting me and organizing one of the best conferences I've ever attended. For our last night in Antwerp, we dined at &lt;a href="http://www.colvenier.be"&gt;Huis De Colvenier&lt;/a&gt; and especially enjoyed our aperitif in the 19th-century wine cellar. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7174/6448357007_e82fb698d0.jpg" title="Huis De Colvenier by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7174/6448357007_e82fb698d0_s.jpg" width="75" height="75" alt="Huis De Colvenier" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7163/6448359619_308fc759f4.jpg" title="Huis De Colvenier by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7163/6448359619_308fc759f4_s.jpg" width="75" height="75" alt="Huis De Colvenier" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7158/6448359091_4b5b208b03.jpg" title="Huis De Colvenier by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7158/6448359091_4b5b208b03_s.jpg" width="75" height="75" alt="Huis De Colvenier" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7016/6448358515_442949d73a.jpg" title="Huis De Colvenier by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7016/6448358515_442949d73a_s.jpg" width="75" height="75" alt="Huis De Colvenier" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;&lt;/p&gt;
  
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7010/6448353693_f63f7afee6.jpg" title="Riverside in Antwerp by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7010/6448353693_f63f7afee6_m.jpg" width="240" height="160" alt="Riverside in Antwerp" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7142/6448355157_16f8487f6b.jpg" title="Antwerp Town Square by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7142/6448355157_16f8487f6b_m.jpg" width="240" height="160" alt="Antwerp Town Square" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7167/6402213569_f85e26e390.jpg" title="Mmmm, Belgium Beer..." rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7167/6402213569_f85e26e390_m.jpg" width="240" height="180" alt="Mmmm, Belgium Beer..." style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7005/6402214003_8b8b48210a.jpg" title="We love Belgian Beer" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7005/6402214003_8b8b48210a_m.jpg" width="240" height="180" alt="We love Belgian Beer" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paris and Beyond&lt;/strong&gt;&lt;br/&gt;
This brings us to my favorite part of this story. I was pretty stressed leading up to our departure to Devoxx because I had so many deadlines. I had a deadline with my &lt;a href="http://www.taleo.com"&gt;current client&lt;/a&gt; to finish up some features before I left, I had to finish my Devoxx presentation (and app developed for the talk) and I had a secret deadline to finish my proposal to Trish. That's right, I was planning on proposing marriage to my dream girl. I mean, we &lt;em&gt;were&lt;/em&gt; going to the diamond capital of the world (Antwerp) and one of Earth's most romantic cities (Paris). It seemed like the perfect opportunity to ask her to marry me. We did some ring shopping before we left Denver, but she didn't realize I had purchased one before we left.
&lt;/p&gt;
&lt;p&gt;We're both big music fans, so I decided months earlier that I would propose with lines from songs we both liked. Of course, I waited until the last minute to compose my prose, but I did finish it before we left for Europe. However, with all the Devoxx shenanigans, I didn't have time to memorize my proposal. Instead, I recorded it using the "Voice Memos" on my iPhone. I did this in the wee hours of the morning on Friday, while I was watching the Broncos game on the internet.&lt;/p&gt;
&lt;p&gt;Saturday afternoon, we traveled to Paris via Thalys and checked into &lt;a href="http://www.thewestinparis.com"&gt;our hotel&lt;/a&gt; around sunset. When we stepped outside an hour later, I remember saying to Trish, "the Eiffel Tower looks pretty small, I thought it'd be bigger". After walking for a bit, it turned from small to big to huge. My plan that night was to propose on the tower. As Trish snapped pictures along our walk, I was taking out the piece of paper I had the proposal printed on and trying to memorize it. As you can imagine, I had to to this stealthily and by the time we reached the Eiffel Tower, I had enough memorized to propose. We arrived around midnight and were disappointed to find it was closed. This terminated my proposal plans for that night, but we still enjoyed the sparkling tower lights and took several pictures.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;

&lt;a href="http://farm8.staticflickr.com/7151/6448365073_8c7ccbe6c9.jpg" title="The Eiffel Tower by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7151/6448365073_8c7ccbe6c9_m.jpg" width="160" height="240" alt="The Eiffel Tower" style="border: 1px solid black"&gt;&lt;/a&gt;

&lt;a href="http://farm8.staticflickr.com/7028/6448364697_4c9270ea9b.jpg" title="The Eiffel Tower by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7028/6448364697_4c9270ea9b_m.jpg" width="160" height="240" alt="The Eiffel Tower" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;The next day, Sunday, we traveled to the &lt;a href="http://www.chateauversailles.fr"&gt;Ch&amp;#226;teau de Versailles&lt;/a&gt;. This was a recommendation from my good friend Eric, who had recently traveled to Paris with his wife, Heather. In fact, I owe a lot to Eric. He recommended we extend our trip to Paris (he'd traveled there disgruntled about not doing a beach vacation, then fell in love with the city) and suggested a number of great locations to visit. He also recommended proposing in the &lt;a href="http://en.wikipedia.org/wiki/Gardens_of_Versailles"&gt;Gardens of Versailles&lt;/a&gt;, a very romantic location according to him. I had this in the back of my mind as we did an audio tour through the Palace of Versailles. As we ventured out into the Orangerie, I started hatching a plan to get Trish down to the gardens and try to rent bikes. We both love biking and the outdoors, so I figured it'd be a nice way to spend our memorable moment. As we strolled closer and I didn't see bikes to rent, I spotted the &lt;a href="http://en.chateauversailles.fr/discover-the-estate/the-gardens/the-copses/the-grand-canal"&gt;Grand Canal&lt;/a&gt; and noticed they had row boats. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7009/6402228135_6ffc860b9f.jpg" title="The Versailles Orangerie" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7009/6402228135_6ffc860b9f_t.jpg" width="100" height="75" alt="The Versailles Orangerie" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7141/6402228667_2e908c6fb0.jpg" title="Château de Versailles" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7141/6402228667_2e908c6fb0_t.jpg" width="100" height="75" alt="Château de Versailles" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7161/6402229087_0d34f8f6f9.jpg" title="Gardens of Versailles" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7161/6402229087_0d34f8f6f9_t.jpg" width="100" height="75" alt="Gardens of Versailles" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7023/6402230475_9251f0664c.jpg" title="Trees in the Versailles Gardens" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7023/6402230475_9251f0664c_t.jpg" width="100" height="75" alt="Trees in the Versailles Gardens" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm8.staticflickr.com/7166/6448369805_70a43560c4.jpg" title="Bassin d’Apollon – the Apollo Fountain by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7166/6448369805_70a43560c4.jpg" width="500" height="329" alt="Bassin d’Apollon – the Apollo Fountain"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;When we first arrived at the boat dock, there was a long line, but it magically disappeared moments later. We stepped into the boat, rowed to the center of the canal and paused for a bit to take in the beautiful day and the setting sun. Trish asked me to row to a better spot so she could photograph the sunset, but instead I said "here, listen to this" and handed her my headphones. I pressed play and watched her face light up as she heard my voice in her ears. 90 seconds later, I asked "Trish McGinity, will you marry me?" She responded with, "Of course!" &lt;img src="http://raibledesigns.com/images/smileys/smile.gif" class="smiley" alt=":)" title=":)" /&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm7.staticflickr.com/6031/6402231033_9a0f51938c.jpg" title="Happy" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm7.staticflickr.com/6031/6402231033_9a0f51938c_m.jpg" width="240" height="180" alt="Happy" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;a href="http://farm8.staticflickr.com/7018/6402232723_e61d57cc98.jpg" title="Versailles Sunset" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7018/6402232723_e61d57cc98_m.jpg" width="240" height="180" alt="Versailles Sunset" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The rest of our trip in Paris was quite romantic and fun. We decided to wait until we got back to The States before telling anyone we were engaged. This meant we had three days of just us, Paris and some of the most beautiful art in the world. We explored the &lt;a href="http://www.louvre.fr/"&gt;Louvre&lt;/a&gt; for 5-hours on Monday, marveling at the low-rider on display near the entrance and all the famous paintings. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7024/6402234449_bf1626c667.jpg" title="Trish and the Louvre" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7024/6402234449_bf1626c667_t.jpg" width="100" height="75" alt="Trish and the Louvre" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7010/6402234835_7dfaf7a3cf.jpg" title="At The Louvre" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7010/6402234835_7dfaf7a3cf_t.jpg" width="100" height="75" alt="At The Louvre" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7006/6402235203_4c9bfb2ed9.jpg" title="Lowrider in the Louvre" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7006/6402235203_4c9bfb2ed9_t.jpg" width="100" height="75" alt="Lowrider in the Louvre" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
  &lt;a href="http://farm8.staticflickr.com/7164/6402236533_2b3f167978.jpg" title="Liberty Leading the People" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7164/6402236533_2b3f167978_t.jpg" width="100" height="75" alt="Liberty Leading the People" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm8.staticflickr.com/7030/6448378195_4fc8401b21.jpg" title="Louvre by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7030/6448378195_4fc8401b21.jpg" width="500" height="329" alt="Louvre" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
We imbibed in $40 martinis at &lt;a href="http://www.ritzparis.com/restaurant/the-hemingway-bar/introduction.html,1,96,8,0,0"&gt;The Hemingway Bar&lt;/a&gt; and scarfed down some delicious pizza at &lt;a href="http://www.tripadvisor.com/Restaurant_Review-g187147-d1337490-Reviews-Gambino-Paris_Ile_de_France.html"&gt;Gambino's&lt;/a&gt;. We had breakfast at &lt;a href="http://www.tripadvisor.com/Restaurant_Review-g187147-d695078-Reviews-Angelina-Paris_Ile_de_France.html"&gt;Angelina's&lt;/a&gt;, toured &lt;a href="http://en.wikipedia.org/wiki/Sainte-Chapelle"&gt;La Sainte-Chapelle&lt;/a&gt;, hiked up &lt;a href="http://en.wikipedia.org/wiki/Arc_de_Triomphe"&gt;Arc de Triomphe&lt;/a&gt; and wandered through the shopping districts Champs-&amp;#201;lys&amp;#233;es and Faubourg St-Honor&amp;#233;. Yes, we fell in love with Paris and can't wait to return for &lt;a href="http://blogs.oracle.com/java/entry/the_big_announcement_this_year"&gt;Devoxx France&lt;/a&gt; in April.
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm8.staticflickr.com/7014/6448383039_39040a534f.jpg" title="Arc de Triumph by McGinity Photo" rel="lightbox[engagingparis]"&gt;&lt;img src="http://farm8.staticflickr.com/7014/6448383039_39040a534f.jpg" width="500" height="333" alt="Arc de Triumph" style="border: 1px solid black"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;We departed Paris on the Wednesday morning before Thanksgiving and arrived in Boston that evening. We spent the next three days with Trish's family and our good friends, Chris, Julie, Lili and Wes. We did a 5K Turkey Trot on Thursday morning, followed by football watching and eating succulent turkey while basking in everyone's joy for us. We smiled, giggled, laughed, guffawed, smiled some more and had an all-around great time the rest of the weekend. 
&lt;/p&gt;
&lt;p&gt;
We returned home on Sunday evening, departing Boston's Logan airport only minutes after the Broncos kicked a field goal in overtime to beat the Chargers. Our flight was delayed just long enough (3 hours) that we got to watch almost the whole game. It was the perfect ending to a phenomenal trip.
  &lt;/p&gt;
&lt;p&gt;To see more pictures from this adventure, see Trish's &lt;a href="http://www.mcginityphoto.com/Other/MattandTrishengagementPhotos"&gt;fantastic photos&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/mraible/sets/72157628152146737/"&gt;mine on Flickr&lt;/a&gt;.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=94582444&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=94582444&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=94582444 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/my_html5_with_play_scala</guid><title>My HTML5 with Play Scala, CoffeeScript and Jade Presentation from Devoxx 2011</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/my_html5_with_play_scala</link><pubDate>Fri, 18 Nov 2011 11:18:38 -0700</pubDate><category>Java</category><category>devoxx</category><category>devoxx2011</category><category>video</category><category>coffeescript</category><category>presentation</category><category>html5</category><category>jade</category><category>playframework</category><category>scala</category><description>This week, I had the pleasure of traveling to one of my favorite places in the world: Antwerp, Belgium. Like &lt;a href="http://raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam"&gt;last year&lt;/a&gt;, I traveled with the lovely &lt;a href="http://mcginityphoto.com"&gt;Trish McGinity&lt;/a&gt; and spoke at &lt;a href="http://www.devoxx.com/display/DV11/Home"&gt;Devoxx 2011&lt;/a&gt;. This year, my talk was on developing a web/mobile app with HTML5, Play, Scala, CoffeeScript and Jade. I was inspired to learn Scala at the beginning of this year and added CoffeeScript and Jade to my learning list after talking to James Strachan at TSSJS 2011. You can read more about how my journey began in my &lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;first post about learning these technologies&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;I started developing with these technologies in August and wrote about my learnings throughout the process. Last week, while writing my presentation, I decided it'd be fun to make my presentation into more of a story-telling-session than a learn-about-new-technologies session. To do this, I focused on talking a bit about the technologies, but more about my experience learning them. I also came up with a challenging idea: create a video that showed the development process, how hard it was to test the app and (hopefully) my success in getting it to work.&lt;/p&gt;
&lt;p&gt;It was all a very close call, but I'm happy to say I pulled it off! I got the app to work on an iPhone (&lt;a href="http://raibledesigns.com/rd/entry/phonegap_to_the_rescue"&gt;thanks to PhoneGap&lt;/a&gt;) last Saturday, finished the first draft of my presentation on Sunday night (after pulling an all-nighter) and finished editing the demo video on Wednesday night. My talk was on Thursday afternoon and I had a blast talking about my experience to such a large, enthusiastic audience. You can see the presentation below, &lt;a href="http://www.slideshare.net/mraible/html5-with-play-scala-coffeescript-and-jade-devoxx-2011"&gt;on Slideshare&lt;/a&gt; or &lt;a href="http://static.raibledesigns.com/repository/presentations/HTML5_with_Play_Scala_CoffeeScript_and_Jade_Devoxx2011.pdf"&gt;download the PDF&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/10204272?rel=0" width="510" height="426" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;You can find the "demo" for this talk &lt;a href="http://www.youtube.com/watch?v=bBqtPPfM2xQ"&gt;on YouTube&lt;/a&gt; or watch it below.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;iframe width="510" height="289" src="http://www.youtube.com/embed/bBqtPPfM2xQ?rel=0&amp;amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;One of the reasons I really enjoyed this talk is it only represents one milestone in my learning process. I plan on continuing to develop this application and learning more about HTML5, Scala, Play and CoffeeScript and Scalate/Jade. Now that &lt;a href="http://raibledesigns.com/rd/entry/play_2_0_a_web"&gt;Play 2.0 Beta has been released&lt;/a&gt;, I plan on upgrading to it and leveraging its native CoffeeScript and LESS support. I hope to continue using &lt;a href="http://scalate.fusesource.org/"&gt;Scalate&lt;/a&gt; and its &lt;a href="http://scalate.fusesource.org/documentation/jade.html"&gt;Jade&lt;/a&gt; format. And it's very likely &lt;a href="http://phonegap.com/"&gt;PhoneGap&lt;/a&gt; will continue to be &lt;em&gt;the bridge&lt;/em&gt; that allows everything to run in the background.&lt;/p&gt;
&lt;p&gt;I've been talking with the &lt;a href="www.jfokus.se/"&gt;Jfokus&lt;/a&gt; folks about doing this talk in Sweden in Feburary and &lt;a href="http://devoxx.fr"&gt;Devoxx France&lt;/a&gt; about presenting there in April. 
&lt;/p&gt;
&lt;p&gt;Learning all these technologies has been a challenging, but fun experience so far. As the last slide in my presentation says, I encourage you to do something similar. Pick something new to learn, have fun doing it, but more importantly - get out there and &lt;em&gt;Play!&lt;/em&gt;&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=94016559&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=94016559&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=94016559 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/deploying_java_and_play_framework</guid><title>Deploying Java and Play Framework Apps to the Cloud with James Ward</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/deploying_java_and_play_framework</link><pubDate>Fri, 18 Nov 2011 08:14:45 -0700</pubDate><category>Java</category><category>maven</category><category>jamesward</category><category>scala</category><category>playframework</category><category>heroku</category><category>springroo</category><category>sbt</category><category>java</category><description>Yesterday, I attended &lt;a href="http://www.jamesward.com/"&gt;James Ward&lt;/a&gt;'s presentation on &lt;a href="http://www.devoxx.com/pages/viewpage.action?pageId=5015973"&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="http://heroku.com"&gt;Heroku&lt;/a&gt;. Below are my notes from James's talk.
&lt;/p&gt;
&lt;p&gt;When I arrived, James was doing a demo using &lt;a href="http://www.springsource.org/spring-roo"&gt;Spring Roo&lt;/a&gt;. He was using Roo's Petclinic sample app and showed us how you could use Git to create a local repository of the new project and install Heroku'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="http://devcenter.heroku.com/articles/cedar"&gt;Cedar Stack&lt;/a&gt; is what supports Java, Scala and Play Framework. It'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 "electric-sword-8877" 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'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'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'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's HTTP endpoint made requests to both dynos. The logging is powered by &lt;a href="https://github.com/heroku/logplex"&gt;Logplex&lt;/a&gt; and you can read about how it works in the article &lt;a href="http://blog.heroku.com/archives/2010/12/13/logging/"&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's just the jetty-runner setup as described in &lt;a href="http://devcenter.heroku.com/articles/spring-mvc-hibernate"&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's Management infrastructure has APIs that these tools talk too. Heroku hasn't built autoscaling into the platform because they don'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're working on native Grails and Gradle support. There's currently 534,374 apps running on Heroku.
&lt;/p&gt;
&lt;p&gt;
Heroku is a cloud application platform and there'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'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 "slug" file&lt;/li&gt;
&lt;li&gt;Heroku starts a "dyno"&lt;/li&gt;
&lt;li&gt;Heroku copies the "slug" to the "dyno"&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'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's very easy to get started and use. Once you extend past one dyno, it's
  $.05 per dyno hour, which works out to around $30/month.

It'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="http://www.scalatest.org/"&gt;Scalatest&lt;/a&gt; is running on Heroku. It has one dyno and is doing fine with that. Bill Venners doesn't have to pay anything for it.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://java.herokuapp.com"&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'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'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="http://memcached.org/"&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="http://www.playframework.org/"&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'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 "young-night-7104" 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'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 'stage' task.
It currently does not support Lift because Lift uses an older version of SBT and because it's a very stateful framework that would require sticky sessions. Use Play, &lt;a href="https://github.com/jdegoes/blueeyes"&gt;BlueEyes&lt;/a&gt; or &lt;a href="http://www.scalatra.org/"&gt;Scalatra&lt;/a&gt; if you want Scala on Heroku.
&lt;/p&gt;
&lt;p&gt;Heroku has &lt;a href="http://addons.heroku.com"&gt;addons&lt;/a&gt; for adding functionality to your application, including Custom DNS, HTTPS, Amazon RDS, NoSQL and many more. They're also working on making their add-on and management APIs available via Java, so you'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 "your bash command"&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's talk because he's a good friend, but also because I've been using Heroku to host &lt;a href="http://raibledesigns.com/rd/entry/phonegap_to_the_rescue"&gt;my latest adventures with Play, Scala, CoffeeScript and Jade&lt;/a&gt;. I'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's been really nice to have instant deployments using Git. In fact, I've created a 'push' alias so I can push to my project's repo and heroku at the same time.
&lt;/p&gt;
&lt;pre&gt;
alias push='git push origin master &amp;&amp; git push heroku master'
&lt;/pre&gt;
&lt;p&gt;I'd like to see more organizations embrace something like Heroku for developers. It'd be great if everyone had their own sandbox that business owners and product managers could see. I can'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's &lt;a href="http://www.devoxx.com/pages/viewpage.action?pageId=5015952"&gt;What's in store for Scala?&lt;/a&gt; and &lt;a href="http://www.devoxx.com/display/DV11/WWW++World+Wide+Wait++A+Performance+Comparison+of+Java+Web+Frameworks"&gt;WWW: World Wide Wait? A Performance Comparison of Java Web Frameworks&lt;/a&gt;. The WWW talk has &lt;a href="http://prezi.com/dr3on1qcajzw/www-world-wide-wait-devoxx-edition/"&gt;posted their presentation&lt;/a&gt; but I'm sure it'd be more fun to watch. 
&lt;/p&gt;
&lt;p&gt;
It's pretty awesome that all the talks from Devoxx 2011 will be up on &lt;a href="http://www.parleys.com/"&gt;Parleys.com&lt;/a&gt; soon.

&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=94016558&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=94016558&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=94016558 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/phonegap_for_hybrid_app_development</guid><title>PhoneGap for Hybrid App Development</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/phonegap_for_hybrid_app_development</link><pubDate>Wed, 16 Nov 2011 10:22:16 -0700</pubDate><category>The Web</category><category>adobe</category><category>ios</category><category>android</category><category>phonegap</category><category>javascript</category><description>This afternoon, I attended &lt;a href="http://brian.io" title="Brian LeRoux"&gt;Brian LeRoux&lt;/a&gt;'s talk on &lt;a href="http://www.devoxx.com/display/DV11/PhoneGap+for+Hybrid+App+Development"&gt;PhoneGap for Hybrid App Development&lt;/a&gt; at Devoxx. You might remember that I &lt;a href="http://raibledesigns.com/rd/entry/phonegap_to_the_rescue"&gt;tried PhoneGap last week&lt;/a&gt; and really enjoyed my experience. Below are my notes from Brian's talk.
&lt;/p&gt;
&lt;p&gt;
PhoneGap is a project for creating native applications using HTML, CSS and JavaScript. PhoneGap started out as a hack. In 2007, Apple shipped the iPhone and Steve Jobs told everyone they should develop webapps. PhoneGap started in 2008 as a lofty summertime hack and gained traction as a concept at Nitobi with Android and Blackberry implementations in the fall. In 2009, people started to pay attention when PhoneGap got rejected by Apple. They added Symbian and webOS support and Sony Ericsson started contributing to the project. They got rejected because all PhoneGap-developed apps were named "PhoneGap". This turned out to be good press for the project and Apple let them in shortly after.
&lt;/p&gt;
&lt;p&gt;
In 2010, IBM began tag-teaming with Nitobi and added 5 developers to the project after meeting them at OSCON. In 2011, RIM started contributing as well as Microsoft. Then Adobe bought the company, so they're obviously contributing.
&lt;/p&gt;
&lt;p&gt;PhoneGaps Goals: the web is a first class platform, so let people create installable web apps. Their second goal is to cease to exist and get browsers to adopt their model.
&lt;/p&gt;
&lt;p&gt;
PhoneGap is NOT a runtime or a compiler/transpiler. It's not an IDE or predefined framework or proprietary lockin. It's Apache, MIT and BSD licensed to guarantee it's as free as free software gets. You can do whatever you want to do with it. PhoneGap has &lt;a href="http://arstechnica.com/open-source/news/2011/10/phonegap-to-become-an-apache-project-as-adobe-acquires-nitobi.ars"&gt;recently been contributed to the Apache Software Foundation&lt;/a&gt;.
&lt;/p&gt;
As far as Adobe vs. PhoneGap is concerned, the Nitobi team remains contributors to PhoneGap. Adobe is a software tools company and has Apache and WebKit contributors. PhoneGap/Build integration will be added to &lt;a href="http://www.adobe.com/products/creativecloud.html"&gt;Creative Cloud&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
The biggest issues with contributing PhoneGap to Apache is renaming the project and source control. I'm not sure why it needs to be renamed, but it's likely that &lt;em&gt;Apache Callback&lt;/em&gt; is out. There seems to be some consensus on Apache Cordova. Apache likes SVN and the PhoneGap community currently uses Git. They're trying to find a medium road there, but would prefer to stay on Git.
&lt;/p&gt;
&lt;p&gt;
The PhoneGap technique is colloquially called "the bridge". It's a 3 step process: they instantiate a WebView, then they call JavaScript from native code, then they call native code from JavaScript. Apparently, all device APIs are available via JavaScript in a WebView.
&lt;/p&gt;
&lt;p&gt;The primary platforms supported are iOS &gt;= 3, Android &gt;= 1.5 and BlackBerry &gt;= 5.x. They also support webOS, Symbian, Samsung Bada and Windows Phone. No mobile dev platform supports as many deploy targets as PhoneGap. Primary contributors are Adobe, IBM, RIM and Microsoft. 
&lt;/p&gt;
&lt;p&gt;Documentation for PhoneGap is available at &lt;a href="http://docs.phonegap.com"&gt;http://docs.phonegap.com&lt;/a&gt;. Device APIs for PhoneGap 1.0 included sensors, data and outputs, which all devices have. Examples of sensors are geolocation and camera. Data examples are the filesystem, contacts and media. Outputs are screens, speakers and the speaker jack. All PhoneGap APIs are plugins, but any native API is permitted. 
&lt;/p&gt;
&lt;p&gt;
What about security? Brian recommends looking at the &lt;a href="http://html5sec.org"&gt;HTML5 Security Cheatsheet&lt;/a&gt;. PhoneGap has added a lot of security measures since they've found the native API pretty much opens up everything. 
&lt;/p&gt;
&lt;p&gt;
PhoneGap doesn't bundle a UI framework, but they support any JavaScript framework that works in the browser. PhoneGap is just a fancy browser, so your code run in less fancy web browsers too. This means you can develop and test your app in your desktop browser and only use PhoneGap to package and distribute your app.
&lt;/p&gt;
&lt;p&gt;Competition? PhoneGap has no competition. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://build.phonegap.com/"&gt;PhoneGap/Build&lt;/a&gt; is for compiling your apps in the cloud and free for open source projects. The biggest reason they did this is because they couldn't redistribute all the SDKs and it was a pain for developers to download and install SDKs in training classes.
&lt;/p&gt;
&lt;p&gt;
For mobile app development, you should have a singular goal. Do one thing really well if you want to be successful. Great UX happens iteratively. You know that the web works and has been widely successfully cross-platform. It's likely you've already invested in the web. Start by building a mobile web client and use PhoneGap as a progressive enhancement technique. 
&lt;/p&gt;
&lt;p&gt;
Shipping and unit testing should be a daily activity. Automate everything so you can have one-click builds (test/dev/release). For web client design, constraints are your ally in the battle against complexity and "clients who are not &lt;em&gt;chill&lt;/em&gt;". Phones suck and consume a lot: cpu, ram, bandwidth, battery, network... everything! Start with a benchmark of app performance and monitor that benchmark. If you have tons and tons of features, consider splitting into multiple apps.
&lt;/p&gt;
The mobile web is not WebKit! Opera is huge, Firefox is making strides and IE still happens. For layouts: use flex-box rules (anyone got a link to these?), css media queries and meta tags for viewport. You should try to develop your app without frameworks because they come with a ton of code and can effect the size of your app.
&lt;/p&gt;
&lt;p&gt;
Looks can kill: aesthetics that can hurt performance: border-radius, box-shadow and gradients can slow down your apps. Chances are, you really don't need these features. Design your app for your brand, not for the device manufacturer. An app that looks like an iPhone app on Android doesn't give a positive impression.&lt;/p&gt;
&lt;p&gt;
For JavaScript libraries, start with your problem, not a generic solution like Sencha or jQuery Mobile. &lt;a href="http://zeptojs.com/"&gt;Zepto&lt;/a&gt; and its older brother &lt;a href="http://xuijs.com/"&gt;XUI&lt;/a&gt; are all you need to start. &lt;a href="http://joapp.com/"&gt;Jo&lt;/a&gt; is a fantastic option. &lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone&lt;/a&gt; and &lt;a href="http://spinejs.com/"&gt;Spine&lt;/a&gt; are worth watching.
&lt;/p&gt;
&lt;p&gt;
For testing, &lt;a href="http://docs.jquery.com/QUnit"&gt;QUnit&lt;/a&gt; and &lt;a href="http://pivotal.github.com/jasmine/"&gt;Jasmine&lt;/a&gt; are pretty popular. For deployment, concat, minify and obfuscate your JavaScript and CSS. Or you can inline everything into the markup to minimize HTTP chatter. Gmail inlines and comments all their JavaScript and then evals it.
&lt;/p&gt;
&lt;p&gt;From there, Brian recommended leveraging HTML5's &lt;a href="http://www.html5rocks.com/en/tutorials/appcache/beginner/"&gt;AppCache&lt;/a&gt; and and using RESTful JSON endpoints for legacy systems. Next, he tried to show us a demo of a photo sharing application. Unfortunately, the Demo Gods were grumpy and Brian couldn't get his computer to recognize his Android phone. He did show us the &lt;a href="http://gist.github.com/1219277"&gt;client code&lt;/a&gt; and it's pretty impressive you can use 1 line of code to take a picture on a phone.
&lt;/p&gt;
&lt;p&gt;The last thing we looked at was &lt;a href="http://debug.phonegap.com"&gt;debug.phonegap.com&lt;/a&gt;. This is an app that's powered by &lt;a href="http://phonegap.github.com/weinre/"&gt;weinre&lt;/a&gt;. It lets you enter a line of JavaScript in your client and then remotely debug it in a tool that looks like Chrome's Web Inspector. Very cool stuff if you ask me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
I really enjoyed learning more about PhoneGap, particularly because Brain emphasized all my web development skills can be used. I don't have to learn Objective-C or Android to develop native apps and I don't even have to install an SDK if I use PhoneGap/Build. Of course, my mobile developer friends might disagree with this approach. In the meantime, I look forward to using PhoneGap to turn my mobile web clients into native apps and finding out if it's really as good as they say it is.
&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93957553&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93957553&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93957553 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/play_2_0_a_web</guid><title>Play 2.0, A web framework for a new era</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/play_2_0_a_web</link><pubDate>Wed, 16 Nov 2011 05:58:09 -0700</pubDate><category>Java</category><category>devoxx2011</category><category>devoxx</category><category>akka</category><category>playframework</category><category>scala</category><description>This week, I'm in Antwerp, Belgium for the annual &lt;a href="http://devoxx.com"&gt;Devoxx&lt;/a&gt; conference. After traveling 21 hours door-to-door yesterday, I woke up and came to the conference to attend some talks on Play and PhoneGap. I just got out of the &lt;a href="http://devoxx.com/display/DV11/Play+2.0%2C+a+Web+framework+for+a+new+era"&gt;session on Play 2.0&lt;/a&gt;, which was presented by &lt;a href="http://devoxx.com/display/DV11/Sadek+Drobi"&gt;Sadek Drobi&lt;/a&gt; and &lt;a href="http://devoxx.com/display/DV11/Guillaume+Bort"&gt;Guillaume Bort&lt;/a&gt;. Below are my notes from this presentation.&lt;/p&gt;
&lt;p&gt;The Play 2.0 beta is out! You can read more about this release &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/6d5783e28efb6931"&gt;on the mailing list&lt;/a&gt;. This beta includes native support for both Scala and Java, meaning you can use both in the same project. The release also bundles &lt;a href="http://akka.io/"&gt;Akka&lt;/a&gt; and &lt;a href="https://github.com/harrah/xsbt/wiki"&gt;SBT&lt;/a&gt; by default.
&lt;/p&gt;
&lt;p&gt;In other news, &lt;a href="http://blog.typesafe.com/typesafe-stack-adds-play-framework"&gt;Play 2.0 is now part of the Typesafe Stack&lt;/a&gt;. Typesafe is the Scala company, started by the founder of Scala (&lt;a href="http://ch.linkedin.com/in/odersky"&gt;Martin Odersky&lt;/a&gt;) and the founder of Akka (&lt;a href="http://se.linkedin.com/in/jonasboner"&gt;Jonas Bonér&lt;/a&gt;). Guillaume is also joining the Typesafe Advisory Board.
&lt;/p&gt;
&lt;p&gt;Sadek and Guillaume both work at &lt;a href="http://www.zenexity.com/"&gt;zenexity&lt;/a&gt;, where Play is the secret weapon for the web applications they've built for the last decade. Play was born in the real world. They kept listening to the market to see what they should add to the project. At some point, they realized they couldn't keep adding to the old model and they needed to create something new.&lt;/p&gt;
&lt;p&gt;
The web has evolved from static pages to dynamic pages (ASP, PHP). From there, we moved to structured web applications with frameworks and MVC. Then the web moved to Ajax and long-polling to more real-time, live features.  And this changes everything.
&lt;/p&gt;
&lt;p&gt;
Now we need to adapt our tools. We need to handle tremendous flows of data. Need to improve expressiveness for concurrent code. We need to pick the appropriate datastore for the problem (not only SQL). We need to integrate with rapidly-evolving client side technologies like JavaScript, CoffeeScript, and Dart. We need to use elastic deployment that allows scaling up and scaling down.&lt;/p&gt;
&lt;p&gt;zenexity wanted to integrated all of these modern web needs into Play 2.0. But they also wanted to keep Play approachable. They wanted to maintain fast turnaround so you can change your code and hit reload to see the changes. They wanted to keep it as a full stack framework with support for JSON, XML, Web Services, Jobs, etc. And they wanted to continue to use and conventions over configuration.
&lt;/p&gt;
&lt;p&gt;At this point, Guillaume did a Play 2.0 Beta demo, show us how it uses SBT and has a console so everything so it runs really fast. You can have both Scala and Java files in the same project. Play 2.0 templates are based on Scala, but you don't need to know Scala to use them. You might have to learn how to write a for loop in Scala, but it's just a subset of Scala for templates and views. SBT is used for the build system, but you don't have to learn or know SBT. All the old &lt;code&gt;play&lt;/code&gt; commands still work, they're just powered by a different system.
&lt;/p&gt;
&lt;p&gt;After the demo, Sadek took over and started discussing the key features of Play 2.0.
&lt;/p&gt;
&lt;p&gt;
To handle tremendous amounts of data, you need to do chunking of data and be able to process a stream of data, not just wait until it's finished. Java's InputStream is outdated and too low level. Its &lt;em&gt;read()&lt;/em&gt; method reads the next byte of data from the input and this method can block until input data is available.&lt;/p&gt;
&lt;p&gt;
To solve this, Play includes a reactive programming feature, which they borrowed from Haskell. It uses Iteratee/Enumerator IO and leverages inversion of control (not like dependency injection, but more like not micro-managing). The feature allows you to have control when you need it so you don't have to wait for the input stream to complete. The Enumerator is the component that sends data and the Iteratee is the component that receives data. The Iteratee does incremental processing and can tell the Enumerator when it's done. The Iteratee can also send back a continuation, where it tells the Enumerator it wants more data and how to give it. With this paradigm, you can do a lot of cool stuff without consuming resources and blocking data flow.
&lt;/p&gt;
&lt;p&gt;
Akka is an actor system that is a great model for doing concurrent code. An Actor could be both an Enumerator and an Iteratee. This vastly improves the expressiveness for concurrent code. For example, here's how you'd use Akka in Play:
&lt;pre class="brush: scala"&gt;
def search(keyword: String) = Action {
  AsyncResult {
    // do something with result
  }
}
&lt;/pre&gt;
&lt;p&gt;
Play does not try to abstract data access because datastores are different now. You don't want to think of everything as objects if you're using something like MongoDB or navigating a Social Graph. Play 2.0 will provide some default modules for the different datastores, but they also expect a lot of contributed modules. Anorm will be the default SQL implementation for Play Scala and &lt;a href="https://github.com/playframework/Play20/wiki/JavaEbean"&gt;Ebean&lt;/a&gt; will be the default ORM implementation for Play Java. The reason they've moved away from Hibernate is because they needed something that was more stateless.
&lt;/p&gt;
&lt;p&gt;
On the client side, there's so many technologies (LESS, CoffeeScript, DART, Backbone.js, jQuery, SASS), they didn't want to bundle any because they move too fast. Instead, there's plugins you can add that help you leverage these technologies. There's a lot of richness you can take advantage of on the client side and you need to have the tools for that.&lt;/p&gt;
&lt;p&gt;Lastly, there's a new type of deployment: container-less deployment to the cloud. Akka allows you to distribute your jobs across many servers and &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt; is an implementation of elastic deployment that has built-in support for Play.
&lt;/p&gt;
&lt;p&gt;
They've explained what they tried to design and the results of this new, clean architecture have been suprising. Side effects include: type-safety everywhere for rock-solid applications. There's an awesome performance boost from Scala. There's easier integration with existing projects via SBT. And it only takes 10 lines of code to develop an HTTP Server that responds to web requests.
&lt;p&gt;The memory consumption is amazing: only 2MB of heap is used when a Play 2.0 app is started. Tests on Guillaume's laptop have shown that it can handle up to 40,000 requests per second, without any optimization of the JVM. Not only that, but after the requests subside, garbage collection cleans up everything and reduces the memory consumption back to 2MB.
&lt;/p&gt;
&lt;p&gt;At this point, Guillaume did another demo, showing how everything is type-safe in 2.0, including the routes file. If you mistype (or comment one out) any routes, the compiler will find it and notify you. Play 2.0 also contains a &lt;em&gt;compiled assets&lt;/em&gt; feature. This allows you to &lt;a href="https://github.com/playframework/Play20/wiki/AssetsGoogleClosureCompiler"&gt;use Google's Closure Compiler&lt;/a&gt;, &lt;a href="https://github.com/playframework/Play20/wiki/AssetsCoffeeScript"&gt;CoffeeScript&lt;/a&gt; and &lt;a href="https://github.com/playframework/Play20/wiki/AssetsLess"&gt;LESS&lt;/a&gt;. If you put your LESS files in &lt;em&gt;app/assets/stylesheets&lt;/em&gt;, compilation errors will show up in your browser. If you put JavaScript files in &lt;em&gt;app/assets/javascripts&lt;/em&gt;, the Closure compiler will be used and compilation errors will show up in your browser.
&lt;/p&gt;
&lt;p&gt;
Play 2.0 ships with 3 different sample applications, all implemented in both Java and Scala. HelloWorld is more than just text in a browser, it includes a form that shows how validation works. Another app is computer-database. When Guillaume started it, we saw how evolutions were used to create the database schema from the browser. The Play Team has done their best to make the development process a browser-based experience rather than having to look in your console. The computer-database is a nice example of how to do CRUD and leverages Twitter's Bootstrap for its look and feel.
&lt;/p&gt;
The last sample application is zentasks. It uses Ajax and implements security so you can see how to create a login form. It uses LESS for CSS and CoffeeScript and contains features like in-place editing. If you'd like to see any of these applications in action, you can stop by the Typesafe booth this week at Devoxx.
&lt;/p&gt;
&lt;p&gt;Unfortunately, there will be no migrating path for Play 1.x applications. The API seems very similar, but there are subtle changes that make this difficult. The biggest thing is how templating has changed from Groovy to Scala. To migrate from 1.2.x would be mostly a copy/paste, modify process. There are folks working on getting Groovy templates working in 2.0. The good news is zenexity has hundreds of 1.x applications in production, so 1.x will likely be maintained for many years.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
This was a great talk on what's new in Play 2.0. I especially like the native support for LESS and CoffeeScript and the emphasis on trying to keep developers using two tools: their editor and the browser. The sample apps look great, but the documentation look sparse. I doubt I'll get a chance to migrate my Play 1.2.3 app to 2.0 this month, but I hope to try migrating sometime before the end of the year.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93957552&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93957552&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93957552 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/phonegap_to_the_rescue</guid><title>PhoneGap to the Rescue!</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/phonegap_to_the_rescue</link><pubDate>Mon, 14 Nov 2011 16:32:19 -0700</pubDate><category>Java</category><category>html5</category><category>devoxx2011</category><category>phonegap</category><category>apple</category><category>ios</category><description>This is the 7th article in a series about my adventures developing a web application with HTML5, Play Scala, CoffeeScript and Jade. Previous articles can be found at:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;Integrating Scalate and Jade with Play 1.2.3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work"&gt;Trying to make CoffeeScript work with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"&gt;Integrating HTML5 Boilerplate with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and"&gt;Developing with HTML5, CoffeeScript and Twitter's Bootstrap&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/play_scala_s_anorm_heroku"&gt;Play Scala's Anorm, Heroku and PostgreSQL Issues&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/more_scalate_goodness_for_play"&gt;More Scalate Goodness for Play&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

A few weeks ago, I wrote about &lt;a href="http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and"&gt;Developing a Stopwatch and Trip Meter with HTML5&lt;/a&gt;. I mentioned I'd run into a major issue when I discovered HTML5 Geo's &lt;span style="font-family: monaco; courier"&gt;watchPosition()&lt;/span&gt; feature didn't run in the background. From that article:
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
  I tried out the trip meter that night evening
    on a bike ride and noticed it said I'd traveled 3 miles when I'd really gone 6. I quickly figured out it was only calculating
    start point to end point and not taking into account all the turns in between. To view what was happening, I integrated my
    odometer.coffee with my map using &lt;a href="http://code.google.com/apis/maps/documentation/javascript/overlays.html#Polylines" style="color: #666"&gt;
    Google Maps Polylines&lt;/a&gt;. Upon finishing the integration, I discovered two things, 1) HTML5 geolocation was highly inaccurate and
    2) &lt;a href="http://stackoverflow.com/questions/7676423/is-it-possible-to-make-an-html5-trip-meter-that-tracks-distance-traveled/7681295" style="color: #666"&gt;geolocation doesn't run in the background&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
At the time, I opted to ignore this issue and use my app by setting Auto-Lock to never. This worked, but if I happened to bump my phone while exercising, the app would get closed. Not to mention it really drained the battery and seemed to crash every-so-often.
&lt;/p&gt;
&lt;p&gt;Last week, I realized things were getting down to the wire and I was running out of time to finish my app's functionality for my &lt;a href="http://www.devoxx.com/display/DV11/HTML5+with+Play+Scala%2C+CoffeeScript+and+Jade"&gt;Devoxx Talk&lt;/a&gt;. On Wednesday afternoon, I asked my office-mates (2 iOS developers) about developing a native app and installing it on my phone. They told me I had to be a iOS Certified Developer ($99/year) or jailbreak my iPhone to get an app on it. On Thursday, I downloaded &lt;a href="http://phonegap.com"&gt;PhoneGap&lt;/a&gt; and installed &lt;a href="http://developer.apple.com/xcode/"&gt;Xcode 4&lt;/a&gt;. As you can tell from the following image, PhoneGap seemed to be exactly what I was looking for. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://phonegap.com" title="PhoneGap"&gt;&lt;img src="http://farm7.static.flickr.com/6055/6345056529_d814790e75.jpg" width="500" height="232" alt="PhoneGap"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I spent some time going through PhoneGap's &lt;a href="http://phonegap.com/start"&gt;Getting Started Guide&lt;/a&gt; and was able to get my app in a short amount of time. I was able to copy my app's generated HTML into my project's &lt;em&gt;www&lt;/em&gt; directory and launch the app in the iOS Simulator. The only change I had to make was to convert my inline CoffeeScript (that used coffee-script.js for in-browser compilation) to JavaScript. It's possible the in-browser compiler works, but when things didn't work and I didn't see any error messages, it was the first thing I changed.
&lt;/p&gt;
&lt;p&gt;  
For getting the app onto a phone for testing, I opted for the easiest route and applied for an iOS Developer Account on Thursday afternoon. While waiting for approval on Friday, I briefly tried to jailbreak my phone, but encountered all kinds of version issues and gave up after 30 minutes. 24 hours after I applied for my account, Apple emailed asking for a business document to prove I was legit. I was unable to download any from the &lt;a href="http://www.sos.state.co.us/"&gt;Colorado Secretary of State&lt;/a&gt; that were &lt;em&gt;e-certified&lt;/em&gt;, so expeditiously switched my application from a business account to an individual one. Apple was great in helping me out before the weekend started and I had everything I needed as we drove to our &lt;a href="http://raibledesigns.com/rd/entry/another_dream_realized_mountain_views"&gt;Ski Shack&lt;/a&gt; on Friday evening. 
&lt;/p&gt;
&lt;p&gt;On Friday night, I upgraded Trish's iPhone 4 to iOS 5 to make sure I had the latest and greatest platform for my app. Saturday morning, I woke up around 8 and started trying to figure out how to get my app on her phone. It took about an hour of fumbling, grumbling and searching to figure out how to do this. All the while, the troops were getting restless, noting that they were hungry for breakfast and groaning about Daddy taking so long. At 9:30, I finally got my PhoneGap app installed on Trish's phone and we drove to breakfast at &lt;a href="http://www.tripadvisor.com/Restaurant_Review-g33431-d382122-Reviews-Sharky_s-Fraser_Colorado.html"&gt;Sharkey's&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;  
I started the app when we left and checked it 5 minutes later when we arrived for breakfast. The blood drained from my face when I saw the app had drawn a straight line from our condo to the breakfast joint. We had taken several turns along the way and my new native app ignored them all. I assumed I had failed and my talk's conclusion at Devoxx would be "You can't develop a reliable Fitness Tracker app with HTML5". However, after a delicious Eggs Benedict, I became determined to succeed and returned home for some more hacking.
&lt;/p&gt;
&lt;p&gt;This is when I discovered Joel Dare's &lt;a href="http://www.joeldare.com/wiki/play_an_mp3_audio_stream_in_phonegap"&gt;Play an MP3 Audio Stream in PhoneGap&lt;/a&gt; tutorial and the "Required background modes" key. This was the knowledge that saved the day and I anxiously added the key and the values to get location updates and allow audio to run in the background. 
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm7.static.flickr.com/6040/6345880496_62808c5075_b.jpg" title="Required Background Modes" rel="lightbox[phonegap]"&gt;&lt;img src="http://farm7.static.flickr.com/6040/6345880496_62808c5075.jpg" width="500" height="258" alt="Required Background Modes" style="border: 1px solid black"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Saturday afternoon, I strapped on my recently purchased &lt;a href="http://gopro.com/"&gt;GoPro Camera&lt;/a&gt;, shot some video for my demo at Devoxx and had a blast skiing with Abbie, Jack and Trish. I celebrated that evening with an executive workout (15 minutes each in hot tub, sauna and steam room) at the &lt;a href="http://www.fraservalleyrec.org/"&gt;Fraser Rec Center&lt;/a&gt; and again on Sunday when the Broncos whooped the Kansas City Chiefs &lt;a href="http://raibledesigns.com/rd/entry/an_awesome_trip_to_amsterdam"&gt;just like last year&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;Last night, I stayed up late to put the finishing touches on my Devoxx presentation. Now I'm sitting at the Red Carpet Club in Chicago's O'Hare getting ready to depart for Belgium. It's been a fun journey learning about HTML5, Scala, Play, CoffeeScript and Jade. If you're at Devoxx this week, I think I've got a presentation you're really going to like. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";-)" title=";-)" /&gt;
  &lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93873758&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93873758&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93873758 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/more_scalate_goodness_for_play</guid><title>More Scalate Goodness for Play</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/more_scalate_goodness_for_play</link><pubDate>Mon, 7 Nov 2011 14:07:40 -0700</pubDate><category>Java</category><category>scalate</category><category>devoxx2011</category><category>scala</category><category>jade</category><category>playframework</category><description>&lt;a href="http://scalate.fusesource.org"&gt;&lt;img src="http://scalate.fusesource.org/images/project-icon-160x160.png" width="80" height="80" alt="Scalate" class="picture" style="border: 0"/&gt;&lt;/a&gt;
This article is the 6th in a series on about my adventures developing a web application with HTML5, Play Scala, CoffeeScript and Jade. Previous articles can be found at:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;Integrating Scalate and Jade with Play 1.2.3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work"&gt;Trying to make CoffeeScript work with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"&gt;Integrating HTML5 Boilerplate with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and"&gt;Developing with HTML5, CoffeeScript and Twitter's Bootstrap&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/play_scala_s_anorm_heroku"&gt;Play Scala's Anorm, Heroku and PostgreSQL Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Last week, I wrote about my adventures with &lt;a href="http://scala.playframework.org/documentation/scala-0.9.1/anorm"&gt;Anorm&lt;/a&gt; and mentioned I'd made some improvements to Scalate Play interoperability. First of all, I've been using a Scalate trait and ScalateTemplate class to render Jade templates in my application. I described this setup in my &lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;first article on Scalate and Play&lt;/a&gt;. 
&lt;/p&gt;
&lt;p id="default-variables"&gt;&lt;strong&gt;Adding SiteMesh Features and Default Variables&lt;/strong&gt;&lt;br/&gt;  
When I started making my app look good with CSS, I started longing for a feature I've used in SiteMesh. That is, to have a body id or class that can identify the page and allow per-page CSS rules. To do this with SiteMesh, you'd have something like the following in your page:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;  
&amp;lt;body id="signup"/&gt;
&lt;/pre&gt;
&lt;p&gt;  
And then read it in your decorator:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;body&lt;decorator:getProperty property="body.id" writeEntireProperty="true"/&gt;&amp;lt;decorator:getProperty property="body.class" writeEntireProperty="true"/&gt;&gt;
&lt;/pre&gt;
&lt;p&gt;As I started looking into how to do this, I came across Play Scala's &lt;a href="https://github.com/playframework/play-scala/blob/master/src/play/mvc/ScalaController.scala"&gt;ScalaController&lt;/a&gt; and how it was populating Play's default variables (request, response, flash, params, etc.). Based on this newfound knowledge, I added a &lt;em&gt;populateRenderArgs()&lt;/em&gt; method to set all the default variables and my desired &lt;em&gt;bodyClass&lt;/em&gt; variable.
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
def populateRenderArgs(args: (Symbol, Any)*): Map[String, Any] = {
  val renderArgs = Scope.RenderArgs.current();

  args.foreach {
    o =&gt;
      renderArgs.put(o._1.name, o._2)
  }

  renderArgs.put("session", Scope.Session.current())
  renderArgs.put("request", Http.Request.current())
  renderArgs.put("flash", Scope.Flash.current())
  renderArgs.put("params", Scope.Params.current())
  renderArgs.put("errors", validationErrors)
  renderArgs.put("config", Play.configuration)

  // CSS class to add to body
  renderArgs.put("bodyClass", Http.Request.current().action.replace(".", " ").toLowerCase)
  renderArgs.data.toMap
}

implicit def validationErrors:Map[String,play.data.validation.Error] = {
  import scala.collection.JavaConverters._
  Map.empty[String,play.data.validation.Error] ++ 
    Validation.errors.asScala.map( e =&gt; (e.getKey, e) )
}
&lt;/pre&gt;&lt;p&gt;After adding this method, I was able to access these values in my templates by defining them at the top:
&lt;/pre&gt;
&lt;pre class="brush: scala"&gt;
-@ val bodyClass: String 
-@ val params: play.mvc.Scope.Params
-@ val flash: play.mvc.Scope.Flash
&lt;/pre&gt;
&lt;p&gt;And then reading their values in my template:
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
body(class=bodyClass)
...
- if (flash.get("success") != null) {
  div(class="alert-message success" data-alert="alert")
    a(class="close" href="#") &amp;&amp;times;
    | #{flash.get("success")}
- }
...
  fieldset
    legend Leave a comment &amp;rarr;
    div.clearfix
      label(for="author") Your name:
      input(type="text" name="author" class="xlarge" value={params.get("author")})
    div.clearfix
      label(for="content") Your message:
      textarea(name="content" class="xlarge") #{params.get("content")}
    div.actions
      button(type="submit" class="btn primary") Submit your comment
      button(type="reset" class="btn") Cancel
&lt;/pre&gt;  
&lt;p&gt;For a request like Home/index, the body tag is now rendered as:
&lt;pre class="brush: xml; toolbar: false"&gt;
&amp;lt;body class="home index"&gt;
&lt;/pre&gt;
This allows you to group CSS styles by Controller names as well as by method names.
&lt;/p&gt;
&lt;p&gt;
Next, I started developing forms and validation logic. I quickly discovered I needed an &lt;em&gt;action()&lt;/em&gt; method like the one defined in &lt;a href="https://github.com/playframework/play-scala/blob/master/src/play/templates/ScalaTemplate.scala"&gt;ScalaTemplate's&lt;/a&gt; TemplateMagic class. 
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
def action(action: =&gt; Any) = {
  new play.mvc.results.ScalaAction(action).actionDefinition.url
}
&lt;/pre&gt;
&lt;p&gt;
Since TemplateMagic is an inner class, I determined that copying the method into my ScalateTemplate class was the easiest workaround. After doing this, I was able to import the method and use it in my templates.
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
-import controllers.ScalateTemplate._
...
form(method="post" class="form-stacked" id="commentForm"
     action={action(controllers.Profile.postComment(workout._1.id()))})
&lt;/pre&gt;
&lt;p&gt;After getting the proper URL written into my form's action attribute, I encountered a new problem. The &lt;a href="http://scala.playframework.org/documentation/scala-0.9.1/guide4#aAddingvalidationa"&gt;Play Scala Tutorial explains validation flow&lt;/a&gt; as follows:
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
if (Validation.hasErrors) {
  show(postId)
} else {
  Comment.create(Comment(postId, author, content))
  Action(show(postId))
}
&lt;/pre&gt;
&lt;p&gt;However, when I had validation errors, I end up with the following error:
&lt;/p&gt;
&lt;pre&gt;
Could not load resource: [Timeline/postComment.jade]
&lt;/pre&gt;&lt;p&gt;To fix this, I added logic to my Scalate trait that looks for a "template" variable before using &lt;em&gt;Http.Request.current().action.replace(".", "/")&lt;/em&gt; for the name. After making this change, I was able to use the following code to display validation errors.&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
if (Validation.hasErrors) {
  renderArgs.put("template", "Timeline/show")
  show(postId)
} else {
  Comment.create(Comment(postId, author, content))
  Action(show(postId))
}
&lt;/pre&gt;
&lt;p&gt;Next, I wanted to give child pages the ability to set content in parent pages. With SiteMesh, I could use the &amp;lt;content&amp;gt; tag as follows:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;content tag="underground"&gt;
  HTML goes here
&amp;lt;/content&gt;
&lt;/pre&gt;
&lt;p&gt;This HTML could then be retrieved in the decorator using the &amp;lt;decorator:getProperty&amp;gt; tag:
&lt;/p&gt;
&lt;pre class="brush: xml; toolbar: false"&gt;
&amp;lt;decorator:getProperty property="page.underground"/&gt;
&lt;/pre&gt;
&lt;p&gt;With Scalate, I found it equally easy using the &lt;em&gt;captureAttribute()&lt;/em&gt; method. For example, here's how I captured a list of an athlete's workouts for display in a sidebar.
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
- captureAttribute("sidebar")
  - Option(older).filterNot(_.isEmpty).map { workouts =&gt;
    .older-workouts
      h3
        | Older workouts
        span.from from this app
      - workouts.map { workout =&gt;
        - render("workout.jade", Map('workout -&gt; workout, 'mode -&gt; "teaser"))
      - }
  - }
- }
&lt;/pre&gt;
&lt;p&gt;Then in my layout, I was able to retrieve this and display it. Below is a snippet from the layout I'm using (copied from &lt;a href="http://twitter.github.com/bootstrap/examples/container-app.html"&gt;Twitter's Bootstrap example&lt;/a&gt;). You can see how the sidebar is included in the .span4 at the end.
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
-@ val sidebar: String = ""
...
.container
  .content
    .page-header
      h1
        = pageHeader
        small
          = pageTagline
    .row
      .span10
        !~~ body
      .span4
        = unescape(sidebar)
  footer
&lt;/pre&gt;
&lt;p id="view-vs-render"&gt;&lt;strong&gt;View vs. Render in Scalate&lt;/strong&gt;&lt;br/&gt;
In the sidebar code above, you might notice the &lt;em&gt;render()&lt;/em&gt; call. This is the &lt;a href="http://scalate.fusesource.org/documentation/user-guide.html#Render_templates"&gt;Scalate version of server-side includes&lt;/a&gt;. It works well, but there's also a &lt;a href="http://scalate.fusesource.org/documentation/user-guide.html#Views"&gt;&lt;em&gt;view()&lt;/em&gt; shortcut&lt;/a&gt; you can use if you want to have templates for rendering your model objects. I quickly discovered it might be difficult to use this feature in my app because my object was &lt;em&gt;Option[(models.Workout, models.Athlete, Seq[models.Comment])]&lt;/em&gt; instead of a simple object. You can read the &lt;a href="http://groups.google.com/group/scalate/browse_thread/thread/bcc6059fc08d4da0"&gt;view vs. render thread&lt;/a&gt; on the Scalate Google Group if you're interested in learning more.
&lt;/p&gt;
&lt;p id="scalate-plugin"&gt;&lt;strong&gt;Scalate as a Module&lt;/strong&gt;&lt;br/&gt;
The last enhancement I attempted to make was to put Scalate support into a &lt;a href="http://www.playframework.org/documentation/1.2.3/modules"&gt;Play module&lt;/a&gt;. At first, I tried overriding Play's &lt;em&gt;Template&lt;/em&gt; class but &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/8d1b00ec4304f4ea"&gt;ran into compilation issues&lt;/a&gt;. Then Guillaume Bort (Play's lead developer) recommended I stick with the trait approach and I was able to get everything working. I looked at the &lt;a href="https://github.com/pk11/play-scalate"&gt;outdated play-scalate module&lt;/a&gt; to figure out how to add Scala support to build.xml and copied its &lt;a href="https://github.com/pk11/play-scalate/blob/master/resources/500.scaml"&gt;500.scaml&lt;/a&gt; page for error reporting.&lt;/p&gt;
&lt;p&gt;In order to get line-precise error reporting working, I had to wrap a try/catch around calling Scalate's &lt;em&gt;TemplateEngine.layout()&lt;/em&gt; method. Again, most of this code was copied from the outdated play-scalate module.
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
case class Template(name: String) {
  
  def render(args: (Symbol, Any)*) = {
    val argsMap = populateRenderArgs(args: _*)
    
    val buffer = new StringWriter()
    var context = new DefaultRenderContext(name, scalateEngine, new PrintWriter(buffer))
    
    try {
      val templatePath = new File(Play.applicationPath+"/app/views","/"+name).toString
        .replace(new File(Play.applicationPath+"/app/views").toString,"")
      scalateEngine.layout(templatePath + scalateType, argsMap)
    } catch {
      case ex:TemplateNotFoundException =&gt; {
        if(ex.isSourceAvailable) {
          throw ex
        }
        val element = PlayException.getInterestingStrackTraceElement(ex)
        if (element != null) {
           throw new TemplateNotFoundException(name, 
             Play.classes.getApplicationClass(element.getClassName()), element.getLineNumber());
        } else {
           throw ex
        }
      }  
      case ex:InvalidSyntaxException =&gt; handleSpecialError(context,ex)
      case ex:CompilerException =&gt; handleSpecialError(context,ex)
      case ex:Exception =&gt; handleSpecialError(context,ex)
    } finally {
      if (buffer.toString.length &gt; 0)
        throw new ScalateResult(buffer.toString,name)
    }
  }
}
...
private def handleSpecialError(context:DefaultRenderContext,ex:Exception) {
  context.attributes("javax.servlet.error.exception") = ex
  context.attributes("javax.servlet.error.message") = ex.getMessage
  try {
    scalateEngine.layout(scalateEngine.load(errorTemplate), context)
  } catch {
    case ex:Exception =&gt;
      // TODO use logging API from Play here...
      println("Caught: " + ex)
      ex.printStackTrace
  }
}

private def errorTemplate:String = {
  val fullPath = new File(Play.applicationPath,"/app/views/errors/500.scaml").toString 
  fullPath.replace(new File(Play.applicationPath+"/app/views").toString,"")
}
&lt;/pre&gt;
&lt;p&gt;Once I had this in place, error messages from Scalate are much better. Not only do I see the error in my browser, but I can click on the offending line to open it directly in TextMate.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
&lt;a href="http://farm7.static.flickr.com/6054/6323523392_91888694bc_o.png" title="Play Scalate Error Reporting" rel="lightbox[scalate-goodness]"&gt;&lt;img src="http://farm7.static.flickr.com/6054/6323523392_affe4cf053.jpg" width="500" height="290" alt="Play Scalate Error Reporting"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;I've published my &lt;a href="https://github.com/mraible/play-scalate"&gt;play-scalate module on GitHub&lt;/a&gt; so others can try it out. To give it a whirl, add the following to your dependencies.yml:
&lt;/p&gt;
&lt;pre&gt;
    - upgrades -&gt; play-scalate 0.1

repositories:
    - upgrades:
        type: http
        artifact: "http://static.raibledesigns.com/[module]-[revision].zip"
        contains:
            - upgrades -&gt; *
&lt;/pre&gt;&lt;p&gt;Then add &lt;em&gt;with play.modules.scalate.Scalate&lt;/em&gt; to your controllers and call the &lt;em&gt;render()&lt;/em&gt; method.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
After using Scalate and Play for almost 3 months, I'm really enjoying the combination. When I first integrated Scalate with a simple trait, the error messages were always in the console. Now that I've borrowed some smarts from Play's ScalaController and play-scalate's error reporting, I feel like it's practically a built-in solution. I was easily able to integrate my desired SiteMesh features and it even allows &lt;a href="http://groups.google.com/group/scalate/browse_thread/thread/f6df5b165024407e"&gt;reusable template blocks&lt;/a&gt;. In the end, it's just Scala and Scalate does a good job of allowing you to leverage that.&lt;/p&gt;
&lt;p&gt;Other thoughts:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you're writing a lot of Jade and familiar with HTML, Don Park's &lt;a href="https://github.com/donpark/html2jade"&gt;html2jade&lt;/a&gt; is a great tool that comes with Scalate support.&lt;/li&gt;
&lt;li&gt;I'm really enjoying writing CSS with &lt;a href="http://lesscss.org/"&gt;LESS&lt;/a&gt;, particularly the ability to nest rules and have programming features. The only issue I've seen is IntelliJ's LESS plugin only does code-completion for variables rather than CSS values.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://www.packtpub.com/play-framework-cookbook/book"&gt;Play Framework Cookbook&lt;/a&gt; is a great reference for learning how to write modules. Not only does it explain how to create modules, it has some great real-world examples for doing bytecode enhancement, implementing message queues, using Solr and how to do production monitoring.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this series of articles has intrigued you and you'll be at &lt;a href="http://www.devoxx.com/display/DV11/Home"&gt;Devoxx&lt;/a&gt; next week, you should stop by &lt;a href="http://www.devoxx.com/display/DV11/HTML5+with+Play+Scala%2C+CoffeeScript+and+Jade"&gt;my talk on Thursday afternoon&lt;/a&gt;. In addition, there's several other Play talks at Devoxx and a possible meetup on Wednesday. Check out the &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/eaef08eb36f9eb0a"&gt;Devoxx, anyone?&lt;/a&gt; thread for more information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: There's one thing I forgot to mention about the Play Scalate Module. When I had Scalate integrated in my app with a trait, I only included the scalate-core and scalate-util JARs in dependencies.yml:&lt;/p&gt;
&lt;pre&gt;
- org.fusesource.scalate -&gt; scalate-core 1.5.2-scala_2.8.1:
    transitive: false
- org.fusesource.scalate -&gt; scalate-util 1.5.2-scala_2.8.1:
    transitive: false
&lt;/pre&gt;&lt;p&gt;However, when I created the play-scalate module, I allowed more dependencies.&lt;/p&gt;
&lt;pre&gt;
- org.fusesource.scalate -&gt; scalate-core 1.5.2-scala_2.8.1:
    exclude:
        - javax.servlet -&gt; *
        - com.sun.jersey -&gt; *
        - org.osgi -&gt; *
- org.fusesource.scalate -&gt; scalate-util 1.5.2-scala_2.8.1
&lt;/pre&gt;Because Scalate depends on &lt;a href="http://logback.qos.ch/"&gt;Logback&lt;/a&gt;, debug messages started showing up in my console. To fix this, I created &lt;em&gt;conf/logback.xml&lt;/em&gt; in my project and filled it with the following XML.
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
&amp;lt;configuration&amp;gt;
  &amp;lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&amp;gt;
      &amp;lt;encoder&amp;gt;
          &amp;lt;pattern&amp;gt;%msg%n&amp;lt;/pattern&amp;gt;
      &amp;lt;/encoder&amp;gt;
  &amp;lt;/appender&amp;gt;

  &amp;lt;root level="info"&amp;gt;
    &amp;lt;appender-ref ref="STDOUT" /&amp;gt;
  &amp;lt;/root&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This reduces the logging and allows me to increase Scalate's logging if I ever have the need.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93647712&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93647712&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93647712 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/new_macbook_pro_and_imac</guid><title>New MacBook Pro and iMac</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/new_macbook_pro_and_imac</link><pubDate>Sun, 6 Nov 2011 18:10:17 -0700</pubDate><category>Mac OS X</category><category>developerhappiness</category><category>hardware</category><category>imac</category><category>macbookpro</category><category>apple</category><description>Almost a month ago, I wrote about how I was hoping to &lt;a href="http://raibledesigns.com/rd/entry/increasing_my_developer_happiness"&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="http://www.apple.com/retail/aspengrove/"&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="http://eshop.macsales.com/shop/turnkey/iMac_2011/UpgradeInstall"&gt;OWC'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'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'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's the 3rd time in a row I've experienced buying an Apple laptop and returning it shortly after for a newer one. My &lt;a href="http://raibledesigns.com/rd/entry/new_15_macbook_pro_with"&gt;last laptop purchase&lt;/a&gt; (March 2009) and Trish's 13" MacBook Pro (in March) were the first two.&lt;/p&gt;
&lt;p&gt;I'm writing this post to thank Apple for having such great customer service. I've been very close to experiencing buyer'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 "being such a great business customer".&lt;/p&gt;
&lt;p&gt;Thanks Apple, &lt;em&gt;you rock!&lt;/em&gt;&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93612797&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93612797&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93612797 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/happy_9th_birthday_abbie</guid><title>Happy 9th Birthday Abbie!</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/happy_9th_birthday_abbie</link><pubDate>Sat, 5 Nov 2011 18:05:58 -0600</pubDate><category>General</category><category>abbie</category><category>happybirthday</category><description>&lt;a href="http://farm7.static.flickr.com/6095/6316701930_497c198ab0.jpg" title="Abbie and I on her 9th Birthday" rel="lightbox[abbies9th]"&gt;&lt;img src="http://farm7.static.flickr.com/6095/6316701930_497c198ab0_m.jpg" width="160" height="240" alt="Abbie and I on her 9th Birthday" class="picture"&gt;&lt;/a&gt;
Today we celebrated &lt;a href="http://www.flickr.com/photos/mraible/sets/72157628061855540"&gt;Abbie's 9th Birthday&lt;/a&gt;. It's hard to believe how grown up she is, but easy to love her. We had a blast celebrating with lots of her classmates and even had a magician thanks to a hookup from &lt;a href="http://www.linkedin.com/in/gregostravich"&gt;Greg Ostravich&lt;/a&gt;. Julie got her a super cute outfit for the party and smiles were shared throughout the afternoon.
&lt;/p&gt;
&lt;p&gt;Last year on Abbie's birthday is when Trish met Abbie and Jack for the first time. It's been a year and we're all still having a blast and living life to its fullest. We'll be celebrating our &lt;em&gt;Kids met Trish Anniversary&lt;/em&gt; at the DU Hockey game tonight. A great day celebrating with great people ... I couldn't be happier. &lt;img src="http://raibledesigns.com/images/smileys/smile.gif" class="smiley" alt=":)" title=":)" /&gt;
&lt;/p&gt;
&lt;p&gt;To see Abbie on her birthday through the years, checkout my past Happy Birthday posts: &lt;a href="http://raibledesigns.com/rd/date/20031105"&gt;#1&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/date/20051105"&gt;#3&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/date/20061105"&gt;#4&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/date/20071105"&gt;#5&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/entry/happy_birthday_abbie4"&gt;#6&lt;/a&gt;, &lt;a href="http://raibledesigns.com/rd/entry/happy_birthday_abbie5"&gt;#7&lt;/a&gt; and &lt;a href="http://raibledesigns.com/rd/entry/abbie_s_8th_birthday_and"&gt;#8&lt;/a&gt;.
&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93586657&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93586657&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93586657 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/play_scala_s_anorm_heroku</guid><title>Play Scala's Anorm, Heroku and PostgreSQL Issues</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/play_scala_s_anorm_heroku</link><pubDate>Wed, 2 Nov 2011 11:54:25 -0600</pubDate><category>Java</category><category>scala</category><category>anorm</category><category>playframework</category><category>postgresql</category><category>heroku</category><category>devoxx2011</category><description>&lt;a href="http://scala.playframework.org"&gt;&lt;img src="http://scala.playframework.org/public/images/logo-scala.png" width="158" height="50" alt="Play Scala" class="picture" style="border: 0" /&gt;&lt;/a&gt;
This article is the 5th in a series on about my adventures developing a Fitness Tracking application for &lt;a href="http://www.devoxx.com/display/DV11/HTML5+with+Play+Scala%2C+CoffeeScript+and+Jade"&gt;my talk at Devoxx&lt;/a&gt; in two weeks. Previous articles can be found at:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;Integrating Scalate and Jade with Play 1.2.3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work"&gt;Trying to make CoffeeScript work with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"&gt;Integrating HTML5 Boilerplate with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and"&gt;Developing with HTML5, CoffeeScript and Twitter's Bootstrap&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p id="anorm"&gt;&lt;strong&gt;Anorm&lt;/strong&gt;&lt;br/&gt;In my &lt;a href="http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and"&gt;previous article&lt;/a&gt;, I described how I created my application's features using CoffeeScript and make it look good using Twitter's Bootstrap. Next, I turned to persisting this data with &lt;a href="http://scala.playframework.org/documentation/scala-0.9.1/anorm"&gt;Anorm&lt;/a&gt;.&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
The Scala module includes a brand new data access layer called Anorm that uses plain SQL to make your database request and provides several API to parse and transform the resulting dataset.
&lt;/p&gt;
&lt;p&gt;I'm a big fan of ORMs like Hibernate and JPA, so having to learn a new JDBC abstraction wasn't exactly appealing at first. However, since &lt;a href="http://groups.google.com/group/play-framework/msg/b4b92f8b085c1bbf"&gt;Anorm is the default for Play Scala&lt;/a&gt;, I decided to try it. The easiest way for me to learn Anorm was to start coding with it. I used &lt;a href="http://scala.playframework.org/documentation/scala-0.9.1/guide2"&gt;A first iteration for the data model&lt;/a&gt; as my guide and created model objects, companion objects that extended Magic (appropriately named) and wrote some tests using &lt;a href="http://www.scalatest.org/"&gt;scalatest&lt;/a&gt;. I started with an "Athlete" model since I knew "User" was a keyword in PostgreSQL and &lt;a href="http://devcenter.heroku.com/articles/database"&gt;that's what Heroku uses for its database&lt;/a&gt;.
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
package models

import play.db.anorm._
import play.db.anorm.defaults._

case class Athlete(
  id: Pk[Long],
  email: String, password: String, firstName: String, lastName: String
  ) {
}

object Athlete extends Magic[Athlete] {
  def connect(email: String, password: String) = {
    Athlete.find("email = {email} and password = {password}")
      .on("email" -&gt; email, "password" -&gt; password)
      .first()
  }

  def apply(firstName: String) = new Athlete(NotAssigned, null, null, firstName, null)
}
&lt;/pre&gt;
&lt;p&gt;Then I wrote a couple tests for it in test/Tests.scala. &lt;/p&gt;
&lt;pre class="brush: scala"&gt;
import play._
import play.test._

import org.scalatest._
import org.scalatest.junit._
import org.scalatest.matchers._

class BasicTests extends UnitFlatSpec with ShouldMatchers with BeforeAndAfterEach {

  import models._
  import play.db.anorm._

  override def beforeEach() {
      Fixtures.deleteDatabase()
  }

  it should "create and retrieve a Athlete" in {

      var athlete = Athlete(NotAssigned, "jim@gmail.com", "secret", "Jim", "Smith")
      Athlete.create(athlete)

      val jim = Athlete.find(
          "email={email}").on("email" -&gt; "jim@gmail.com"
      ).first()

      jim should not be (None)
      jim.get.firstName should be("Jim")

  }

  it should "connect a Athlete" in {

      Athlete.create(Athlete(NotAssigned, "bob@gmail.com", "secret", "Bob", "Johnson"))

      Athlete.connect("bob@gmail.com", "secret") should not be (None)
      Athlete.connect("bob@gmail.com", "badpassword") should be(None)
      Athlete.connect("tom@gmail.com", "secret") should be(None)
  }
&lt;/pre&gt;
&lt;p&gt;At this point, everything was fine and dandy. I could run "play test", open http://localhost/@tests in my browser and run the tests to see a beautiful shade of green on my screen. I continued following the tutorial, substituting "Post" with "Workout" and added Comments too. The Workout object shows some of the crazy-ass syntax that is Anorm getting fancy with Scala. 
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
object Workout extends Magic&amp;#91;Workout&amp;#93; {

  def allWithAthlete: List&amp;#91;(Workout, Athlete)&amp;#93; =
    SQL(
      """
          select * from Workout w
          join Athlete a on w.athlete_id = a.id
          order by w.postedAt desc
      """
    ).as(Workout ~&amp;lt; Athlete ^^ flatten *)

  def allWithAthleteAndComments: List&amp;#91;(Workout, Athlete, List&amp;#91;Comment&amp;#93;)&amp;#93; =
    SQL(
      """
          select * from Workout w
          join Athlete a on w.athlete_id = a.id
          left join Comment c on c.workout_id = w.id
          order by w.postedAt desc
      """
    ).as(Workout ~&amp;lt; Athlete ~&amp;lt; Workout.spanM(Comment) ^^ flatten *)

  def byIdWithAthleteAndComments(id: Long): Option&amp;#91;(Workout, Athlete, List&amp;#91;Comment&amp;#93;)&amp;#93; =
    SQL(
      """
          select * from Workout w
          join Athlete a on w.athlete_id = a.id
          left join Comment c on c.workout_id = w.id
          where w.id = {id}
      """
    ).on("id" -&amp;gt; id).as(Workout ~&amp;lt; Athlete ~&amp;lt; Workout.spanM(Comment) ^^ flatten ?)
}
&lt;/pre&gt;
&lt;p&gt;All of these methods return &lt;a href="http://codemonkeyism.com/tuples-scala-goodness/"&gt;Tuples&lt;/a&gt;, which is quite different from an ORM that returns an object that you call methods on to get its related items. Below is an example of how this is referenced in a Scalate template:
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
-@ val workout:(models.Workout,models.Athlete,Seq[models.Comment])
-
  var commentsTitle = "No Comments"
  if (workout._3.size &gt; 0)
    commentsTitle = workout._3.size + " comments, lastest by " + workout._3(workout._3.size - 1).author
  
div(class="workout")
  h2.title
    a(href={action(controllers.Profile.show(workout._1.id()))}) #{workout._1.title}
  .metadata
    span.user Posted by #{workout._2.firstName} on
    span.date #{workout._1.postedAt}
    .description
      = workout._1.description
&lt;/pre&gt;
&lt;p id="heroku"&gt;&lt;strong&gt;Evolutions on Heroku&lt;/strong&gt;&lt;br/&gt;
I was happy with my progress until I tried to deploy my app to Heroku. I added &lt;code&gt;db=${DATABASE_URL}&lt;/code&gt; to my application.conf as recommended by &lt;a href="http://devcenter.heroku.com/articles/database-driven-play-apps"&gt;Database-driven web apps with Play! on Heroku/Cedar&lt;/a&gt;. However, when I deployed, it failed because my database tables weren't created.
&lt;/p&gt; 
&lt;pre&gt;
2011-10-05T04:08:52+00:00 app[web.1]: 04:08:52,712 WARN  ~ Your database is not up to date.
2011-10-05T04:08:52+00:00 app[web.1]: 04:08:52,712 WARN  ~ Use `play evolutions` command to manage database evolutions.
2011-10-05T04:08:52+00:00 app[web.1]: 04:08:52,713 ERROR ~
2011-10-05T04:08:52+00:00 app[web.1]:
2011-10-05T04:08:52+00:00 app[web.1]: @681m15j3l
2011-10-05T04:08:52+00:00 app[web.1]: Can't start in PROD mode with errors
2011-10-05T04:08:52+00:00 app[web.1]:
2011-10-05T04:08:52+00:00 app[web.1]: Your database needs evolution!
2011-10-05T04:08:52+00:00 app[web.1]: An SQL script will be run on your database.
2011-10-05T04:08:52+00:00 app[web.1]:
2011-10-05T04:08:52+00:00 app[web.1]: play.db.Evolutions$InvalidDatabaseRevision
&lt;/pre&gt;
&lt;p&gt;With &lt;a href="http://www.jamesward.com/"&gt;James Ward&lt;/a&gt;'s help, I learned I needed to use "heroku run" to apply &lt;a href="http://www.playframework.org/documentation/1.2.3/evolutions"&gt;evolutions&lt;/a&gt;. So I ran the following command:
&lt;/p&gt;
&lt;pre&gt;
heroku run "play evolutions:apply --%prod" 
&lt;/pre&gt;
&lt;p&gt;Unfortunately, this failed:
&lt;/p&gt;
&lt;pre&gt;
Running play evolutions:apply --%prod attached to terminal... up, run. 
5 
~        _            _ 
~  _ __ | | __ _ _  _| | 
~ | '_ \| |/ _' | || |_| 
~ |  __/|_|\____|\__ (_) 
~ |_|            |__/ 
~ 
~ play! 1.2.3, http://www.playframework.org 
~ framework ID is prod 
~ 
Oct 17, 2011 7:05:46 PM play.Logger warn 
WARNING: Cannot replace DATABASE_URL in configuration (db=$ 
{DATABASE_URL}) 
Exception in thread "main" java.lang.NullPointerException 
        at play.db.Evolutions.main(Evolutions.java:54)
&lt;/pre&gt;
&lt;p&gt;After opening a ticket with Heroku support, I learned this was because DATABASE_URL was not set ("heroku config" shows your variables). Apparently, this should be set when you create your app, but somehow wasn't for mine. To fix, I had to run the following command:
&lt;/p&gt;
&lt;pre&gt;
$ heroku pg:promote SHARED_DATABASE 
-----&gt; Promoting SHARED_DATABASE to DATABASE_URL... done
&lt;/pre&gt;
&lt;p id="postgres"&gt;&lt;strong&gt;PostgreSQL and Dates&lt;/strong&gt;&lt;br/&gt;
The next issue I ran into was with loading default data. I have the following BootStrap.scala class in my project to load default data:
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
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]]("initial-data.yml").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;For some reason, only my "athlete" table was getting populated and the others weren't. I tried turning on debugging and trace, but nothing showed up in the logs. This appears to be a &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/bfa206000cb468e9"&gt;frequent issue&lt;/a&gt; with Play. When data fails to load, there's no logging indicating what went wrong. To make matters worse with Anorm, there's no way to log the SQL that it's attempting to run. My BootStrap job was working fine when connecting to "db=mem", but stopped after switching to PostgreSQL. The support I got for this issue was disappointing, since it caused &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/94bd99b1cd486415"&gt;crickets on Play's Google Group&lt;/a&gt;. I finally figured out "support of Date for insertion" was &lt;a href="https://github.com/playframework/play-scala/commit/cbe162a0ecbf7996eba2ab028264a9cc332cb915"&gt;added to Anorm a couple months ago&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;To get the latest play-scala code into my project, I cloned &lt;a href="https://github.com/playframework/play-scala"&gt;play-scala&lt;/a&gt;, built it locally and uploaded it to my server. Then I added the following to dependencies.yml and ran "play deps -sync".
&lt;/p&gt;
&lt;pre&gt;
require:
    ...
    - upgrades -&gt; scala 0.9.1-20111025
    ...

repositories:
    - upgrades:
        type: http
        artifact: "http://static.raibledesigns.com/[module]-[revision].zip"
        contains:
            - upgrades -&gt; *
&lt;/pre&gt;
&lt;p id="summary"&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
When I started writing this article, I was going to talk about some improvements I made to &lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;Scalate Play interoperability&lt;/a&gt;. However, I think I'll save that for next time and possibly turn it into a plugin using &lt;a href="https://github.com/greenlaw110/play-excel/blob/1.2/src/play/modules/excel/Plugin.java"&gt;play-excel&lt;/a&gt; as an example. 
&lt;/p&gt;
&lt;p&gt;
As you can tell from this article, my experience with Anorm was frustrating - particularly due to the lack of error messages when operations failed. The lack of support was expected, as this usually happens when you're living on the bleeding edge. However, based on this experience, I can't help but think that it might be a while before &lt;a href="http://scala.playframework.org/2.0"&gt;Play 2.0&lt;/a&gt; is ready for production use.&lt;/p&gt;
&lt;p&gt;The good news is &lt;a href="http://www.jamesward.com/2011/10/24/setting-up-play-framework-apps-in-intellij-idea"&gt;IntelliJ is adding support for Play&lt;/a&gt;. Maybe this will help increase adoption and inspire the framework's developers to stabilize and improve Play Scala before moving the entire framework to Scala. After all, it seems they've encountered &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/e2331dc5097f9919/441849bae162a561"&gt;some issues making Scala as fast as Java&lt;/a&gt;.
&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93469156&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93469156&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93469156 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and</guid><title>Developing with HTML5, CoffeeScript and Twitter's Bootstrap </title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/developing_with_html5_coffeescript_and</link><pubDate>Thu, 20 Oct 2011 14:47:36 -0600</pubDate><category>Java</category><category>html5boilerplate</category><category>bootstrap</category><category>html5</category><category>geolocation</category><category>devoxx2011</category><category>coffeescript</category><category>less</category><description>&lt;a href="http://www.w3.org/html/logo/"&gt;&lt;img src="http://www.w3.org/html/logo/downloads/HTML5_Logo_128.png" width="128" height="128" alt="HTML5 Logo" class="picture" style="border: 0"&gt;&lt;/a&gt;
This article is the fourth in a series about my adventures developing a Fitness Tracking application with HTML5, Play Scala, CoffeeScript and Jade. Previous articles can be found at:
&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;Integrating Scalate and Jade with Play 1.2.3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work"&gt;Trying to make CoffeeScript work with Scalate and Play&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"&gt;Integrating HTML5 Boilerplate with Scalate and Play&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p id="features"&gt;&lt;strong&gt;Developing Features&lt;/strong&gt;&lt;br/&gt;After getting my desired infrastructure setup, I started coding like a madman. The first feature I needed was a stopwatch to track the duration of a workout, so I started writing one with CoffeeScript. After spending 20 minutes playing with dates and setTimeout, I searched and found a &lt;a href="http://www.kellishaver.com/projects/stopwatch/"&gt;stopwatch jQuery plug-in&lt;/a&gt;. I added this to my app, deployed it to &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt;, brought up the app on my iPhone 3G, clicked &lt;em&gt;Start&lt;/em&gt; and started riding my bike to work. 
&lt;/p&gt;
&lt;p&gt;
When I arrived, I unlocked my phone and discovered that the time had stopped. At first, I thought this was a major setback. My disappointed disappeared when I found a &lt;a href="http://proft.50megs.com/stopwatch.html"&gt;Super Neat JavaScript Stopwatch&lt;/a&gt; and &lt;a href="http://www.timpelen.com/extra/sidebars/stopwatch/stopwatch.htm"&gt;Kåre Byberg's version&lt;/a&gt; that worked just fine. This stopwatch used setTimeout, so by keeping the start time, the app on the phone would &lt;em&gt;catch up&lt;/em&gt; as soon as you unlocked it. I ported Kåre's script to CoffeeScript and rejoiced in my working stopwatch. 
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
# Created by Kåre Byberg © 21.01.2005. Please acknowledge if used 
# on other domains than http://www.timpelen.com.
# Ported to CoffeeScript by Matt Raible. Also added hours support.
flagClock = 0
flagStop = 0
stopTime = 0
refresh = null
clock = null

start = (button, display) -&gt;
  clock = display
  startDate = new Date()
  startTime = startDate.getTime()
  if flagClock == 0
    $(button).html("Stop")
    flagClock = 1
    counter startTime, display
  else
    $(button).html("Start")
    flagClock = 0
    flagStop = 1

counter = (startTime) -&gt;
  currentTime = new Date()
  timeDiff = currentTime.getTime() - startTime
  timeDiff = timeDiff + stopTime  if flagStop == 1
  if flagClock == 1
    $(clock).val formatTime timeDiff, ""
    callback = -&gt; counter startTime
    refresh = setTimeout callback, 10
  else
    window.clearTimeout refresh
    stopTime = timeDiff

formatTime = (rawTime, roundType) -&gt;
  if roundType == "round"
    ds = Math.round(rawTime / 100) + ""
  else
    ds = Math.floor(rawTime / 100) + ""
  sec = Math.floor(rawTime / 1000)
  min = Math.floor(rawTime / 60000)
  hour = Math.floor(rawTime / 3600000)
  ds = ds.charAt(ds.length - 1)
  start() if hour &gt;= 24
  sec = sec - 60 * min + ""
  sec = prependZeroCheck sec
  min = min - 60 * hour + ""
  min = prependZeroCheck min
  hour = prependZeroCheck hour
  hour + ":" + min + ":" + sec + "." + ds

prependZeroCheck = (time) -&gt;
  time = time + "" # convert from int to string
  unless time.charAt(time.length - 2) == ""
    time = time.charAt(time.length - 2) + time.charAt(time.length - 1)
  else
    time = 0 + time.charAt(time.length - 1)

reset = -&gt;
  flagStop = 0
  stopTime = 0
  window.clearTimeout refresh
  if flagClock == 1
    resetDate = new Date()
    resetTime = resetDate.getTime()
    counter resetTime
  else
    $(clock).val "00:00:00.0"

@StopWatch = {
  start: start
  reset: reset
}
&lt;/pre&gt;
&lt;p&gt;The Scalate/Jade template to render this stopwatch looks as follows:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
script(type="text/javascript" src={uri("/public/javascripts/stopwatch.coffee")})

#display
  input(id="clock" class="xlarge" type="text" value="00:00:00.0" readonly="readonly")
#controls
  button(id="start" type="button" class="btn primary") Start
  button(id="reset" type="button" class="btn :disabled") Reset

:plain
  &amp;lt;script type="text/coffeescript"&gt;
    $(document).ready -&gt;
      $('#start').click -&gt;
        StopWatch.start this, $('#clock')

      $('#reset').click -&gt;
        StopWatch.reset()
  &amp;lt;/script&gt;
&lt;/pre&gt;
&lt;p&gt;Next, I wanted to create a map that would show your location. For this, I used &lt;a href="http://merged.ca/iphone/html5-geolocation"&gt;
  Merge Design's HTML 5 Geolocation Demo&lt;/a&gt; as a guide. The &lt;a href="http://dev.w3.org/geo/api/spec-source.html"&gt;HTML5 Geo API&lt;/a&gt; is pretty 
  simple, containing only three methods:
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
// Gets the users current position
navigator.geolocation.getCurrentPosition(successCallback,
                                         errorCallback,
                                         options);
// Request repeated updates of position
watchId = navigator.geolocation.watchPosition(successCallback, errorCallback);

// Cancel the updates
navigator.geolocation.clearWatch(watchId);
&lt;/pre&gt;
&lt;p&gt;After rewriting the geolocation example in CoffeeScript, I ended up with the following code in my map.coffee script. You'll notice it uses 
  &lt;a href="http://code.google.com/apis/maps/documentation/javascript/"&gt;Google Maps JavaScript API&lt;/a&gt; to show an actual map
  with a marker.
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
# Geolocation with HTML 5 and Google Maps API based on example from maxheapsize: 
# http://maxheapsize.com/2009/04/11/getting-the-browsers-geolocation-with-html-5/
# This script is by Merge Database and Design, http://merged.ca/ -- if you use some, 
# all, or any of this code, please offer a return link.

map = null
mapCenter = null
geocoder = null
latlng = null
timeoutId = null

initialize = -&gt;
  if Modernizr.geolocation
    navigator.geolocation.getCurrentPosition showMap

showMap = (position) -&gt;
  latitude = position.coords.latitude
  longitude = position.coords.longitude
  mapOptions = {
    zoom: 15,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  map = new google.maps.Map(document.getElementById("map"), mapOptions)
  latlng = new google.maps.LatLng(latitude, longitude)
  map.setCenter(latlng)

  geocoder = new google.maps.Geocoder()
  geocoder.geocode({'latLng': latlng}, addAddressToMap)

addAddressToMap = (results, status) -&gt;
  if (status == google.maps.GeocoderStatus.OK) 
    if (results[1]) 
      marker = new google.maps.Marker({
          position: latlng,
          map: map
      })
      $('#location').html('Your location: ' + results[0].formatted_address)
  else 
    alert "Sorry, we were unable to geocode that address."

start = -&gt;
  timeoutId = setTimeout initialize, 500

reset = -&gt;
  if (timeoutId)
    clearTimeout timeoutId

@Map = {
  start: start
  reset: reset
}
&lt;/pre&gt;
&lt;p&gt;The template to show the map is a mere 20 lines of Jade:
&lt;/p&gt;
&lt;pre class="brush: xml"&gt;
script(type="text/javascript" src="http://www.google.com/jsapi")
script(type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false")

:css
  .demo-map {
    border: 1px solid silver;
    height: 200px;
    margin: 10px auto;
    width: 280px;
  }

#map(class="demo-map")

p(id="location")
  span(class="label success") New
  | Fetching your location with HTML 5 geolocation...

script(type="text/javascript" src={uri("/public/javascripts/map.coffee")})
:javascript
    Map.start();
&lt;/pre&gt;
&lt;p&gt;The last two features I wanted were 1) distance traveled and 2) drawing the route taken on the map. For this I learned from 
  &lt;a href="http://www.html5rocks.com/en/tutorials/geolocation/trip_meter/"&gt;A Simple Trip Meter using the Geolocation API&lt;/a&gt;.
  As I was beginning to port the JS to CoffeeScript, I thought, "there's got to be a better way."  I searched and found &lt;a href="http://js2coffee.org/"&gt;Js2coffee&lt;/a&gt; to do most of the conversion for me. If you know JavaScript and you're learning CoffeeScript, this is an invaluable tool. 
&lt;/p&gt;
I tried out the trip meter that night evening
  on a bike ride and noticed it said I'd traveled 3 miles when I'd really gone 6. I quickly figured out it was only calculating
  start point to end point and not taking into account all the turns in between. To view what was happening, I integrated my
  odometer.coffee with my map using &lt;a href="http://code.google.com/apis/maps/documentation/javascript/overlays.html#Polylines"&gt;
  Google Maps Polylines&lt;/a&gt;. Upon finishing the integration, I discovered two things, 1) HTML5 geolocation was highly inaccurate and
  2) &lt;a href="http://stackoverflow.com/questions/7676423/is-it-possible-to-make-an-html5-trip-meter-that-tracks-distance-traveled/7681295"&gt;geolocation doesn't run in the background&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
I was able to solve the first problem by passing in {enableHighAccuracy: true} to navigator.geolocation.watchPosition(). Below are two screenshots showing before high accuracy and after. Both screenshots are from the same two-block walk.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
  &lt;a href="http://farm7.static.flickr.com/6101/6264033565_0353120a06.jpg" rel="lightbox[html5geo]" title="Without {enableHighAccuracy: true} by mraible, on Flickr"&gt;&lt;img src="http://farm7.static.flickr.com/6101/6264033565_0353120a06_m.jpg" width="160" height="240" alt="Without {enableHighAccuracy: true}" style="border: 1px solid silver"&gt;&lt;/a&gt;
  
  &lt;a href="http://farm7.static.flickr.com/6032/6264033561_cf9a8cb311.jpg" rel="lightbox[html5geo]" title="With {enableHighAccuracy: true} by mraible, on Flickr"&gt;&lt;img src="http://farm7.static.flickr.com/6032/6264033561_cf9a8cb311_m.jpg" width="160" height="240" alt="With {enableHighAccuracy: true}" style="margin-left: 30px; border: 1px solid silver"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The second
issue is a slight show-stopper. &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; might be able to solve the problem, but I'm currently using a
workaround &amp;rarr; turning off auto-lock and keeping Safari in the foreground. 
&lt;/p&gt;
&lt;p id="style"&gt;&lt;strong&gt;Making it look good&lt;/strong&gt;&lt;br/&gt;After I got all my desired features developed, I moved onto making the app look good. I started by using &lt;a href="http://sass-lang.com/"&gt;SASS&lt;/a&gt; for my CSS and installed &lt;a href="http://www.playframework.org/modules/sass"&gt;Play's SASS module&lt;/a&gt;. I then switched to &lt;a href="http://lesscss.org/"&gt;LESS&lt;/a&gt; when I discovered and added &lt;a href="http://twitter.github.com/bootstrap/"&gt;Twitter's Bootstrap&lt;/a&gt; to my project. At first I used &lt;a href="http://www.playframework.org/modules/less-0.3/home"&gt;Play's LESS module&lt;/a&gt; (version 0.3), but ran into &lt;a href="http://groups.google.com/group/play-framework/browse_thread/thread/4d76688608105dd/f886dc32c724b7cd"&gt;compilation issues&lt;/a&gt;. I then tried &lt;a href="https://github.com/greenlaw110/play-greenscript"&gt;Play's GreenScript module&lt;/a&gt;, but gave up on it when I found it was incompatible with the &lt;a href="http://www.playframework.org/modules/coffee"&gt;CoffeeScript module&lt;/a&gt;. Switching back to the LESS module and using the "0.3.compatibility" version solved all remaining issues.
&lt;/p&gt;
&lt;p&gt;You might remember that &lt;a href="http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate"&gt;I integrated HTML5 Boilerplate&lt;/a&gt; and wondering why I have both Bootstrap and Boilerplate in my project. At this point, I don't think Boilerplate is needed, but I've kept it just in case it's doing something for HTML5 cross-browser compatibility. I've renamed its style.css to style.less and added the following so it has access to Bootstrap's variables.
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
/* Variables from Bootstrap */
@import "libs/variables.less";
&lt;/pre&gt;
&lt;p&gt;Then I made my app look a lot better with &lt;a href="http://twitter.github.com/bootstrap/examples/container-app.html"&gt;layouts&lt;/em&gt;, &lt;a href="http://twitter.github.com/bootstrap/#forms"&gt;stylish forms&lt;/a&gt;, a &lt;a href="http://twitter.github.com/bootstrap/#navigation"&gt;fixed topbar&lt;/a&gt; and &lt;a href="http://twitter.github.com/bootstrap/#alerts"&gt;alerts&lt;/a&gt;. For example, here's the CoffeeScript I wrote to display geolocation errors:
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
geolocationError = (error) -&gt;
  msg = 'Unable to locate position. '
  switch error.code
    when error.TIMEOUT then msg += 'Timeout.'
    when error.POSITION_UNAVAILABLE then msg += 'Position unavailable.'
    when error.PERMISSION_DENIED then msg += 'Please turn on location services.'
    when error.UNKNOWN_ERROR then msg += error.code
  $('.alert-message').remove()
  alert = $('&amp;lt;div class="alert-message error fade in" data-alert="alert"&amp;gt;')
  alert.html('&amp;lt;a class="close" href="#"&amp;gt;&amp;times;&amp;lt;/a&amp;gt;' + msg);
  alert.insertBefore($('.span10'))
&lt;/pre&gt;
&lt;p&gt;Then I set about styling up the app so it looked good on a smartphone with &lt;a href="http://thinkvitamin.com/design/getting-started-and-gotchas-of-css-media-queries/"&gt;CSS3 Media Queries&lt;/a&gt;. Below is the LESS code I used to hide elements and squish the widths for smaller devices.
&lt;/p&gt;
&lt;pre class="brush: js"&gt;
@media all and (max-device-width: 480px) {
  /* hide scrollbar on mobile */
  html { overflow-y:hidden }
  /* hide sidebar on mobile */
  .home .span4, .home .page-header, .topbar form {
    display: none
  }
  .home .container {
    width: 320px;
  } 
  .about {
    .container, .span10 {
      width: 280px;
    }
    .span10 {
      padding-top: 0px;
    }
  }
&lt;/pre&gt;
&lt;p id="tools"&gt;&lt;strong&gt;Tools&lt;/strong&gt;&lt;br/&gt;
In the process of developing a stopwatch, odometer, displaying routes and making everything look good, I used a number of tools. I started out primarily with &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; and its bundles for &lt;a href="https://github.com/appden/less.tmbundle"&gt;LESS&lt;/a&gt;, &lt;a href="https://github.com/jashkenas/coffee-script-tmbundle"&gt;CoffeeScript&lt;/a&gt; and &lt;a href="https://github.com/miksago/jade-tmbundle"&gt;Jade&lt;/a&gt;. When I started writing more Scala, I installed the &lt;a href="https://github.com/mads379/scala.tmbundle"&gt;Scala TextMate Bundle&lt;/a&gt;. When I needed some debugging, I switched to &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; and installed its Scala plugin. CoffeeScript, LESS and HAML plugins (for Jade) were already installed by default. I also used James Ward's &lt;a href="http://www.jamesward.com/2011/07/28/setup-play-framework-with-scala-in-intellij"&gt;Setup Play Framework with Scala in IntelliJ&lt;/a&gt;.
&lt;/p&gt;
&lt;p id="issues"&gt;
  &lt;strong&gt;Issues&lt;/strong&gt;&lt;br/&gt;
  I think it's obvious that my biggest issue so far is the fact that a webapp can't multitask in the background like a native app can. Beyond that, there's accuracy issues with HTML5's geolocation that I haven't seen in native apps. 
&lt;/p&gt;
&lt;p&gt;
I also ran into a caching issue when calling getCurrentPosition(). It only worked the first time and I had to refresh my browser to get it to work again. Strangely enough, this only happened on my desktop (in Safari and Firefox) and worked fine on my iPhone. Unfortunately, it looks like &lt;a href="https://github.com/phonegap/phonegap-iphone/issues/197"&gt;PhoneGap has issues&lt;/a&gt; similar to this.
&lt;/p&gt;
&lt;p&gt;My workaround for no webapp multitasking is turning off auto-lock and leaving the browser in the foreground while I exercise. The downside to this is it &lt;em&gt;really&lt;/em&gt; drains the battery quickly (~ 3 hours). I constantly have to charge my phone if I'm testing it throughout the day. The testing is a real pain too. I have to deploy to Heroku (which is easy enough), then go on a walk or bike ride. If something's broke, I have to return home, tweak some things, redeploy and go again. Also, there's been a few times where Safari crashes halfway through and I lose all the tracking data. This happens with native apps too, but seemingly not as often.  
&lt;/p&gt;
&lt;p&gt;
  If you'd like to try the app on your mobile phone and see if you experience these issues, checkout &lt;a href="http://play-more.com"&gt;play-more.com&lt;/a&gt;.
&lt;/p&gt;
&lt;p id="summary"&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;Going forward, there's still more HTML5 features I'd like to use. In particular, I'd like to play music while the fitness tracker is running. I'd love it if cloud music services (e.g. Pandora or Spotify) had an API I could use to play music in a webapp. &lt;a href="http://soundcloud.com/"&gt;Soundcloud&lt;/a&gt; might be an option, but I've also thought of just uploading some MP3s and playing them with the &amp;lt;audio&amp;gt; tag. 
&lt;/p&gt;
&lt;p&gt;I've really enjoyed developing with all these technologies and haven't experienced much frustration so far. The majority has come from integrating Scalate into Play, but I've resolved most problems. Next, I'll talk about how I've improved Play's Scalate support and my experience working with &lt;a href="http://scala.playframework.org/documentation/scala-0.9.1/anorm"&gt;Anorm&lt;/a&gt;. 
&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=93094719&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=93094719&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=93094719 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/increasing_my_developer_happiness</guid><title>Increasing My Developer Happiness</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/increasing_my_developer_happiness</link><pubDate>Fri, 7 Oct 2011 15:35:35 -0600</pubDate><category>Mac OS X</category><category>hardware</category><category>macbookpro</category><category>imac</category><category>developerhappiness</category><category>apple</category><description>I've bought into the idea that a happy developer requires a clean, attractive, comfortable workplace that encourages healthy, sustainable productivity. Rich Armstrong of Fog Creek Software explains how they &lt;a href="http://blog.fogcreek.com/the-price-of-dev-happiness-part-one/"&gt;spend $6,174 per developer to make them happy&lt;/a&gt;. Shortly after reading this article, I &lt;a href="https://twitter.com/mraible/status/101335190948937728"&gt;tweeted&lt;/a&gt;:
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
My ideal setup is ~$10K more (MacBook Pro, Mac Pro, two 30s).
&lt;/p&gt;
&lt;p&gt;While this is my &lt;em&gt;ideal&lt;/em&gt; setup, it's not something I actually need. If you've ever worked with two 30" monitors, you might agree. That much screen real estate can be too much, as you have to pan your head side-to-side to take it all in. I've found that a single 30" or 27" is good enough for me. As far as a Mac Pro goes, they can have &lt;em&gt;awesome&lt;/em&gt; horsepower when full-loaded, but unless you're doing some serious processing, you probably won't utilize it all.
&lt;/p&gt;
&lt;p&gt;
  The last time I bought a new computer was March 2009, when I bought a &lt;a href="http://raibledesigns.com/rd/entry/new_15_macbook_pro_with"&gt;15" MacBook Pro with an SSD&lt;/a&gt;. I upgraded it to 8 GB RAM a year later and it's hummed along just fine since then. I also had the pleasure of working on a fully-loaded Mac Pro at Time Warner Cable for all of 2010 and a company-provided &lt;a href="https://twitter.com/mraible/status/22456049793499136"&gt;MacBook Pro at Overstock&lt;/a&gt; for most of this year. With my recent move to a new client, it's time to increase my developer happiness. Since I am my own boss, it's easy to get hardware upgrades approved. &lt;img src="http://raibledesigns.com/images/smileys/wink.gif" class="smiley" alt=";)" title=";)" /&gt;&lt;/p&gt;
&lt;p&gt;My current hardware inventory is as follows:
&lt;/p&gt; 
&lt;ul&gt;
  &lt;li&gt;A 15" MacBook Pro&lt;/li&gt;
  &lt;li&gt;A 30" monitor at home&lt;/li&gt;
  &lt;li&gt;A 27" monitor at my office in &lt;a href="http://www.downtownlittleton.com/"&gt;Downtown Littleton&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since I ride my bike to work everyday, I've been hauling my laptop back and forth on my 8-mile commute. This is getting old quickly. I'd rather have a permanent machine in my office and a laptop for when I travel to clients, &lt;a href="http://raibledesigns.com/rd/entry/another_dream_realized_mountain_views"&gt;the mountain office&lt;/a&gt; or to conferences. So here's what I hope to buy in the next week:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A new 15" MacBook Pro, fastest CPU available&lt;/li&gt;
  &lt;li&gt;A fully-loaded 27" iMac for my office&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I'll be moving my current 27" monitor to the mountain office. I plan on getting rid of my current MacBook Pro through the &lt;a href="http://www.apple.com/recycling/"&gt;Apple Recycling Program&lt;/a&gt;. I'm also planning on trying out Apple's &lt;a href="http://store.apple.com/us_smb_78313/browse/campaigns/lease"&gt;24-month leasing program&lt;/a&gt;. I like to get new hardware every two years and it's a better tax deduction, so it seems to make sense.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;My only question at this point is &lt;strong&gt;should I get Apple's SSD and RAM instead of getting it aftermarket&lt;/strong&gt; (e.g. via &lt;a href="http://www.crucial.com"&gt;Crucial&lt;/a&gt;)?
My original plan was to install an aftermarket SSD and 8 GB RAM in the MacBook Pro. For the iMac, I've heard installing an aftermarket SSD isn't an option, but RAM is. I was thinking about getting the SSD + 1 TB drive combo and upgrading the RAM to 8 GB myself. There's a good chance aftermarket is better quality, but I'd also have to pay more vs. having it wrapped up in the total lease price.&lt;/p&gt;
&lt;p&gt;Of course, new hardware is only part of developer happiness. A clean, attractive, comfortable workplace is an essential component as well. My home and mountain offices are nice, but my Littleton office needs work. I currently share it with two other developers, &lt;a href="http://www.girlmeetsbit.com/"&gt;Angela&lt;/a&gt; and &lt;a href="https://twitter.com/jamesgoodwill"&gt;Jim&lt;/a&gt;. Over the next couple months, we plan on making a lot of improvements to our daily digs. I'll make sure and take some before and after pictures and blog about how we improve things.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=92675162&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=92675162&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=92675162 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate</guid><title>Integrating HTML5 Boilerplate with Scalate and Play</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/integrating_html5_boilerplate_with_scalate</link><pubDate>Wed, 28 Sep 2011 08:49:35 -0600</pubDate><category>Java</category><category>playframework</category><category>scalate</category><category>html5boilerplate</category><category>coffeescript</category><description>HTML5 Boilerplate is a project that provides a number of basic files to help you build an HTML5 application. At its core, it's an HTML template that puts CSS at the top, JavaScript at the bottom, installs Chrome Frame for IE6 users and leverages Modernizr for legacy browser support. It also includes jQuery with the download. One of the major benefits of HTML5 Boilerplate is it ships with a build system (powered by Ant) that concatenates and minimizes CSS and JS for maximum performance. From &lt;a href="http://html5boilerplate.com/"&gt;html5boilerplate.com&lt;/a&gt;:
&lt;/p&gt;
&lt;p class="smokey"&gt;
Boilerplate is not a framework, nor does it prescribe any philosophy of development, it's just got some tricks to get your project off the ground quickly and right-footed.
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;
I like the idea of its build system to minify and gzip, but I'd probably only use it if I was working on a project that uses Ant. Since I'm using it in a Play project, the whole Ant build system doesn't help me. Besides, I prefer something like &lt;a href="http://code.google.com/p/wro4j/"&gt;wro4j&lt;/a&gt;. Wro4j allows you to specify a group of files and then it compiles, minimizes and gzips them all on-the-fly. As far as I know, Play doesn't have any support for Servlet Filters, so using wro4j in Play is not trivial.
&lt;/p&gt;
&lt;p&gt;
The good news is Play has a &lt;a href="http://www.playframework.org/modules/greenscript"&gt;GreenScript module&lt;/a&gt; that contains much of the wro4j functionality. However, since I'm using &lt;a href="http://scalate.fusesource.org/presentations/scalate#(1)"&gt;Scalate&lt;/a&gt; in my project, this goodness is unavailable to me. In the future, the Scalate Team is considering adding &lt;a href="http://groups.google.com/group/scalate/browse_thread/thread/2904bbdc8ca9dd46"&gt;better wro4j, JavaScript and CSS integration&lt;/a&gt;. In the meantime, I'm going to pretend I don't care about concatenation and minimization and trundle along without this feature.
&lt;/p&gt;
&lt;p&gt;To add HTML5 Boilerplate to my Play project, I performed the following steps:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Downloaded the &lt;a href="http://github.com/paulirish/html5-boilerplate/zipball/v2.0"&gt;2.0 Zipball&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Copied all the static files to my project. Below are the commands I used (where &lt;em&gt;$boilerplate-download&lt;/em&gt; is the expanded download directory and &lt;em&gt;~/dev/play-more&lt;/em&gt; is my project):
&lt;pre style="margin-top: 5px"&gt;
cd $boilerplate-download
cp 404.html ~/dev/play-more/app/views/errors/404.html
cp *.png ~/dev/play-more/public/.
cp crossdomain.xml ~/dev/play-more/public/.
cp -r css ~/dev/play-more/public/stylesheets/.
cp favicon.ico ~/dev/play-more/public/.
cp humans.txt ~/dev/play-more/public/.
cp -r js/libs ~/dev/play-more/public/javascripts/.
cp robots.txt ~/dev/play-more/public/.
&lt;/pre&gt;
  &lt;/li&gt;
  &lt;li&gt;Copied the index.html to &lt;em&gt;~/dev/play-more/app/templates/layouts/default.jade&lt;/em&gt; and modified it to use &lt;a href="http://scalate.fusesource.org/documentation/jade.html"&gt;Jade syntax&lt;/a&gt;. Since I downloaded the comments-heavy version, I modified many of them to be hidden in the final output.
&lt;pre class="brush: xml"&gt;
-@ val body: String 
-@ var title: String = "Play More"
-@ var header: String = ""
-@ var footer: String = ""
!!! 5
/ paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ 
&amp;lt;!--&amp;#91;if lt IE 7&amp;#93;&amp;gt; &amp;lt;html class="no-js ie6 oldie" lang="en"&amp;gt; &amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
&amp;lt;!--&amp;#91;if IE 7&amp;#93;&amp;gt;    &amp;lt;html class="no-js ie7 oldie" lang="en"&amp;gt; &amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
&amp;lt;!--&amp;#91;if IE 8&amp;#93;&amp;gt;    &amp;lt;html class="no-js ie8 oldie" lang="en"&amp;gt; &amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
-# Consider adding an manifest.appcache: h5bp.com/d/Offline 
&amp;lt;!--&amp;#91;if gt IE 8&amp;#93;&amp;gt;&amp;lt;!--&amp;gt; &amp;lt;html class="no-js" lang="en"&amp;gt; &amp;lt;!--&amp;lt;!&amp;#91;endif&amp;#93;--&amp;gt;
head
  meta(charset="utf-8")

  -# Use the .htaccess and remove these lines to avoid edge case issues. More info: h5bp.com/b/378 
  meta(http-equiv="X-UA-Compatible" content="IE=edge,chrome=1")

  title=title
  meta(name="description" content="")
  meta(name="author" content="Matt Raible ~ matt@raibledesigns.com")

  -# Mobile viewport optimized: j.mp/bplateviewport 
  meta(name="viewport" content="width=device-width,initial-scale=1")

  -# Place favicon.ico and apple-touch-icon.png in the root directory: mathiasbynens.be/notes/touch-icons

  -# CSS: implied media=all
  link(rel="stylesheet" href={uri("/public/stylesheets/style.css")})
  -# end CSS

  -# More ideas for your &amp;lt;head&amp;gt; here: h5bp.com/d/head-Tips 
  -#
    All JavaScript at the bottom, except for Modernizr / Respond.
    Modernizr enables HTML5 elements &amp;amp; feature detects; Respond is a polyfill for min/max-width CSS3 Media Queries
    For optimal performance, use a custom Modernizr build: www.modernizr.com/download/ 

  script(type="text/javascript" src={uri("/public/javascripts/libs/modernizr-2.0.6.min.js")})
body
  #container
    header = header
    #main(role="main")
      != body
    footer = footer

  -# JavaScript at the bottom for fast page loading 
  
  / Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline 
  script(type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js")
  :javascript
    window.jQuery || document.write('&amp;lt;script src={uri("/public/javascripts/libs/jquery-1.6.2.min.js")}&amp;gt;&amp;lt;\/script&amp;gt;')

  -# Change UA-XXXXX-X to be your site's ID 
  :javascript
    window._gaq = &amp;#91;&amp;#91;'_setAccount','UA-25859875-1'&amp;#93;,&amp;#91;'_trackPageview'&amp;#93;,&amp;#91;'_trackPageLoadTime'&amp;#93;&amp;#93;;
    Modernizr.load({
      load: ('https:' == location.protocol ? '//ssl' : '//www') + '.google-analytics.com/ga.js'
    });

  -# Prompt IE 6 users to install Chrome Frame. Remove this if you want to support IE 6. 
  -# http://chromium.org/developers/how-tos/chrome-frame-getting-started 
  /&amp;#91;if lt IE 7&amp;#93;
    script(src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js")
    :javascript
      window.attachEvent('onload',function(){CFInstall.check({mode:'overlay'})})
        
!= "&amp;lt;/html&amp;gt;"
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Next, I had to add support for layouts to my &lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;homegrown Scalate support&lt;/a&gt;. I did this by specifying a &lt;code&gt;layoutStrategy&lt;/code&gt; when initializing the TemplateEngine. From &lt;em&gt;play-more/app/controllers/ScalateTemplate.scala&lt;/em&gt;:
&lt;pre class="brush: scala"&gt;
engine.classLoader = Play.classloader
engine.layoutStrategy = new DefaultLayoutStrategy(engine, 
  Play.getFile("/app/templates/layouts/default" + scalateType).getAbsolutePath)
engine
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's it! Now I have HTML5 Boilerplate integrated into my Play/Scalate/Jade application. To set the title and header in my &lt;em&gt;index.jade&lt;/em&gt;, I simply added the following lines at the top:&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
- attributes("title") = "Counting"
- attributes("header") = "HTML5 Rocks!"
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CoffeeScript Tip&lt;/strong&gt;&lt;br/&gt;
Yesterday, I mentioned that I was &lt;a href="http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work"&gt;having issues getting CoffeeScript to work with Scalate&lt;/a&gt; and that I was going to try and get the in-browser compiler working. First of all, reverting to Scalate 1.4.1 didn't work because there is no CoffeeScript support in 1.4.1. So I stayed with 1.5.2 and used PandaWood's &lt;a href="http://forgivingworm.wordpress.com/2010/09/27/running-coffeescript-in-browser/"&gt;Running CoffeeScript In-Browser Tutorial&lt;/a&gt;. I copied &lt;a href="http://github.com/jashkenas/coffee-script/raw/master/extras/coffee-script.js"&gt;coffee-script.js&lt;/a&gt; to &lt;em&gt;~/dev/play-more/public/javascripts/libs&lt;/em&gt; and added a reference to it in my default.jade layout:
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
-# JavaScript at the bottom for fast page loading 
script(type="text/javascript" src={uri("/public/javascripts/libs/coffee-script.js")})
&lt;/pre&gt;
&lt;p&gt;Then I was able to write CoffeeScript in a .jade template using the following syntax:&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
:plain
  &amp;lt;script type="text/coffeescript"&amp;gt;
    alert "hello world"
  &amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
If you've integrated HTML5 Boilerplate into your Play application, I'd love to hear about it. Now that I have all the infrastructure in place (Jade, CoffeeScript, HTML5 Boilerplate), I'm looking forward to getting some development done. Who knows, maybe I'll even come up with my own &lt;a href="http://www.zeroturnaround.com/blog/play-framework-unfeatures-that-irk-my-inner-geek/"&gt;Play Un-Features That Really Irk My Inner Geek&lt;/a&gt;.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=92460845&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=92460845&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=92460845 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work</guid><title>Trying to make CoffeeScript work with Scalate and Play</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/trying_to_make_coffeescript_work</link><pubDate>Tue, 27 Sep 2011 13:59:18 -0600</pubDate><category>Java</category><category>scalate</category><category>coffeescript</category><category>playframework</category><description>A few weeks ago, I wrote about &lt;a href="http://raibledesigns.com/rd/entry/integrating_scalate_and_jade_with"&gt;integrating Scalate with Play&lt;/a&gt;. 
&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;The next steps in my Play Scala adventure will be trying to get the &lt;a href="http://www.playframework.org/modules/coffee" style="color: #666"&gt;CoffeeScript module&lt;/a&gt; to work. I also hope to integrate &lt;a href="http://html5boilerplate.com/" style="color: #666"&gt;HTML5 Boilerplate&lt;/a&gt; with Jade and &lt;a href="http://scalate.fusesource.org/documentation/user-guide.html#layouts" style="color: #666"&gt;Scalate Layouts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since my last writing, the Scalate Team has created a new branch for Scala 2.8.x (that's compatible with Play) and &lt;a href="http://scalate.fusesource.org/blog/releases/release-1.5.2.html"&gt;released 1.5.2&lt;/a&gt;. To upgrade my Play application to use this version, I changed my dependencies.yml to have the following:
&lt;/p&gt;
&lt;pre&gt;
  - org.fusesource.scalate -&gt; scalate-core 1.5.2-scala_2.8.1:
      transitive: false
  - org.fusesource.scalate -&gt; scalate-util 1.5.2-scala_2.8.1:
      transitive: false
&lt;/pre&gt;
&lt;p&gt;Unfortunately, this release breaks Scalate's CoffeeScript support because it &lt;a href="http://groups.google.com/group/scalate/msg/519b8ce04336b57e"&gt;wraps the code with illegal comments&lt;/a&gt;. This has been fixed in the latest snapshot, but no new release has been cut. However, even if it did work, it's not quite what I'm looking for. The 1.5.2 release allows for compiling inline CoffeeScript on-the-fly, but I'd rather store my .coffee files external to the page.
&lt;/p&gt;
&lt;p&gt;To try and figure out how to do this, I sent a message to the Scalate Google Group asking &lt;a href="http://groups.google.com/group/scalate/browse_thread/thread/868e5c1afb6d38ac"&gt;Does Scalate allow for referencing (and compiling) CoffeeScript files like the plugin for Play?&lt;/a&gt; My email prompted the Scalate Team to do some modifications that seemed to do exactly what I was looking for.
  &lt;/p&gt;
&lt;div class="quote" style="color: #666; margin-left: 0; margin-bottom: 10px"&gt;
FWIW I've just checked in a couple of coffeescript examples. To run it, grab the code &amp;amp; do a local build... 
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://scalate.fusesource.org/source.html" style="color: #666"&gt;http://scalate.fusesource.org/source.html&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://scalate.fusesource.org/building.html" style="color: #666"&gt;http://scalate.fusesource.org/building.html&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
then run this...
&lt;br/&gt;
&lt;pre style="margin-top: 10px"&gt;
cd samples/scalate-example 
mvn jetty:run
&lt;/pre&gt;
then open &lt;a href="http://localhost:8080/coffee/index" style="color: #666"&gt;http://localhost:8080/coffee/index&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
there are 2 sample jade files which use embedded coffee or a separate  coffee file (using the .js extension in the &amp;lt;script src attribute&amp;gt; 
&lt;br/&gt;&lt;br/&gt;
&lt;a href="https://github.com/scalate/scalate/tree/master/samples/scalate-example/src/main/webapp/coffee" style="color: #666"&gt;https://github.com/scalate/scalate/tree/master/samples/scalate-exampl...&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
e.g. here's a jade file references a separate .js file for a coffee script which gets converted to .js on the server... 
&lt;br/&gt;&lt;br/&gt;
&lt;a href="https://github.com/scalate/scalate/blob/master/samples/scalate-example/src/main/webapp/coffee/external.jade" style="color: #666"&gt;https://github.com/scalate/scalate/blob/master/samples/scalate-exampl...&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;To try out the improved CoffeeScript support, I checked out the source and fumbled with Git branches for a bit before I got latest version of Scalate to build. Unfortunately, it didn't work because Play doesn't know how to process the .js and .css files.&lt;/p&gt;
&lt;pre&gt;
@67o8fflce 
Application.foo.js action not found 
Action not found 
Action Application.foo.js could not be found. Error raised is 
Controller controllers.Application.foo not found 
play.exceptions.ActionNotFoundException: Action Application.foo.js not 
found 
        at play.mvc.ActionInvoker.getActionMethod(ActionInvoker.java: 
588) 
        at play.mvc.ActionInvoker.resolve(ActionInvoker.java:85) 
        at Invocation.HTTP Request(Play!) 
Caused by: java.lang.Exception: Controller controllers.Application.foo 
not found 
        ... 3 more 
08:20:21,133 ERROR ~
&lt;/pre&gt;
&lt;p&gt;Based on this error, I assumed I needed a Controller to do receive the .js and .css requests and compile them accordingly with Scalate. I changed my Jade template to have the following:
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
script(src="/assets/foo.js" type="text/javascript") 
&lt;/pre&gt;
&lt;p&gt;
Then I added a new route to my Play application: 
&lt;/p&gt;
&lt;pre&gt;
  GET     /                           Application.index
  GET     /assets/{template}          ScalateResource.process
&lt;/pre&gt;
&lt;p&gt;
My ScalateResource.scala class is as follows: 
&lt;/p&gt;
&lt;pre class="brush: scala"&gt;
package controllers 

import play.mvc._ 

object ScalateResource extends Controller { 

  def process(args: (Symbol, Any)*) = { 
    var template = params.get("template") 
    // replace .js with .coffee 
    template = template.replace(".js", ".coffee") 
    // replace .css with .scss 
    template = template.replace(".css", ".scss") 
    ScalateTemplate(template).render(); 
  } 
} 
&lt;/pre&gt;
&lt;p&gt;
Unfortunately, when I tried to access http://localhost:9000/assets/foo.js, I received the following error: 
&lt;/p&gt;
&lt;p class="smokey" style="background: #ffd; border: 1px solid silver"&gt;
TemplateException occured : Not a template file extension (md | markdown | ssp | scaml | mustache | jade), you requested: coffee 
&lt;/p&gt;
&lt;p&gt;At this point, I still haven't &lt;a href="http://groups.google.com/group/scalate/browse_thread/thread/868e5c1afb6d38ac"&gt;figured out how to solve this&lt;/a&gt;. I can only assume that the reason this works in the example application is because it uses a TemplateEngineFilter that's mapped to /*.
&lt;/p&gt;
&lt;p&gt;As I see it, I have a few choices if I want to continue using CoffeeScript and Scalate in my application:
&lt;ol&gt;
  &lt;li&gt;Revert to an older build of Scalate that uses the in-browser CoffeeScript compiler.&lt;/li&gt;
  &lt;li&gt;Try to get a new version released that fixes the comment bug and use inline CoffeeScript.&lt;/li&gt;
  &lt;li&gt;Keep trying to figure out how to get external files compiled by Scalate.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Obviously, I'd like to do #3 the most, but with the lack of responses from the Scalate group, this seems like the most challenging. Since #1 is the easiest (and I can complete without anyone's help), I'll be going that route for now. With any luck, the 2nd and third solutions will surface as options before my talk in November.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=92374153&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=92374153&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=92374153 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><item><guid isPermaLink="true">http://raibledesigns.com/rd/entry/mahalo_kauai</guid><title>Mahalo Kauai</title><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Matt Raible</dc:creator><link>http://raibledesigns.com/rd/entry/mahalo_kauai</link><pubDate>Mon, 26 Sep 2011 10:19:54 -0600</pubDate><category>General</category><category>travel</category><category>kauai</category><category>hawaii</category><category>vacation</category><description>I've heard great things about Hawaii for most of my life. My Dad was stationed at Barbers Point when he was in the Navy.
His sister, my Aunt Mary, was born there. My sister and I &lt;a
        href="http://raibledesigns.com/rd/entry/postcard_from_hawaii"&gt;sent my parents to Hawaii for their 30th Wedding
    Anniversary&lt;/a&gt;. You can imagine my excitement when Trish sent me an email on January 25th:
&lt;/p&gt;
&lt;p class="smokey"&gt;
    It's only 40,000 miles for both of us to fly to Kauai!! I picked the week after Labor Day just for fun :)
&lt;/p&gt;
&lt;p&gt;My response:&lt;/p&gt;
&lt;p class="smokey" style="background-color: #ffd; border: 1px solid silver"&gt;
    WAHOOOOOO! BOOK IT!!
&lt;/p&gt;
&lt;p&gt;She booked it that night. For $10.&lt;/p&gt;
&lt;p&gt;
    We left for Kuaui the morning after the disappointing Broncos home opener and a &lt;a
        href="http://www.flickr.com/photos/mraible/sets/72157627717258988/"&gt;fun
    sports weekend with Abbie and Jack&lt;/a&gt;. Our trip started out great, sneaking into the Red Carpet Club for free at
    LAX and
    getting a slew of free drinks from a super-cool flight attendant (Anthony) on our flight from LAX to Kauai.
&lt;/p&gt;
&lt;p&gt;
    After landing and marveling at the open-air airport, we picked up our rental Jeep and drove to the north side
    of the island. A friend recommended we stay at the &lt;a href="http://www.stregisprinceville.com/"&gt;St. Regis
    Princeville Resort&lt;/a&gt; and we were very
    impressed when we checked into our room overlooking &lt;a href="http://en.wikipedia.org/wiki/Hanalei_Bay"&gt;Hanalei
    Bay&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The next morning, we vowed to do nothing but relax by the pool. We enjoyed a scrumptious breakfast at the
    &lt;a href="http://www.stregisprinceville.com/dining/makana-terrace/"&gt;Mekana Terrace&lt;/a&gt;, complete with Bloody Mary's.
    We &lt;em&gt;had&lt;/em&gt;
    to have Bloody's since the St. Regis in NYC &lt;a
            href="http://ourtastytravels.com/beer-and-liquor/st-regis-hotel-new-york-city-american-birthplace-of-the-bloody-mary-cocktail/"&gt;claims
        to have
        invented them&lt;/a&gt;. We spent the rest of the day napping, swimming, sunbathing, snorkeling and sipping on Mai Tai's.
&lt;/p&gt;


&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6169/6168338302_48066fec73.jpg" title="Breakfast by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6169/6168338302_48066fec73_t.jpg" width="100"
                                      height="75" alt="Breakfast" style="border: 1px solid black"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6169/6168339678_f300c2d97f.jpg"
       title="From the St. Regis by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6169/6168339678_f300c2d97f_t.jpg" width="100"
                                      height="75" alt="From the St. Regis"
                                      style="border: 1px solid black; margin-left: 0px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6172/6168343756_e810dda19b.jpg" title="Hanalei Bay by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6172/6168343756_e810dda19b_t.jpg" width="100"
                                      height="75" alt="Hanalei Bay"
                                      style="border: 1px solid black; margin-left: 0px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6156/6168342196_7d89712f19.jpg" title="The Pool by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6156/6168342196_7d89712f19_t.jpg" width="100"
                                      height="75" alt="The Pool" style="border: 1px solid black; margin-left: 0px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6151/6167801545_e2a6f3f84b.jpg" title="Relaxing by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6151/6167801545_e2a6f3f84b_t.jpg" width="100"
                                      height="75" alt="Relaxing" style="border: 1px solid black; margin-left: 0px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;After enjoying a &lt;em&gt;beautiful&lt;/em&gt; sunset ... &lt;/p&gt;
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6154/6174598580_b6ace6880c.jpg"
       title="HDR Sunset next to the palm trees on the beach at Hanalei Bay by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6154/6174598580_b6ace6880c.jpg" width="326"
                                      height="500" alt="HDR Sunset next to the palm trees on the beach at Hanalei Bay"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;... we visited the concierge to book some activities for the rest of our
    trip.
    We wanted to take things up a notch and enjoy all the cool stuff Kuai had to offer. So we arranged for Stand Up
    Paddling and the Mailani Dinner Shown on
    Thursday, golf on Friday, a doorless helicopter ride on Saturday and a kayak trip along the Na Pali coast on Sunday.
&lt;/p&gt;
&lt;p&gt;
    We woke up Thursday refreshed and ready to go. Our view out the window was exceptional.
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6157/6174599098_da19a2c72a.jpg"
       title="Aloha in the morning at the St Regis Hanalei Bay by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6157/6174599098_da19a2c72a.jpg" width="500"
                                      height="331" alt="Aloha in the morning at the St Regis Hanalei Bay"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style="margin-bottom: 0"&gt;
    After a delicious room service breakfast in our room, we wandered down to the beach to meet our SUP guide.
    He warned us that girls were generally better than guys at SUP and we proceeded to prove him correct. Trish never
    got
    her hair wet and I had to abandon ship several times.
&lt;/p&gt;
&lt;table style="margin: 0 auto"&gt;
    &lt;tr&gt;
        &lt;td rowspan="2"&gt;
            &lt;a href="http://farm7.static.flickr.com/6151/6168341986_867673bbc4.jpg"
               title="Ready for SUP! by mraible, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6151/6168341986_867673bbc4_m.jpg"
                                              width="240" height="180" alt="Ready for SUP!"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;&lt;a href="http://farm7.static.flickr.com/6164/6168345736_400db3c287.jpg"
               title="Breakfast with a view by mraible, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
                src="http://farm7.static.flickr.com/6164/6168345736_400db3c287_t.jpg" width="100" height="75"
                alt="Breakfast with a view" style="margin: 10px 0 0 10px; border: 1px solid black"&gt;&lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td style="vertical-align: bottom"&gt;
            &lt;a href="http://farm7.static.flickr.com/6176/6167808891_2890732215.jpg"
               title="Board Meeting by mraible, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6176/6167808891_2890732215_t.jpg"
                                              width="100" height="75" alt="Board Meeting"
                                              style="margin: 10px 0 10px 10px; border: 1px solid black"&gt;&lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;p style="margin-top: 10px; margin-bottom: 0"&gt;
    That afternoon, we headed to the &lt;a href="http://www.kalalautrail.com/"&gt;The Kalalau Trail&lt;/a&gt; for a hike. Our SUP
    guide
    recommended it and said it was "so easy, your grandma could do it". His Grandma must be a lot younger than most,
    because the trail was not easy, but we certainly enjoyed the challenge.
&lt;/p&gt;
&lt;table style="margin: 0 auto" cellspacing="10"&gt;
    &lt;tr&gt;
        &lt;td rowspan="2"&gt;

            &lt;a href="http://farm7.static.flickr.com/6170/6174083163_8d1f82c3f8.jpg"
               title="Beautiful trail to Hanakapi'ai Beach and looking down the Napali Coast by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6170/6174083163_8d1f82c3f8_m.jpg"
                                              width="160" height="240"
                                              alt="Beautiful trail to Hanakapi'ai Beach and looking down the Napali Coast"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;

        &lt;td colspan="2"&gt;
            &lt;a href="http://farm7.static.flickr.com/6178/6174076267_f59f07520d.jpg"
               title="An easy 5' x 5' spot to land your helicopter? by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6178/6174076267_f59f07520d_m.jpg"
                                              width="240" height="160"
                                              alt="An easy 5' x 5' spot to land your helicopter?"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td style="text-align: center"&gt;
            &lt;a href="http://farm7.static.flickr.com/6155/6168341504_1169aeb84d.jpg"
               title="Trish at Kalalau Beach by mraible, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
                    src="http://farm7.static.flickr.com/6155/6168341504_1169aeb84d_t.jpg" width="100" height="75"
                    alt="Trish at Kalalau Beach" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td style="text-align: center"&gt;
            &lt;a href="http://farm7.static.flickr.com/6173/6167806345_7539dff1b9.jpg"
               title="Kalalau Beach by mraible, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6173/6167806345_7539dff1b9_t.jpg"
                                              width="100" height="75" alt="Kalalau Beach"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;

    &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;We were rewarded with some spectular views at Kalalau Beach.&lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6164/6168345528_69d56b600f.jpg" title="Kalalau Beach by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6164/6168345528_69d56b600f_m.jpg" width="240"
                                      height="180" alt="Kalalau Beach"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6160/6167809357_c8dc818016.jpg" title="Kalalau Beach by mraible, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6160/6167809357_c8dc818016_m.jpg" width="240"
                                      height="180" alt="Kalalau Beach"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
We made it back to the hotel just in time for the dinner show and another marvelous Hanalei sunset.
&lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6153/6174087039_b147ec5f65.jpg"
       title="Hanalei Bay Sunset HDR by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6153/6174087039_b147ec5f65.jpg" width="500" height="331"
            alt="Hanalei Bay Sunset HDR" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style="margin-bottom: 0"&gt;At the dinner show, we sat with honeymooners from Houston that worked at NASA. Since they both spoke
    Russian, we had fun discussing Russia, our trips there and how we learned the language. The dinner show
    was great and they featured quite a few of the top Hula dancers in Hawaii.&lt;/p&gt;
&lt;table style="margin: 0 auto" cellspacing="10"&gt;
    &lt;tr&gt;
        &lt;td rowspan="2"&gt;

            &lt;a href="http://farm7.static.flickr.com/6173/6174612928_f54bffb8ce.jpg"
               title="Mailani Dinner show Hula dancer from side Kauai by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6173/6174612928_f54bffb8ce_m.jpg"
                                              width="160" height="240"
                                              alt="Mailani Dinner show Hula dancer from side Kauai"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;

            &lt;a href="http://farm7.static.flickr.com/6165/6174088365_4233324c84.jpg"
               title="Mailani Dinner show Hula dancer with fire St Regis Kauai by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6165/6174088365_4233324c84_s.jpg"
                                              width="75" height="75"
                                              alt="Mailani Dinner show Hula dancer with fire St Regis Kauai"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
            &lt;br/&gt;
            &lt;a href="http://farm7.static.flickr.com/6155/6174088165_f4a29c2785.jpg"
               title="Mailani Dinner show Hula dancers with Kala'au rhythm sticks and Hui'hui feathered rattles St Regis Kauai by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6155/6174088165_f4a29c2785_s.jpg"
                                              width="75" height="75"
                                              alt="Mailani Dinner show Hula dancers with Kala'au rhythm sticks and Hui'hui feathered rattles St Regis Kauai"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
            &lt;br/&gt;
            &lt;a href="http://farm7.static.flickr.com/6154/6174088949_e9ed678d2c.jpg"
               title="Mailani Dinner show male performer St Regis Kauai by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6154/6174088949_e9ed678d2c_s.jpg"
                                              width="75" height="75"
                                              alt="Mailani Dinner show male performer St Regis Kauai"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

        &lt;/td&gt;
        &lt;td&gt;
            &lt;a href="http://farm7.static.flickr.com/6156/6174615460_6f965e27a1.jpg"
               title="Mailani Dinner Show by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
                    src="http://farm7.static.flickr.com/6156/6174615460_6f965e27a1_s.jpg" width="75" height="75"
                    alt="DSC_8184.jpg" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
            &lt;br/&gt;
            &lt;a href="http://farm7.static.flickr.com/6158/6174616820_9c97a8b854.jpg"
               title="Polynesian fireknife dancer with a fire knife Mailani Dinner Show by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6158/6174616820_9c97a8b854_s.jpg"
                                              width="75" height="75"
                                              alt="Polynesian fireknife dancer with a fire knife Mailani Dinner Show"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
            &lt;br/&gt;
            &lt;a href="http://farm7.static.flickr.com/6153/6174617386_a17432de98.jpg"
               title="Mailani Dinner show firedancer with poi Kauai 3 by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6153/6174617386_a17432de98_s.jpg"
                                              width="75" height="75"
                                              alt="Mailani Dinner show firedancer with poi Kauai 3"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;p style="margin-bottom: 0"&gt;
The next morning, we grabbed Huevos Rancheros in Princeville and headed to the &lt;a href="http://www.makaigolf.com"&gt;Makai Golf Club&lt;/a&gt;
    for a one-of-a-kind experience. Not only did they let us bring our full-stocked cooler on the course, but they rented us some
    fantastic Callaway clubs. We golfed for hours with no one in front, and no one trailing behind.
&lt;/p&gt;
&lt;table style="margin: 0 auto" cellspacing="10"&gt;
    &lt;tr&gt;
        &lt;td rowspan="2"&gt;
            &lt;a href="http://farm7.static.flickr.com/6159/6174092825_e8fcc303ef.jpg"
               title="The famous third tee drop on the Makai Golf Course over looking Hanalei Bay Kauai - Matt's drive was perfect right onto the green below by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6159/6174092825_e8fcc303ef_m.jpg"
                                              width="240" height="160"
                                              alt="The famous third tee drop on the Makai Golf Course over looking Hanalei Bay Kauai - Matt's drive was perfect right onto the green below"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td style="padding-top: 5px"&gt;
            &lt;a href="http://farm7.static.flickr.com/6159/6174622520_0f9b50e427.jpg"
               title="Makai Golf Club my pitch out of the sand is next to the pin.  Matt's is on the edge of the green :) by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6159/6174622520_0f9b50e427_t.jpg"
                                              width="100" height="67"
                                              alt="Makai Golf Club my pitch out of the sand is next to the pin.  Matt's is on the edge of the green :)"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

            &lt;a href="http://farm7.static.flickr.com/6163/6174098015_86b6c61466.jpg"
               title="Matt's drive headed toward the ravine on Makai Golf course! by McGinityPhoto, on Flickr"
               rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6163/6174098015_86b6c61466_t.jpg"
                                              width="100" height="67"
                                              alt="Matt's drive headed toward the ravine on Makai Golf course!"
                                              style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;
            &lt;a href="http://farm7.static.flickr.com/6155/6174624868_0937e07fe9.jpg"
               title="This one is a gonner too! by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
                    src="http://farm7.static.flickr.com/6155/6174624868_0937e07fe9_t.jpg" width="100" height="67"
                    alt="This one is a gonner too!" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

            &lt;a href="http://farm7.static.flickr.com/6159/6174627978_aaa37df05c.jpg"
               title="Heaven at Makai Golf Course! by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
                    src="http://farm7.static.flickr.com/6159/6174627978_aaa37df05c_t.jpg" width="100" height="67"
                    alt="Heaven at Makai Golf Course!" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

   &lt;p&gt;

       Trish's photo of the Bougainvillia on the back nine is one of my favorites.
   &lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6154/6174624336_e84fa0c139.jpg"
       title="Bougainvillia on the Makai Golf course looking across Hanalei Bay by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6154/6174624336_e84fa0c139.jpg" width="500"
                                      height="331"
                                      alt="Bougainvillia on the Makai Golf course looking across Hanalei Bay"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

        &lt;p&gt;
            We enjoyed some Blue Hawaii's at the St. Regis afterward, in a cabana that's normally reserved for $1000/day.
            We snuck in and even got the honeymooner's discount from a hometown waiter.
        &lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6153/6174630996_b292dbe061.jpg"
       title="2 Blue Hawaii on the beach in Hanalei Bay by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6153/6174630996_b292dbe061.jpg" width="500" height="333"
            alt="2 Blue Hawai'i on the beach in Hanalei Bay" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
        &lt;p&gt;
            On Saturday, I booked a tour at the &lt;a href="http://www.kauaibotanicalgardens.com/"&gt;Ahonui Botanical Gardens&lt;/a&gt;. The gardens where amazing, built by Bill and Lucinda Robertson.
            They converted a jungle of 8 acres into an elaborate garden with trees, flowers and plants from around the world.
            Since you can grow almost anything on The Garden Isle, they planted many exotic fruit trees that we had the pleasure of snacking on throughout
            our 3-hour tour. About halfway through, Lucinda treated us to an adventure in making and tasting delicious chocolates.
        &lt;/p&gt;

&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6168/6174119023_25db41790b.jpg"
       title="Heart of Palm - Paul Michell uses this in their products - it's a wonderful clear light lotion and great for hair too! by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6168/6174119023_25db41790b_t.jpg" width="100"
                                      height="67"
                                      alt="Heart of Palm - Paul Michell uses this in their products - it's a wonderful clear light lotion and great for hair too!"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6163/6174646678_8a571bb5a8.jpg"
       title="Ahonui Botanical Gardens by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6163/6174646678_8a571bb5a8_t.jpg" width="100"
                                      height="67" alt="Ahonui Botanical Gardens"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6158/6174647894_15b1fa0c69.jpg"
       title="Ahonui Botanical Gardens by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6158/6174647894_15b1fa0c69_t.jpg" width="100"
                                      height="67" alt="Ahonui Botanical Gardens"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6153/6174653582_3f6aaeaae0.jpg"
       title="Whoa, this is an Apple banana native to Hawai'i and tastes much better than regular Del Monte bananas! by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6153/6174653582_3f6aaeaae0_t.jpg" width="100"
                                      height="67"
                                      alt="Whoa, this is an Apple banana native to Hawai'i and tastes much better than regular Del Monte bananas!"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6156/6174660698_9fdecc4ff9.jpg"
       title="Lucinda Robertson gave us a great Chocolate tasting and history of chocolate.  The chocolate they made was the best of the bunch! by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6156/6174660698_9fdecc4ff9_m.jpg" width="240"
                                      height="160"
                                      alt="Lucinda Robertson gave us a great Chocolate tasting and history of chocolate.  The chocolate they made was the best of the bunch!"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6169/6174664552_553d114e4c.jpg"
       title="Bill Robertson, the owner gave us the tour which they just started doing publicly in June 2011.  It was a great experience! by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6169/6174664552_553d114e4c_m.jpg" width="240"
                                      height="160"
                                      alt="Bill Robertson, the owner gave us the tour which they just started doing publically in June 2011.  It was a great experience!"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;We rushed from the garden tour to the helicopter ride on the other side of the island. The concierge had booked us with &lt;a href="http://www.helicopters-kauai.com/"&gt;Jack Harter Helicopters&lt;/a&gt;, because they were the only ones that flew without doors (for better pictures). As soon as we lifted off, I knew it was going to be an experience of a lifetime. We flew over the Waimea Canyon, along the Na Pali Coast, over Hanalei Bay and back into the mountains to the wettest place on earth. It felt like an amusement park ride combined with an IMAX movie. Our pilot was a Hawaii native that knew the whole island and gave us an excellent tour of its features. I cannot recommend this tour enough if you're ever in Kauai.
  &lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6152/6174142517_a668627954.jpg"
       title="Bell 500 here we come! by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6152/6174142517_a668627954_m.jpg" width="240" height="160"
            alt="Bell 500 here we come!" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6156/6174674912_5ce145edc3.jpg"
       title="Honopu Valley - King Kong was filmed in this area. by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6156/6174674912_5ce145edc3_m.jpg" width="240" height="160"
            alt="Honopu Valley - King Kong was filmed in this area." style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6178/6174149421_a06193f2ee.jpg"
       title="Rainbow to Kalalau Valley Napali Coast State Park by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6178/6174149421_a06193f2ee.jpg" width="500"
                                      height="333" alt="Rainbow to Kalalau Valley Napali Coast State Park"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6167/6174676218_2bc777ce21.jpg"
       title="Looking back toward Makuaiki Point by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6167/6174676218_2bc777ce21_m.jpg" width="240" height="160"
            alt="Looking back toward Makuaiki Point" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6167/6174152557_08a2494b71.jpg"
       title="Wailua Falls - yep from Fantasy Island by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6167/6174152557_08a2494b71_m.jpg" width="240" height="160"
            alt="Wailua Falls - yep from Fantasy Island" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;

  The next morning, we had to get up early for our kayak trip. We had a wakeup call at 4:30, breakfast via room service arrived at 5 and we were packed and checked out of the hotel at 5:30. We arrived at &lt;a href="http://napalikayak.com/"&gt;Na Pali Kayak&lt;/a&gt; at 6 and quickly realized we had our work cut out for us. Both Trish and I expected the kayak trip to be like paddling across a lake and didn't know we were in for the &lt;em&gt;Everest of kayaking&lt;/em&gt; - a 17-mile journey that would take most of the day. 
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="http://farm7.static.flickr.com/6171/6174682724_1ff694d1c6.jpg"
     title="Our Put in point for Napali Coast Kayak Tour.  I couldn't bring the D700 on the kayak and the waterproof camera was futile.  I thought they would have gotten better by now? by McGinityPhoto, on Flickr"
     rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6171/6174682724_1ff694d1c6_t.jpg" width="100"
                                    height="67"
                                    alt="Our Put in point for Napali Coast Kayak Tour.  I couldn't bring the D700 on the kayak and the waterproof camera was futile.  I thought they would have gotten better by now?"
                                    class="picture"&gt;&lt;/a&gt;
We borrowed some sea-sickness medication, bought some water from our hosts and got ready for a good challenge. Unfortunately, we couldn't take Trish's camera, and the waterproof camera she bought took mediocre pictures. However, we did get to see two schools of dolphins (one even jumped into the air for us) and a couple turtles along the way. Having to paddle in unison turned out to be great couples therapy too. 
  &lt;/p&gt;

&lt;p&gt;We enjoyed lunch on a beach along the coast around 1, took a nap and hopped back in the boats for the last 5 miles. We pulled out around 4 and were on the road by 5 for the 2.5 hour drive back to Hanalei Bay. It was country dark when we arrived. We hopped in the Jeep and drove an hour back across the island to stay at the &lt;a href="http://www.sheraton-kauai.com/"&gt;Sheraton Kauai&lt;/a&gt; (the St. Regis was full) for our last night.
&lt;/p&gt;
&lt;p&gt;At the Sheraton, we had one of their best rooms and enjoyed awesome views and a final relaxing day before heading home.&lt;/p&gt; 
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6159/6174157829_2eff6ea090.jpg"
       title="View from The Sheraton by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6159/6174157829_2eff6ea090_m.jpg" width="240"
                                      height="160" alt="View from The Sheraton"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;

    &lt;a href="http://farm7.static.flickr.com/6175/6174159433_3225211761.jpg"
       title="Hibiscus! by McGinityPhoto, on Flickr"
       rel="lightbox[kauai2011]"&gt;&lt;img src="http://farm7.static.flickr.com/6175/6174159433_3225211761_m.jpg" width="240"
                                      height="160" alt="Hibiscus!"
                                      style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The Tunnel of Trees on the way to the airport was one last reminder of how beautiful Kauai is.
  &lt;/p&gt;
&lt;p style="text-align: center"&gt;
    &lt;a href="http://farm7.static.flickr.com/6155/6174160455_a2c948e55d.jpg"
       title="The Tunnel of Trees Kauai! by McGinityPhoto, on Flickr" rel="lightbox[kauai2011]"&gt;&lt;img
            src="http://farm7.static.flickr.com/6155/6174160455_a2c948e55d.jpg" width="500" height="332"
            alt="The Tunnel of Trees Kauai!" style="border: 1px solid black; margin-left: 10px"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Mahalo Kauai. You are one of the most breathtaking places I have ever been too. Your views, your waves, your rainbows - all spectacular. Trish and I will be back, you've made an impression on us that will last forever.&lt;/p&gt;
&lt;p&gt;If you'd like to see many of the places we visited in a movie, check out &lt;a href="http://en.wikipedia.org/wiki/Soul_Surfer_%28film%29"&gt;Soul Surfer&lt;/a&gt;. It takes place in Hanalei Bay and we recognized many of the locations while watching it. For more pictures, see my &lt;a href="http://www.flickr.com/photos/mraible/sets/72157627717263054/"&gt;Shareholders Meeting in Kauai&lt;/a&gt; or &lt;a href="http://www.flickr.com/photos/mcginityphoto/sets/72157627608599875/"&gt; Trish's magnificent photos&lt;/a&gt;.&lt;p&gt;&lt;a href=http://nimbb.com&gt;&lt;span style=&amp;quote;text-decoration:none; font-family: Verdana, Arial;&amp;quote;&gt;&lt;img src="http://service.nimbb.com/Images/logo.png" border=0&gt; Webcam video recording in your browser!&lt;/span&gt;&lt;/a&gt; &lt;p&gt;&lt;a href=http://www.rsscache.com/Section/Advertise/click.aspx?n=92349746&gt;&lt;img src="http://www.rsscache.com/Section/Advertise/ads.aspx?n=92349746&amp;f=133" border=0&gt;&lt;/a&gt;&lt;p&gt;&lt;div style="font-size: 8pt;"&gt;&lt;img align=left src=http://www.rsscache.com/Section/Stats/logo.aspx?n=92349746 border=0&gt; Bandwidth saved by &lt;a href=http://www.rsscache.com&gt;RSScache.com&lt;/a&gt;&lt;/div&gt;</description></item><rsscache:id>133</rsscache:id></channel></rss>
