<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUcCRXc-eip7ImA9WhRUGUs.&quot;"><id>tag:blogger.com,1999:blog-20096602</id><updated>2012-01-30T15:44:24.952-08:00</updated><category term="ruby" /><category term="buttons" /><category term="2009" /><category term="web-inf" /><category term="java" /><category term="rails jquery" /><category term="360flex" /><category term="tutorial" /><category term="junit" /><category term="flex3" /><category term="annotations" /><category term="maven" /><category term="maven2" /><category term="conference" /><category term="flex" /><category term="mvc" /><category term="log4j" /><category term="interface" /><category term="objective-c" /><category term="day2" /><category term="grails" /><category term="controller" /><category term="node" /><category term="iphone" /><category term="method-injection" /><category term="ruby rvm" /><category term="agile" /><category term="atlanta" /><category term="ejb" /><category term="tips" /><category term="spring" /><category term="nokogiri" /><category term="vim" /><category term="eclipse" /><category term="bean" /><category term="xdoclet" /><category term="summary" /><category term="code" /><category term="actionscript" /><category term="newline" /><category term="w3c" /><category term="2008" /><title>geeky ninja</title><subtitle type="html">Programmer by day; ninja at night.  Currently interested in clean code, BDD, and Ruby on Rails.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://geekyninja.blogspot.com/" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/kBECz" /><feedburner:info uri="blogspot/kbecz" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DkYARn8zfyp7ImA9WhZQFkw.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-7807456028194266319</id><published>2011-04-16T11:59:00.000-07:00</published><updated>2011-04-23T20:02:27.187-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-23T20:02:27.187-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rails jquery" /><title>Replace Prototype with jQuery in Rails 3</title><content type="html">Note: I'm using Rails 3.0.3.&lt;br /&gt;
&lt;br /&gt;
I decided to use jQuery instead of Protoype on my personal Rails 3 project. &amp;nbsp;At first, I naively thought that I could simply include jQuery instead of Prototype, and everything would run just fine. &amp;nbsp;Instead, I noticed that Chrome was reporting an error in rails.js, which eventually led me to &lt;a href="http://joshhuckabee.com/jquery-rails-3"&gt;Josh Huckabee's blog post&lt;/a&gt;, as well as the official &lt;a href="https://github.com/rails/jquery-ujs"&gt;jquery-rails gem&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The installation instructions on the github page are straightforward and simple, so I won't reproduce them here. &amp;nbsp;After you add the gem to your Gemfile and install it, and you run the command:&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #444444; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;  rails generate jquery:install&lt;/span&gt;&lt;br /&gt;
it will pull down the latest version of jQuery. &amp;nbsp; You should answer "yes" when it asks if you want to overwrite rails.js.&lt;br /&gt;
&lt;br /&gt;
I modified my default layout (application.html.erb) to include this line:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;%= javascript_include_tag "jquery-1.5.2.min", "jquery.jeditable.mini.js", "rails", "application" %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Of course, you might not need some of these, and you can include additional files as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-7807456028194266319?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Qnwyir_Qlsp72wVOYoZr4ZVWn7c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qnwyir_Qlsp72wVOYoZr4ZVWn7c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Qnwyir_Qlsp72wVOYoZr4ZVWn7c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Qnwyir_Qlsp72wVOYoZr4ZVWn7c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/DoLiRHpFXLg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/7807456028194266319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=7807456028194266319" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/7807456028194266319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/7807456028194266319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/DoLiRHpFXLg/replace-prototype-with-jquery-in-rails.html" title="Replace Prototype with jQuery in Rails 3" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2011/04/replace-prototype-with-jquery-in-rails.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08DQHo4cSp7ImA9Wx9QGE0.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-4642301653304700239</id><published>2010-12-31T07:36:00.000-08:00</published><updated>2010-12-31T07:37:51.439-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-31T07:37:51.439-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><title>vim tip: searching for word under cursor</title><content type="html">I was motivated to use vim a few years ago, after watching &lt;a href="http://www.coreyhaines.com/"&gt;Corey Haines&lt;/a&gt; do his &lt;a href="http://katas.softwarecraftsmanship.org/?p=12"&gt;number to LCD kata&lt;/a&gt; at the &lt;a href="http://sdtconf.com/"&gt;Simple Design and Testing Conference&lt;/a&gt; (SDTConf).  Although I learned the basics while I was in college, I never really tried to progress beyond that until recently.&lt;br /&gt;
&lt;br /&gt;
Now I try to make a habit of whenever I am doing something that just seems like it's the hard way, I'll google it and learn how to do it better.&lt;br /&gt;
&lt;br /&gt;
Today, I was thinking: there has to be a better way to search for things rather than typing "/thing_to_search_for".  So I found out how to search for the word under the cursor, which is # for searching backwards, and * for searching forwards.&lt;br /&gt;
&lt;br /&gt;
Hope this helps, and motivates you to keep learning something new everyday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-4642301653304700239?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UjpjbK_2G96Yl9VWIN4_dAiModo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UjpjbK_2G96Yl9VWIN4_dAiModo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UjpjbK_2G96Yl9VWIN4_dAiModo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UjpjbK_2G96Yl9VWIN4_dAiModo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/wBuYOyREbI8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/4642301653304700239/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=4642301653304700239" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4642301653304700239?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4642301653304700239?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/wBuYOyREbI8/vim-tip-searching-for-word-under-cursor.html" title="vim tip: searching for word under cursor" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2010/12/vim-tip-searching-for-word-under-cursor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAFR304fSp7ImA9Wx9QEU8.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-2448594352089699281</id><published>2010-12-23T07:48:00.000-08:00</published><updated>2010-12-23T10:08:36.335-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-23T10:08:36.335-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby rvm" /><title>Installing ruby 1.9.2 with rvm</title><content type="html">I've been having trouble installing ruby 1.9.2 with rvm on Mac OS X.&lt;br /&gt;
Although there are lots of &lt;a href="http://www.markhneedham.com/blog/2010/07/08/installing-ruby-1-9-2-with-rvm-on-snow-leopard/trackback/"&gt;great&lt;/a&gt; &lt;a href="http://blog.plataformatec.com.br/2010/04/rails-3-with-rvm-ftw/"&gt;blog&lt;/a&gt; posts with solutions, for some reason, none of them worked for me.&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://rvm.beginrescueend.com/packages/iconv/"&gt;rvm page&lt;/a&gt; and many posts say to pass &lt;code&gt;--with-iconv-dir&lt;/code&gt; to &lt;code&gt;rvm install&lt;/code&gt;.&lt;br /&gt;
However, I kept getting errors about Tcl/Tk not being 64-bit, and iconv also not being 64-bit.&lt;br /&gt;
Why would it be complaining about iconv, especially since I used rvm to install it?&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/753317.js"&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
I noticed the config.log spit this out:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;configure: WARNING: unrecognized options: --with-iconv-dir&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;I tried many options that were in configure, but none of them pointed the makefile to rvm's version of iconv.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;So I took a look at /usr/local/lib/libiconv.2.dylib and noticed it was a symlink.&lt;br /&gt;
Perhaps this is taking the easy way out, but I backed it up by renaming it, and relinking that to the version inside $rvm_path.&lt;/div&gt;&lt;div&gt;After that, I recompiled by running:&lt;/div&gt;&lt;code&gt;&lt;br /&gt;
&amp;nbsp;rvm install 1.9.2 -C --enable-shared&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Success!&lt;br /&gt;
The output: &lt;br /&gt;
&lt;script src="https://gist.github.com/753320.js"&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Hopefully, this helps some of you out there with similar problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-2448594352089699281?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9u0KSbHhCnpLTPrLsR2In6gmzD8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9u0KSbHhCnpLTPrLsR2In6gmzD8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9u0KSbHhCnpLTPrLsR2In6gmzD8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9u0KSbHhCnpLTPrLsR2In6gmzD8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/Z8DUgSIwghQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/2448594352089699281/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=2448594352089699281" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/2448594352089699281?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/2448594352089699281?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/Z8DUgSIwghQ/installing-ruby-192-with-rvm.html" title="Installing ruby 1.9.2 with rvm" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2010/12/installing-ruby-192-with-rvm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EHRXk_eyp7ImA9Wx9SFUQ.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-9120339749325984054</id><published>2010-12-05T17:40:00.000-08:00</published><updated>2010-12-05T17:40:34.743-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-05T17:40:34.743-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="nokogiri" /><title>Installing Nokogiri with bundler</title><content type="html">I recently decided to start contributing to open source, so I chose to look at one of my favorite Ruby gems, &lt;a href="https://github.com/rspec/rspec-dev"&gt;rspec&lt;/a&gt;.&lt;br /&gt;
The instructions to get you started are fairly straightforward; however, in the rspec-core repository, bundler was failing to install nokogiri. &amp;nbsp;Although the instructions &lt;a href="http://www.pervasivecode.com/blog/2010/03/17/making-bundler-0-8-5-install-nokogiri-on-leopard-with-a-newish-libxml/trackback/"&gt;here&lt;/a&gt; worked for some, it didn't work for me. &amp;nbsp;So based on the instructions on the Nokogiri homepage, I used macports to install libxml2 and libxlst, re-ran rake, and finally, bundler was able to install nokogiri, with no problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-9120339749325984054?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QFU3mQtgFawzsGApVjln9h7YYsA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QFU3mQtgFawzsGApVjln9h7YYsA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QFU3mQtgFawzsGApVjln9h7YYsA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QFU3mQtgFawzsGApVjln9h7YYsA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/1biFZtaJzbY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/9120339749325984054/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=9120339749325984054" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/9120339749325984054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/9120339749325984054?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/1biFZtaJzbY/installing-nokogiri-with-bundler.html" title="Installing Nokogiri with bundler" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2010/12/installing-nokogiri-with-bundler.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYFR3w6fyp7ImA9Wx5UEk4.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-4944724270502579278</id><published>2010-10-15T21:51:00.000-07:00</published><updated>2010-10-16T07:08:36.217-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-16T07:08:36.217-07:00</app:edited><title>"Failure of State" by Uncle Bob - SCNA 2010</title><content type="html">&lt;div&gt;&lt;div&gt;This is the first of many blog posts to come, with my notes on the talks given at SCNA 2010.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This morning, on the first day, Uncle Bob gave a talk titled "Failure of State."  My notes on the talk are below. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;SICP -&lt;/b&gt; Uncle Bob has mentioned this book many times, and I finally put it on my Kindle today.  As a craftsman, you should definitely read this book.  It's free but if you can, buy it to support the authors.  There are also free lectures available as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The substitution model&lt;/b&gt; - you can replace function calls repeatedly, ending up with a "silly" version but one that is also stateless and thread-safe.  The example given was a program that printed the squares of the first twenty (20) integers.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many stateful programs exhibit &lt;b&gt;temporal coupling&lt;/b&gt;; that is one statement (function/method/etc) must be called before another.  In other words, time matters.  For example, opening a file, then closing it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However; in functional programming, y=f(x) no matter when you call it and every time you call it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Programming has seen three failures so far: 1) the GOTO statement; 2) pointers to functions, and 3) state.  Finally, Uncle Bob showed the CQRS pattern, where CRUD is separated into CUD and R.  &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-4944724270502579278?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VWdEPJfHjpstKasSVQRJtDgDWa8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VWdEPJfHjpstKasSVQRJtDgDWa8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VWdEPJfHjpstKasSVQRJtDgDWa8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VWdEPJfHjpstKasSVQRJtDgDWa8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/SQOlKPgolcU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/4944724270502579278/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=4944724270502579278" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4944724270502579278?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4944724270502579278?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/SQOlKPgolcU/failure-of-state-by-uncle-bob-scna-2010.html" title="&quot;Failure of State&quot; by Uncle Bob - SCNA 2010" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2010/10/failure-of-state-by-uncle-bob-scna-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQASXs7fSp7ImA9Wx5WGEo.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-7955701416660377298</id><published>2010-09-28T11:44:00.001-07:00</published><updated>2010-09-30T12:02:28.505-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-30T12:02:28.505-07:00</app:edited><title>JavaScript documentation</title><content type="html">I am doing my part to help others find good JavaScript documentation and tutorials.&lt;br /&gt;&lt;br /&gt;Googling "JavaScript tutorial" or "JavaScript documentation" doesn't provide any good links.&lt;br /&gt;&lt;br /&gt;The Promote JS campaign aims to change this, so that we all can find better JavaScript documentation, such as the docs &lt;a href="https://developer.mozilla.org/en/JavaScript"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please spread the word! Go to &lt;a href="http://promotejs.com/"&gt;http://promotejs.com/&lt;/a&gt; for more information, and place a link and banner on your blog or homepage.&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function" title="JavaScript JS Documentation: JS Function length, JavaScript Function length, JS Function .length, JavaScript Function .length"&gt;&lt;img src="http://static.jsconf.us/promotejsvs.png" alt="JavaScript JS Documentation: JS Function length, JavaScript Function length, JS Function .length, JavaScript Function .length" width="160" height="280" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-7955701416660377298?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-l0jRvUKAgAbd6IRlCWlKCCVjyQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-l0jRvUKAgAbd6IRlCWlKCCVjyQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-l0jRvUKAgAbd6IRlCWlKCCVjyQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-l0jRvUKAgAbd6IRlCWlKCCVjyQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/6r8ULyCjRUU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/7955701416660377298/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=7955701416660377298" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/7955701416660377298?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/7955701416660377298?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/6r8ULyCjRUU/javascript-documentation.html" title="JavaScript documentation" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2010/09/javascript-documentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IBQ3w8eip7ImA9WxNbF0k.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-5333491759710889010</id><published>2009-11-18T10:56:00.000-08:00</published><updated>2009-11-20T11:32:32.272-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-20T11:32:32.272-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="objective-c" /><title>Objective-C Object Instantiation</title><content type="html">Today we'll go over the syntax to create an instance of a class.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New? &lt;/span&gt;&lt;br /&gt;In Java (and C++, to dynamically allocate an instance of a class), you use the &lt;span style="font-weight: bold;"&gt;new&lt;/span&gt; keyword.  Objective-C's equivalent is the &lt;span style="font-weight: bold;"&gt;alloc&lt;/span&gt; keyword.&lt;br /&gt;I wish I could say that's the end of the story, but there is a bit more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Initializers&lt;/span&gt;&lt;br /&gt;As in Java and C++, a constructor, and its superclass' constructor, and the superclass' superclass' constructor, and so on, are called in order from superclass to subclass to its subclass, etc.&lt;br /&gt;In Objective-C, constructors are called &lt;span style="font-style: italic;"&gt;initializers&lt;/span&gt;, and you can consider the init: method to be equivalent to a default initializer; i.e. one that takes no arguments and is supplied by the compiler unless you specify one yourself.&lt;br /&gt;&lt;br /&gt;What if you wanted to create initializers that take arguments?  By convention, it's recommended to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;begin the initializer name with init&lt;/li&gt;&lt;li&gt;name the initializer to include the word "with"&lt;/li&gt;&lt;/ol&gt;An example might be on a Person class:  initWithGivenName: (NSString*) name&lt;br /&gt;Another convention is that the initializer initializes only the attributes that need to be initialized, and any other values can be set w/setter methods or through other means.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Return type&lt;/span&gt;&lt;br /&gt;A"gotcha" compared to C++ and Java:  the return type on these initializers have a return type of (id), not the name of the current class.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Designated initializers&lt;/span&gt;&lt;br /&gt;Objective-C has the concept of a designated initializer.  This is defined as the one that guarantees that all instance variables are initialized.  While your subclass does not necessarily have to invoke a designated initializer on &lt;span style="font-style: italic;"&gt;its&lt;/span&gt; class, it eventually must call a superclass' designated initializer.  NSObject, the superclass of all classes, which is similar to Object in Java, contains a designated initializer called simply, init:.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What to return in an initalizer&lt;/span&gt;&lt;br /&gt;An initializer either returns "self" which is like "this" in Java and C++,  upon successful initialization, or nil if a failure occured.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ok, so how do I put this all together?&lt;/span&gt;&lt;br /&gt;Although you &lt;span style="font-style: italic;"&gt;could&lt;/span&gt; make two separate calls and "throw away" the value of alloc, it's not recommended.  The convention is to chain the calls together on one line like this:&lt;br /&gt;&lt;br /&gt;SomeClass *pointerToSomeClass = [[ SomeClass alloc] init];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-5333491759710889010?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jTnCZU0xVgFpee5g1H5Qe0QukqU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jTnCZU0xVgFpee5g1H5Qe0QukqU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jTnCZU0xVgFpee5g1H5Qe0QukqU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jTnCZU0xVgFpee5g1H5Qe0QukqU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/S1g_dWjUR7A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/5333491759710889010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=5333491759710889010" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/5333491759710889010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/5333491759710889010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/S1g_dWjUR7A/objective-c-object-instantiation.html" title="Objective-C Object Instantiation" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2009/11/objective-c-object-instantiation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8FSH4_eSp7ImA9WxNbFkg.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-3972044532484251145</id><published>2009-11-18T10:03:00.000-08:00</published><updated>2009-11-19T10:53:39.041-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-19T10:53:39.041-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="objective-c" /><title>iPhone / Objective-C tips</title><content type="html">Even if you've programmed in C, C++, and/or Java, some of the Objective-C syntax might take a while to get used to.&lt;br /&gt;Here are a few tips to keep in mind when you're starting out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#import "AClassThatINeed.h"&lt;/span&gt; : Referring to other classes&lt;br /&gt;In C++, when you want to refer to another class, you #include the appropriate header file.  You can safely #include it when you put #define/#ifndef guards.  In Java, you only need to import the class if it's in a different package than the class you are currently modifying.&lt;br /&gt;&lt;br /&gt;However, in Objective-C, it's a little different.  Let's see how.&lt;br /&gt;&lt;br /&gt;Let's say you're in the header file for SomeClass (SomeClass.h), and you need to refer to other classes.  You could #import those other header files, but most likely you'll run into compilation issues.  Instead, just add a forward declaration, such as   @class AClassThatINeed&lt;br /&gt;&lt;br /&gt;Then, when you're in the implementation file (SomeClass.m), you can safely #import "AClassThatINeed.h"&lt;br /&gt;&lt;br /&gt;So, to sum it up: use @class in your header files and use #import in your class files.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Method (Message) declarations, and stranger syntax: calling them&lt;br /&gt;&lt;/span&gt;This can get a little confusing.  The first parameter, at least as far as I know, is not required to be named, whereas any additional parameters, while not required, should be be explicitly named to improve the readability of your code.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;- (void)setWidth:(float)width&lt;br /&gt;- (void)setWidth:(float)width height:(float)height;&lt;br /&gt;&lt;br /&gt;In the first listing, setWidth only takes one parameter, and might be called like this:&lt;br /&gt;[myObject setWidth:25.0];&lt;br /&gt;&lt;br /&gt;The second one will be called like:&lt;br /&gt; [myObject setWidth:25.0 height:32.5];&lt;br /&gt;&lt;br /&gt;Notice how the second version requires us to use the argument name before the colon that was in the method declaration.  This was supposedly done to improve readability of the code when you have long parameter lists, but personally I think that's a code smell.  While I do think having the labels helps out, having 3 or more parameters just adds more noise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-3972044532484251145?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2-XRvVS2Xp3ud7RxdsAZMSy7k74/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2-XRvVS2Xp3ud7RxdsAZMSy7k74/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2-XRvVS2Xp3ud7RxdsAZMSy7k74/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2-XRvVS2Xp3ud7RxdsAZMSy7k74/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/ti0O8N-wHOY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/3972044532484251145/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=3972044532484251145" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/3972044532484251145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/3972044532484251145?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/ti0O8N-wHOY/iphone-objective-c-tips.html" title="iPhone / Objective-C tips" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2009/11/iphone-objective-c-tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQDR389fCp7ImA9WxNbFUs.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-3738731086169886907</id><published>2009-09-19T09:04:00.000-07:00</published><updated>2009-11-18T10:02:56.164-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-18T10:02:56.164-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="2009" /><category scheme="http://www.blogger.com/atom/ns#" term="summary" /><title>Agile 2009 summary</title><content type="html">&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_tXq6rbEGp8o/Ss1MBdAjotI/AAAAAAAAIM4/BcSQZcrM-VI/s320/DSC_0495.jpg" alt="" id="BLOGGER_PHOTO_ID_5390047916882895570" border="0" /&gt;&lt;br /&gt;I guess it's better late than never, but here's some of the highlights from Agile 2009.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div&gt;&lt;b&gt;Clean Code Craftsmanship &lt;/b&gt;by "Uncle Bob" Martin&lt;/div&gt;&lt;div&gt;This was an excellent talk about software craftsmanship; some of the points that I particularly enjoyed:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Plans are useless, but planning is indispensable.&lt;/li&gt;&lt;li&gt;In software, cost of change is low, so the later you think about them, the better.&lt;/li&gt;&lt;li&gt;No grand redesigns.&lt;/li&gt;&lt;li&gt;The only way to go fast... is to go well. Basically, you have to put in quality, which contrary to popular opinion, does not slow you down but in fact allows you to go faster.  Code doesn't rot; we make it that way and it's our responsibility to keep the code clean.&lt;/li&gt;&lt;li&gt;Green band: Uncle Bob wears a green wristband to remind him to always keep the code clean, and you can get one &lt;a href="http://butunclebob.com/ArticleS.UncleBob.GreenWristBand"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;TDD: By following the &lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd"&gt;three laws of TDD&lt;/a&gt;, you can always have clean, simple, testable code.&lt;/li&gt;&lt;li&gt;Most attendees had short iterations of either one week or 2 weeks. Uncle Bob said that perhaps when he asks again next time, iterations may be even shorter!&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Debugging Pair Programming &lt;/b&gt;by Matt Wynne&lt;/div&gt;&lt;div&gt;Although I couldn't stay for the entire session, since I had to leave to prepare for another day of &lt;a href="http://agile2009.agilealliance.org/programmingwiththestars"&gt;Programming with the Stars&lt;/a&gt;, I thought the session started out okay by identifying the benefits of pair programming. &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;High truck number: I've never heard of this phrase before this session. Basically it means that when you pair, you are spreading the knowledge so that it's not just one person who's the expert as in most traditional projects.  So if that expert were to get hit (god forbid) by a truck, the team would still be okay.  So you can have more people hit by trucks, and the team can still function.&lt;/li&gt;&lt;li&gt;Free training &lt;/li&gt;&lt;li&gt;Instant code reviews&lt;/li&gt;&lt;li&gt;Team building: cheaper than going out for paintball, and less painful.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Each table had a large sheet of paper, some sticky notes, markers, and a persona. This persona was basically someone that may or may not have heard of pair programming, and listed their reasons for not adopting it.  Our goal was to list the reasons why they may be afraid to adopt pair programming.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My first table was fine since everyone took a sticky and shared their thoughts.  Then we were asked to keep one person at the table, and everyone else move to another table.  The person remaining was to explain what we talked about and then discuss how to overcome those barriers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, at the second table,  I think because there were no moderators, each discussion ended up turning into arguments.  Also, some participants' views were not being recorded since the sticky notes weren't being used and it seemed like the guy at the table was filtering out comments.  It may have been unintentional but it would have been good to get everyone's input.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://www.infoq.com/presentations/integration-tests-scam"&gt;Integration Tests are a Scam&lt;/a&gt; &lt;/b&gt;by &lt;a href="http://www.jbrains.ca/"&gt;J.B. Rainsberger&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Originally, I had recorded the audio on my iPhone, and I was going to listen to the whole thing and write down the key points but I think it's unnecessary now since I'd be repeating what everyone else has already written.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To sum it up in a few sentences: basically with integration tests, you end up with a lot of duplication.  The tests become slow and brittle, and as we all know, slow tests end up not being run.  We want to make sure that in our unit tests that communicate with collaborators, that we are:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;mocking out the collaborators&lt;/li&gt;&lt;li&gt;making sure we are sending messages (parameters) that they can actually handle&lt;/li&gt;&lt;li&gt;ensuring that they respond the way we think they do&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;This is done with collaboration and contract tests.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is not to say acceptance tests are useless, because they test the entire system from end-to-end.  It's that with the right collaboration and contract tests, you do not need to write any integration tests, and therefore, keep your tests DRY.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;a href="http://agile2009.agilealliance.org/programmingwiththestars"&gt;Programming with the Stars 2009&lt;/a&gt;&lt;/b&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 213px;" src="http://3.bp.blogspot.com/_tXq6rbEGp8o/Ss1MSzFMjKI/AAAAAAAAINA/A5y5BktHsaE/s320/DSC_0481.jpg" alt="" id="BLOGGER_PHOTO_ID_5390048214865710242" border="0" /&gt;&lt;/div&gt;&lt;div&gt;I was lucky enough to be selected as a participant in Programming with the Stars 2009, and the star I was paired with was &lt;a href="http://www.renaissancesoftware.net/blog/"&gt;James Grenning&lt;/a&gt;, the creator of planning poker and an expert at TDD in C and C++, especially in embedded software.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;First day&lt;/i&gt;&lt;/div&gt;&lt;div&gt;The first day, we were tasked with refactoring existing code.  I hadn't programmed in C and C++ in over 5 years, so I had a lot of catching up to do.  Thanks to James, I was able to get up to speed in running unit tests, refactoring, etc in Eclipse.  We were given only 3 minutes to perform.  When you're up there pair programming in front of a live audience, the time really flies!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Day 2&lt;/i&gt;&lt;/div&gt;&lt;div&gt;We made it to day 2, where our task was TDD from scratch.  It was another exciting day, but both James and I performed on an empty stomach since the competition was far away from lunch.  We were given 5 minutes this time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Day 3&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Somehow, we survived day 2 and made it to day 3, where our task was a 6-minute SDD performance.  We used FitNesse and CSlim to show the development of  a home automation user story.  I was amazed at how FitNesse could integrate with so many languages.&lt;/div&gt;&lt;div&gt;It was a close call this day, as we were in the bottom two pairs, but thanks to the audience, we were saved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Final Day&lt;/i&gt;&lt;/div&gt;&lt;div&gt;The final day's assignment was a 6-minute freestyle performance.  There was a coin toss to see which team would go second since throughout the competition, it seemed like going first was a disadvantage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So it would be the team of Gerard Meszaros and Ola Ellnestam, or Grenning/Chien. The non-star partners were called up to call heads or tails.  Ola called tails, but during the coin toss, it hit the podium and I called "interference." :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;James and I decided to recap what we did throughout the whole week.  Some of the judges liked the idea; others didn't.  It was okay; we were only down by 2 points.  After the scoring,the audience was asked to vote by writing down their score, from 1 to 10 for each of the pairs.   While that was going on, the bonus round was announced: write "Hello Programming with the Stars" to the console using any language, but with the following conditions:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Leave the computer in its current state&lt;/li&gt;&lt;li&gt;Disable the mouse&lt;/li&gt;&lt;li&gt;The star can only type with his left hand, typing only the keys that the left hand normally types.  The other partner has to type with his right hand, typing only the letters/keys that the right hand normally types.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;While Meszaros/Ellnestam were performing, the audience's votes, averaged and multiplied by three gave Meszaros/Ellnestam an additional lead of three more points.  &lt;/div&gt;&lt;div&gt;James and I were thinking of what language to use and decided on C.  I had already typed it up and executed it on my personal laptop, using vi and the terminal.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, when we went up there, I was confused since we wrote it in Eclipse.  Although we finally figured out how to run the program, we were a little too late.  The other team finished in 1:28; we finished in 2:49.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although we ended up with second place, I thought the entire competition was a lot of fun.  It was great working with James Grenning, and meeting the other stars and competitors, as well the hosts and judges.  I learned a lot, and it was an experience that I'll never forget.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Overall summary of Agile 2009&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This was my first time attending an Agile conference, and I really enjoyed it.  I made a lot of friends, learned a lot of new things, and I'd definitely recommend going to this conference if you've never gone.  Hope to see you next year at &lt;a href="https://www.agile2010.org/home"&gt;Agile 2010&lt;/a&gt;!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-3738731086169886907?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SF7vy4qDusJZTc7vxMt4ppMXwLw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SF7vy4qDusJZTc7vxMt4ppMXwLw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SF7vy4qDusJZTc7vxMt4ppMXwLw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SF7vy4qDusJZTc7vxMt4ppMXwLw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/aFPCHN0aFs8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/3738731086169886907/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=3738731086169886907" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/3738731086169886907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/3738731086169886907?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/aFPCHN0aFs8/agile-2009-summary.html" title="Agile 2009 summary" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tXq6rbEGp8o/Ss1MBdAjotI/AAAAAAAAIM4/BcSQZcrM-VI/s72-c/DSC_0495.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2009/09/agile-2009-summary.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UASHc9fSp7ImA9WxJXGEg.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-4087876417345550162</id><published>2009-06-12T16:58:00.000-07:00</published><updated>2009-06-12T17:00:49.965-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-12T17:00:49.965-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mvc" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="annotations" /><title>We're back!</title><content type="html">Geekyninja is back, after a long hiatus!  I'll be blogging both here and at &lt;a href="http://criticalphase.com"&gt;Critical Phase&lt;/a&gt;.  Check out my new entry regarding Spring MVC 2.5 and all that annotated controller goodness: &lt;a href="http://69.89.10.41/?p=39"&gt;Fun with Spring MVC 2.5 Annotations&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-4087876417345550162?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/feWumPN_gPRWRI03T3G2CgAVD6Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/feWumPN_gPRWRI03T3G2CgAVD6Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/feWumPN_gPRWRI03T3G2CgAVD6Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/feWumPN_gPRWRI03T3G2CgAVD6Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/3JR-XmndOSE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/4087876417345550162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=4087876417345550162" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4087876417345550162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4087876417345550162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/3JR-XmndOSE/were-back.html" title="We're back!" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2009/06/were-back.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMSHk5cCp7ImA9WxRaF0g.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-6297494774074909361</id><published>2008-12-19T11:38:00.000-08:00</published><updated>2008-12-19T21:19:49.728-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-19T21:19:49.728-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maven2" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><title>Easy dependency management with m2eclipse</title><content type="html">If you've ever used Maven, or are currently using it, you know that most of the time, it can be a pain to add a new dependency.&lt;br /&gt;&lt;br /&gt;So you know how it goes.  You need a new JAR; you fire up your browser of choice, go to the central repository and hunt for the jar that you need.  You finally find it after digging through all the folders, then open up pom.xml and add the group id, artifact id, optional version number, etc., and finally, run maven to get the new jar.&lt;br /&gt;Easy huh? ;)&lt;br /&gt;&lt;br /&gt;With the m2eclipse plugin, (available at &lt;a href="http://m2eclipse.sonatype.org/update/" target="_new"&gt;http://m2eclipse.sonatype.org/update/&lt;/a&gt;), you no longer have to go through that multi-step process.&lt;br /&gt;&lt;br /&gt;If you haven't added the update site before, you'll have to add it manually.&lt;br /&gt;1. Go to Help -&gt; Software Updates -&gt; Find and install&lt;br /&gt;2. Choose the "Search for new features to install" option and click Next&lt;br /&gt;3. Click "New Remote Site..."&lt;br /&gt;4. Enter "m2eclipse" for the name and enter the URL http://m2eclipse.sonatype.org/update/&lt;br /&gt;&lt;br /&gt;Now you add dependencies automatically when:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Right clicking on the project&lt;/span&gt; and going to Maven -&gt; Add dependency.&lt;br /&gt;and&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;During coding&lt;/span&gt;: code as you normally do, and when Eclipse complains that the class can't be found, you can click on the red "x" and find the dependency by going through the central repository!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the example below, I added the @RequestMapping annotation to my Spring 2.5 Controller, and since I didn't have the jar in my local repository, Eclipse notified me of the error. (&lt;span style="font-style: italic;"&gt;Figure 1&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Clicking on "Search dependency for RequestMapping" then searched the repository, and provided a listing of potential matching jars.  Select the one you want and the rest is automatically taken care of! (&lt;span style="font-style: italic;"&gt;Figure 2&lt;/span&gt;)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tXq6rbEGp8o/SUwIkY-CwkI/AAAAAAAAIHk/D8A5ow6n2Y0/s1600-h/m2a.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 161px;" src="http://2.bp.blogspot.com/_tXq6rbEGp8o/SUwIkY-CwkI/AAAAAAAAIHk/D8A5ow6n2Y0/s320/m2a.jpg" alt="" id="BLOGGER_PHOTO_ID_5281605884269740610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Figure 1: &lt;/span&gt;Clicking on the red "x" brings up a context menu where you can search the Maven central repository&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tXq6rbEGp8o/SUwIz_a5asI/AAAAAAAAIHs/cHGr0vLukWY/s1600-h/m2b.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 97px;" src="http://3.bp.blogspot.com/_tXq6rbEGp8o/SUwIz_a5asI/AAAAAAAAIHs/cHGr0vLukWY/s320/m2b.jpg" alt="" id="BLOGGER_PHOTO_ID_5281606152289348290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Figure 2:&lt;/span&gt; The class name is automatically entered, and a list of jars that contain that class is shown.&lt;br /&gt;&lt;br /&gt;m2eclipse will take care of downloading the required jars and adding them to your classpath.  That's it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-6297494774074909361?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yGqxROJoe08m9mCtbPfcxALTplI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yGqxROJoe08m9mCtbPfcxALTplI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yGqxROJoe08m9mCtbPfcxALTplI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yGqxROJoe08m9mCtbPfcxALTplI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/8JO3jCtFqkU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/6297494774074909361/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=6297494774074909361" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/6297494774074909361?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/6297494774074909361?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/8JO3jCtFqkU/easy-dependency-management-with.html" title="Easy dependency management with m2eclipse" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_tXq6rbEGp8o/SUwIkY-CwkI/AAAAAAAAIHk/D8A5ow6n2Y0/s72-c/m2a.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/12/easy-dependency-management-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MFQnw7fCp7ImA9WxRaEUU.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-5725306349711408986</id><published>2008-12-12T19:17:00.000-08:00</published><updated>2008-12-13T08:23:33.204-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-13T08:23:33.204-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="2008" /><title>SpringOne 2008</title><content type="html">I missed The Spring Experience 2007, but was able to return in 2008, and it has been renamed to springOne.  During Adrian Colyer's keynote, he posted this hilarious photo:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tXq6rbEGp8o/SUMp47evLyI/AAAAAAAAIHc/jV_bl12iV38/s1600-h/iloveejb.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_tXq6rbEGp8o/SUMp47evLyI/AAAAAAAAIHc/jV_bl12iV38/s320/iloveejb.JPG" alt="" id="BLOGGER_PHOTO_ID_5279109246224379682" border="0" /&gt;&lt;/a&gt;Yes, that's the Rod Johnson bobblehead doll! I'm so jealous of everyone who was able to attend in 2007.  Hopefully they give out something like this in 2009.&lt;br /&gt;&lt;br /&gt;On a more serious note, some of the highlights of the conference:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Managing the war on complexity:&lt;/span&gt;  This was the theme of Rod Johnson's keynote, and I'm glad he explicitly said this, as Spring is truly one of the best solutions to making Java EE web apps simple to maintain and develop.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OSGi: &lt;/span&gt;Becoming very popular, and something worth looking into.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Spring MVC:&lt;/span&gt; The old Controller hierarchy is going away, and moving towards the annotation based Controllers found in 2.5.   Also, Spring 3.0 will have native REST support!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Grails: &lt;/span&gt;If you follow the Grails scene, then you know that G2One, the company behind Grails, has been acquired by SpringOne.  Rod just reiterated this to let the community know that Grails will have even better Spring support now that they are the same company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-5725306349711408986?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0R5iLxvrYciWC4kks4D3VxTFJtY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0R5iLxvrYciWC4kks4D3VxTFJtY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0R5iLxvrYciWC4kks4D3VxTFJtY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0R5iLxvrYciWC4kks4D3VxTFJtY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/urbcqiDOZ6Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/5725306349711408986/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=5725306349711408986" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/5725306349711408986?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/5725306349711408986?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/urbcqiDOZ6Q/springone-2008.html" title="SpringOne 2008" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tXq6rbEGp8o/SUMp47evLyI/AAAAAAAAIHc/jV_bl12iV38/s72-c/iloveejb.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/12/springone-2008.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4BQn05fyp7ImA9WxJWE0s.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-6925015887766171728</id><published>2008-07-10T17:30:00.000-07:00</published><updated>2009-06-18T15:25:53.327-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T15:25:53.327-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><title>Grails Eclipse plugin</title><content type="html">So I was messing around with Grails the other day, and heard about the wonderful Eclipse plugin.  Like the documentation says, grails generates all the necessary files for Eclipse to recognize your project.  &lt;br /&gt;&lt;br /&gt;This is great and all, but a lot of people I spoke to encountered the same problem I did.&lt;br /&gt;There's a file for your Spring DSL code, called resources.groovy located in&lt;br /&gt;&amp;lt;your-app&amp;gt;/grails-app/conf/spring.&lt;br /&gt;&lt;br /&gt;Many people will then receive the following error:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Invalid Package declaration in script: &amp;lt;path-to-your-project&amp;gt;/grails-app/conf/spring/resources.groovy is not in a source folder matching the package declaration:  DonutStore/grails-app/conf/spring resources.groovy&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I don't know enough Grails at the moment, but a quick fix is to add:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package spring;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;to the top of the file.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update:&lt;/span&gt;I've been coding Grails apps for several months now, and realize that this is just an error with the Eclipse plugin.  Since I develop on the Mac, I prefer TextMate anyway.  However, if you're an Eclipse fan, be glad that the SpringSource guys are working on a new and improved plugin and it should be available later this year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-6925015887766171728?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tAUAwpIO6ZmKaHX0rVrc-k0T9nM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tAUAwpIO6ZmKaHX0rVrc-k0T9nM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tAUAwpIO6ZmKaHX0rVrc-k0T9nM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tAUAwpIO6ZmKaHX0rVrc-k0T9nM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/80_PJOnWSuc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/6925015887766171728/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=6925015887766171728" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/6925015887766171728?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/6925015887766171728?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/80_PJOnWSuc/grails-eclipse-plugin.html" title="Grails Eclipse plugin" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/07/grails-eclipse-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08EQHozfCp7ImA9Wx9QEU8.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-3092608414956657096</id><published>2008-07-08T09:53:00.000-07:00</published><updated>2010-12-23T10:43:21.484-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-23T10:43:21.484-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="method-injection" /><title>Spring method injection</title><content type="html">I recently inherited some legacy code and it's been extremely difficult to refactor.  It's a catch-22: you can't refactor without unit tests in place, but it's difficult to unit test since it wasn't written to be testable.  [TDD can cure this. :)]&lt;br /&gt;
&lt;br /&gt;
So after much hair-pulling and thought, I was able to extract a few interfaces and configure some of the business logic classes as Spring managed beans.  The problem was that some of the dependencies were still being acquired via the "new" keyword, and it had to remain that way. &lt;br /&gt;
&lt;br /&gt;
In other words, I had a singleton bean which required a non-singleton, or prototype. Not just once, at bean creation time, but a new instance &lt;i&gt;every&lt;/i&gt; time.  How could this be done, without mucking up my code with the Spring API?  We definitely do not want a reference to a BeanFactory or ApplicationContext in our bean.&lt;br /&gt;
&lt;br /&gt;
Enter one of the rarer forms of dependency injection: &lt;a href="http://static.springframework.org/spring/docs/2.0.x/reference/beans.html"&gt;Method Injection &lt;/a&gt; (see section 3.3.8).&lt;br /&gt;
&lt;br /&gt;
The recipe is:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Create a method for the dependency and either make it protected abstract, or public.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;In your applicationContext.xml, instead of specifying &amp;lt;property name="someProperty"&amp;gt;, you use&lt;br /&gt;
&amp;lt;lookup-method name="theMethodWhichReturnsYourPrototype" bean="idOfPrototypeBean"/&amp;gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;br /&gt;
Let's look at an example:&lt;br /&gt;
&lt;br /&gt;
We have a class Homer, which wants a new instance of another bean, a Donut, every time, instead of reusing the same Donut over and over again.&lt;br /&gt;
&lt;script src="https://gist.github.com/753369.js"&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Now, for the applicationContext.xml:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;pre&gt;&amp;lt;!-- a stateful bean deployed as a prototype (non-singleton) --&amp;gt;
&amp;lt;bean id="donut" class="demo.DonutImpl" scope="prototype"&amp;gt;
&amp;lt;!-- inject dependencies here as required --&amp;gt;
&amp;lt;/bean&amp;gt;

&amp;lt;!-- homer (singleton) uses donut (prototype) --&amp;gt;
&amp;lt;bean id="homer" class="demo.Homer"&amp;gt;
&amp;lt;lookup-method name="getDonut" bean="donut"/&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So what's going on here?  To quote the Spring docs:&lt;br /&gt;
&lt;blockquote&gt;The Spring Framework implements this method injection by dynamically generating a subclass overriding the method, using bytecode generation via the CGLIB library.&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
So when Homer asks for a donut via getDonut(), the subclassed Homer, generated via CGLIB, will return a new instance of Donut, which has its dependencies injected by Spring.&lt;br /&gt;
&lt;br /&gt;
Pros of this approach: we are decoupled from BeanFactory and the Spring API&lt;br /&gt;
Cons: making the bean abstract makes testing a little difficult, since you have to subclass the class, however, making it concrete and implementing the getter method, you avoid this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-3092608414956657096?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZHXoyy323Zm4IrRb0WWIVDEaZXo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZHXoyy323Zm4IrRb0WWIVDEaZXo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZHXoyy323Zm4IrRb0WWIVDEaZXo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZHXoyy323Zm4IrRb0WWIVDEaZXo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/69c5or8cVxo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/3092608414956657096/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=3092608414956657096" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/3092608414956657096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/3092608414956657096?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/69c5or8cVxo/spring-method-injection.html" title="Spring method injection" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/07/spring-method-injection.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUARnwzeip7ImA9WxZXE08.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-1968353655714139149</id><published>2008-02-28T11:31:00.000-08:00</published><updated>2008-02-29T13:57:27.282-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-29T13:57:27.282-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flex" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="newline" /><category scheme="http://www.blogger.com/atom/ns#" term="actionscript" /><category scheme="http://www.blogger.com/atom/ns#" term="flex3" /><category scheme="http://www.blogger.com/atom/ns#" term="buttons" /><title>Multiline /newline Button label in Flex 3</title><content type="html">I was having the hardest time getting a newline to appear in my Button component.  I followed the documentation in the &lt;a href="http://livedocs.adobe.com/flex/3/html/help.html?content=mxmlSyntax_3.html"&gt;Adobe Flex 3 docs&lt;/a&gt; to use &lt;span style="font-weight: bold;"&gt;&amp;13; &lt;/span&gt;but that still did not work.&lt;br /&gt;&lt;br /&gt;I got some e-mails from Matt Horn of Adobe Flex Docs, and he gave me several things to try, including using the standard "\n" character escape sequence, and the HTML "&amp;lt;br/&amp;gt;".  Finally, he gave me a link to a blog entry by Alex Harui titled "&lt;a href="http://blogs.adobe.com/aharui/2007/04/multiline_buttons.html"&gt;Multiline Buttons&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;The code needed a little tweaking for Flex 3, but all I did was extend the Button class, and use the same exact code Alex used in his MultilineRadioButton.&lt;br /&gt;&lt;br /&gt;That being said, here's my MultilineButton.&lt;br /&gt;You can use this component like a regular button; the difference now is that if you include "&amp;13;" in your label, it will render a newline! &lt;br /&gt;&lt;br /&gt;Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;br /&gt;package &lt;br /&gt;{&lt;br /&gt;import flash.display.DisplayObject;&lt;br /&gt;import flash.text.TextLineMetrics;&lt;br /&gt;&lt;br /&gt;import mx.controls.Button;&lt;br /&gt;import mx.core.IFlexDisplayObject;&lt;br /&gt;import mx.core.mx_internal;&lt;br /&gt;use namespace mx_internal;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public class MultilineButton extends Button&lt;br /&gt; {&lt;br /&gt;  public function MultilineButton()&lt;br /&gt;  {&lt;br /&gt;   //TODO: implement function&lt;br /&gt;   super();&lt;br /&gt;  }&lt;br /&gt;   &lt;br /&gt;  override protected function createChildren():void&lt;br /&gt;  {&lt;br /&gt;   if (!textField)&lt;br /&gt;   {&lt;br /&gt;    textField = new NoTruncationUITextField();&lt;br /&gt;    textField.styleName = this;&lt;br /&gt;    addChild(DisplayObject(textField));  //cast required for Flex 3; if in Flex 2; remove&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   super.createChildren();&lt;br /&gt; &lt;br /&gt;   textField.multiline = true;&lt;br /&gt;   textField.wordWrap = true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  override protected function measure():void&lt;br /&gt;  {&lt;br /&gt;   if (!isNaN(explicitWidth))&lt;br /&gt;   {&lt;br /&gt;    var tempIcon:IFlexDisplayObject = getCurrentIcon();&lt;br /&gt;    var w:Number = explicitWidth;&lt;br /&gt;    if (tempIcon)&lt;br /&gt;     w -= tempIcon.width + getStyle("horizontalGap") + getStyle("paddingLeft") + getStyle("paddingRight");&lt;br /&gt;    textField.width = w;&lt;br /&gt;   }&lt;br /&gt;   super.measure();&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;     override public function measureText(s:String):TextLineMetrics&lt;br /&gt;  {&lt;br /&gt;   textField.text = s;&lt;br /&gt;   var lineMetrics:TextLineMetrics = textField.getLineMetrics(0);&lt;br /&gt;   lineMetrics.width = textField.textWidth + 4;&lt;br /&gt;   lineMetrics.height = textField.textHeight + 4;&lt;br /&gt;   return lineMetrics;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-1968353655714139149?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EyZu0jrnbYNT2Aq6yP4Suba5zWw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EyZu0jrnbYNT2Aq6yP4Suba5zWw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EyZu0jrnbYNT2Aq6yP4Suba5zWw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EyZu0jrnbYNT2Aq6yP4Suba5zWw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/ZZKDqtQbmOI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/1968353655714139149/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=1968353655714139149" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/1968353655714139149?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/1968353655714139149?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/ZZKDqtQbmOI/multine-newline-button-label-in-flex-3.html" title="Multiline /newline Button label in Flex 3" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/02/multine-newline-button-label-in-flex-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQGRXgyfSp7ImA9WxRbGEw.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-4066906430228002194</id><published>2008-02-26T09:58:00.000-08:00</published><updated>2008-12-09T01:52:04.695-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T01:52:04.695-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flex" /><category scheme="http://www.blogger.com/atom/ns#" term="360flex" /><category scheme="http://www.blogger.com/atom/ns#" term="day2" /><category scheme="http://www.blogger.com/atom/ns#" term="atlanta" /><title>Flex Day 2 (or 3, if you count Sunday)</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tXq6rbEGp8o/R8RWPwKOA-I/AAAAAAAAFb8/FawAnGI1kPM/s1600-h/atl_bling_75.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_tXq6rbEGp8o/R8RWPwKOA-I/AAAAAAAAFb8/FawAnGI1kPM/s320/atl_bling_75.png" alt="" id="BLOGGER_PHOTO_ID_5171353100753961954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The nightly parties at 360|Flex have been awesome, as well as the sessions.&lt;br /&gt;Here's a review of some sessions I attended.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;QTIndexSwapper and more Flash H.264 Fun - &lt;/span&gt;Renaun Erickson&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Renaun showed his custom code which reindexes QuickTime movies so that the movie plays while downloading, AND the metadata is available sooner, rather than waiting for the entire movie to download&lt;/li&gt;&lt;li&gt;Check out his blog and link to his Google code: &lt;a href="http://www.renaun.com/blog/"&gt;http://www.renaun.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Future of Flex&lt;/span&gt; - Deepa Subramaniam&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Flex for Mobile&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Thermo - RIA Design tool; easy for designers and developers to create revolutionary and interactive interfaces that can be taken directly into production&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Feels like an Adobe Creative Suite product&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;MXML-G, a new graphics library&lt;/li&gt;&lt;li&gt;Flex 4 components - has a new MVC model, where the skin (defined via CSS) is considered the view&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Deepa showed a demo where a button changed its look dynamically&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-4066906430228002194?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eu5G9j4e_Jb0Tw4mVBQPFIs-Ruk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eu5G9j4e_Jb0Tw4mVBQPFIs-Ruk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eu5G9j4e_Jb0Tw4mVBQPFIs-Ruk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eu5G9j4e_Jb0Tw4mVBQPFIs-Ruk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/EjSLqvVGpEY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/4066906430228002194/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=4066906430228002194" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4066906430228002194?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/4066906430228002194?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/EjSLqvVGpEY/flex-day-2-or-3-if-you-count-sunday.html" title="Flex Day 2 (or 3, if you count Sunday)" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tXq6rbEGp8o/R8RWPwKOA-I/AAAAAAAAFb8/FawAnGI1kPM/s72-c/atl_bling_75.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/02/flex-day-2-or-3-if-you-count-sunday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4AQnc8cSp7ImA9WxZQGEU.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-7195245008356767781</id><published>2008-02-24T11:54:00.000-08:00</published><updated>2008-02-24T11:55:43.979-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-24T11:55:43.979-08:00</app:edited><title>360 Flex Atlanta</title><content type="html">I'm here in Atlanta for the 360 Flex Conference.  It's a little cold here in ATL, but I'm in the comfort of the Omni Hotel, taking the Flex 101 course. We're building a photo application.  I'll post more later!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-7195245008356767781?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HwhJb6wQImqMppoPp8-GygOAgLo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HwhJb6wQImqMppoPp8-GygOAgLo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HwhJb6wQImqMppoPp8-GygOAgLo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HwhJb6wQImqMppoPp8-GygOAgLo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/Sj0qVxMB5sQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/7195245008356767781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=7195245008356767781" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/7195245008356767781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/7195245008356767781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/Sj0qVxMB5sQ/360-flex-atlanta.html" title="360 Flex Atlanta" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2008/02/360-flex-atlanta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQEQHY_eSp7ImA9WBFbEkU.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-113752838534523940</id><published>2006-01-17T11:54:00.000-08:00</published><updated>2007-05-04T06:45:01.841-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-04T06:45:01.841-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="controller" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title>SimpleFormController: onSubmit() not being called</title><content type="html">I had a SimpleFormController and a validator.   According to my logs, the command object passed validation, but I was not seeing the success-view.  Upon closer inspection of the errors object in my validate method, I noticed Spring was having a problem converting the String (from the form input) to the Long property of my command class.&lt;br /&gt;The solution is easy -- implement initBinder() in the controller and register a PropertyEditor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-113752838534523940?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4HzhRgdiILv2ZpU5iZ9y9UpL3Bk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4HzhRgdiILv2ZpU5iZ9y9UpL3Bk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4HzhRgdiILv2ZpU5iZ9y9UpL3Bk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4HzhRgdiILv2ZpU5iZ9y9UpL3Bk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/1Eq_mvdwVYs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/113752838534523940/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=113752838534523940" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113752838534523940?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113752838534523940?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/1Eq_mvdwVYs/simpleformcontroller-onsubmit-not.html" title="SimpleFormController: onSubmit() not being called" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2006/01/simpleformcontroller-onsubmit-not.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUHQXk8cCp7ImA9WBFbEkU.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-113639049486852176</id><published>2006-01-04T07:57:00.000-08:00</published><updated>2007-05-04T06:43:50.778-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-04T06:43:50.778-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web-inf" /><category scheme="http://www.blogger.com/atom/ns#" term="log4j" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>log4j.properties</title><content type="html">Happy New Year! Most people have returned to the office.&lt;br /&gt;&lt;br /&gt;I can't seem to find an answer as to where to place log4j.properties in an EAR file. Most sites I've read say to place it in WEB-INF/classes; I'm sure that will work fine for a WAR, but not so sure it would work for my application/business-logic code, which is a different JAR within the EAR.&lt;br /&gt;&lt;br /&gt;I'll update later when I find out more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update&lt;/span&gt;: It seems like it works so far.  One "problem" is that I'm using Maven, and was wondering how to get the properties file into WEB-INF/classes, especially since you don't create a classes directory under your WEB-INF folder.  I put my log4j.properties file in src/main/resources, and Maven did the rest!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-113639049486852176?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PnXlxVHNB-URC_rUv8hWbomZohQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PnXlxVHNB-URC_rUv8hWbomZohQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PnXlxVHNB-URC_rUv8hWbomZohQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PnXlxVHNB-URC_rUv8hWbomZohQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/9_DAVFrDZXo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/113639049486852176/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=113639049486852176" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113639049486852176?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113639049486852176?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/9_DAVFrDZXo/log4jproperties-where-does-it-go.html" title="log4j.properties" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2006/01/log4jproperties-where-does-it-go.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDQXo_fSp7ImA9WBFbEkU.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-113526584503909910</id><published>2005-12-22T07:32:00.000-08:00</published><updated>2007-05-04T06:44:30.445-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-04T06:44:30.445-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="w3c" /><category scheme="http://www.blogger.com/atom/ns#" term="node" /><category scheme="http://www.blogger.com/atom/ns#" term="junit" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>JUnit: Loader constraints violated</title><content type="html">I was running my JUnit tests via Maven, and ran into the following error:&lt;br /&gt;&lt;br /&gt;loader constraints violated when linking org/w3c/dom/Node class&lt;br /&gt;java.lang.LinkageError: loader constraints violated when linking org/w3c/dom/Node class at...&lt;br /&gt;&lt;br /&gt;The solution: set maven.junit.fork=true in your project.properties file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-113526584503909910?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nmhVWG6qUulWsSMqZUETOfDg9Dw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nmhVWG6qUulWsSMqZUETOfDg9Dw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nmhVWG6qUulWsSMqZUETOfDg9Dw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nmhVWG6qUulWsSMqZUETOfDg9Dw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/Rlzgrkrqmbo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/113526584503909910/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=113526584503909910" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113526584503909910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113526584503909910?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/Rlzgrkrqmbo/loader-constraints-violated.html" title="JUnit: Loader constraints violated" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2005/12/loader-constraints-violated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQHRX45eip7ImA9WBFbEkU.&quot;"><id>tag:blogger.com,1999:blog-20096602.post-113525878136591071</id><published>2005-12-22T05:32:00.000-08:00</published><updated>2007-05-04T06:45:34.022-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-04T06:45:34.022-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bean" /><category scheme="http://www.blogger.com/atom/ns#" term="ejb" /><category scheme="http://www.blogger.com/atom/ns#" term="xdoclet" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="interface" /><title>XDoclet (EJB) and Spring</title><content type="html">My project was using XDoclet to annotate our EJBs.  I wanted to use Spring, and still keep the EJB, so I had the bean class extend Spring's AbstractStatelessSessionBean.  The problem?  The classes that XDoclet generated extended AbstractStatelessSession&lt;span style="font-style: italic;"&gt;Remote&lt;/span&gt;, AbstractStatelessSession&lt;span style="font-style: italic;"&gt;Local&lt;/span&gt;, etc., all of which, don't exist.&lt;br /&gt;&lt;br /&gt;The solution?  Quite simple... by using the @ejb.home and @ejb.interface attributes, you can override the default behavior and specify which interface(s) the home interface and component interface should extend.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;  @ejb.home&lt;br /&gt;           extends="javax.ejb.EJBHome"&lt;br /&gt;           local-extends="javax.ejb.EJBLocalHome"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20096602-113525878136591071?l=geekyninja.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GwfWhQZuGG6sBUY6a6_tnuMbIR0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GwfWhQZuGG6sBUY6a6_tnuMbIR0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GwfWhQZuGG6sBUY6a6_tnuMbIR0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GwfWhQZuGG6sBUY6a6_tnuMbIR0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/kBECz/~4/KMEPStrvzoc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://geekyninja.blogspot.com/feeds/113525878136591071/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20096602&amp;postID=113525878136591071" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113525878136591071?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20096602/posts/default/113525878136591071?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/kBECz/~3/KMEPStrvzoc/xdoclet-ejb-and-spring.html" title="XDoclet (EJB) and Spring" /><author><name>Ken</name><uri>http://www.blogger.com/profile/04466467747514374651</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://geekyninja.blogspot.com/2005/12/xdoclet-ejb-and-spring.html</feedburner:origLink></entry></feed>

