<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4108959592704884346</id><updated>2012-02-16T12:32:38.124-06:00</updated><category term='ruby'/><category term='scripting'/><category term='thespringexperience2007'/><category term='GWT'/><category term='office'/><category term='jsf'/><category term='java'/><category term='EJB3'/><category term='jug'/><category term='ajax'/><category term='programming'/><category term='development'/><category term='nfjs'/><category term='dynamiclanguages'/><category term='goals'/><category term='javauniversity'/><category term='NetBeans'/><category term='general'/><category term='validation'/><category term='grails'/><category term='ruby on rails'/><category term='jMaki'/><category term='groovy'/><category term='web 2.0'/><category term='DSL'/><category term='ipod'/><category term='spring'/><category term='rails'/><category term='developer'/><category term='coffee'/><category term='jruby'/><category term='jms'/><category term='work'/><category term='restaurants'/><title type='text'>Matt Stine's Blog</title><subtitle type='html'>Thoughts on Java, Groovy, Grails, Agile Development, etc. etc. etc.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8557366303941569067</id><published>2009-03-23T16:43:00.002-05:00</published><updated>2009-03-23T16:45:37.121-05:00</updated><title type='text'>I've Moved!</title><content type='html'>At long last, I finally have combined my personal web site and my blog into one site, which is now hosted on WordPress. This will be my final post at this Blogger site. To continue the conversation, jump on over to &lt;a href="http://www.mattstine.com"&gt;http://www.mattstine.com&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8557366303941569067?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8557366303941569067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8557366303941569067' title='42 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8557366303941569067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8557366303941569067'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2009/03/ive-moved.html' title='I&apos;ve Moved!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>42</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2913733185899741958</id><published>2009-03-15T22:45:00.005-05:00</published><updated>2009-03-15T23:28:52.421-05:00</updated><title type='text'>The Manifesto for Software Craftsmanship</title><content type='html'>&lt;a href=http://5386.openphoto.net&gt;&lt;img src=http://openphoto.net/cgi-bin/image?image_id=5386 width="251" height="193" style="float: left; padding-right: 10px"&gt;&lt;/a&gt;So as I'm sitting here thumbing through my &lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt; feed on &lt;a href="http://www.google.com/reader"&gt;Google Reader&lt;/a&gt;, I come across the following posting: &lt;a href="http://www.infoq.com/news/2009/03/software_craftsmanship"&gt;Software Craftsmanship Manifesto: A Call to Arms&lt;/a&gt;. It seems that a group of "programming patriots" has struck again (see the &lt;a href="http://agilemanifesto.org"&gt;Manifesto for Agile Software Development&lt;/a&gt; - circa 2001), complete with a "founding document" look and feel. Clicking through &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;the source link&lt;/a&gt;, one finds the following:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Not only working software, but also well-crafted software&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not only responding to change, but also steadily adding value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not only individuals and interactions, but also a community of professionals&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Not only customer collaboration,but also productive partnerships&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;That is, in pursuit of the items on the left we have found the items on the right to be indispensable.&lt;br /&gt;&lt;br /&gt;© 2009, the undersigned. this statement may be freely copied in any form, but only in its entirety through this notice.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;You can't even imagine my excitement in reading this. This statement of values is something that I have been trying to get across without having the needed words for quite some time. &lt;br /&gt;&lt;br /&gt;The motivation, says the InfoQ article, is right on target:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The members of the manifesto group answered two key questions: “How will it help solve the problems of crap code?” and “What will motivate "The developer just churning out code" to become a craftsman?” - the distinction is between the developer who is just getting it done vs the one getting it done right.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I have felt for a long time that the elements of craftsmanship are something sorely missing from our field. We, as programmers, are often so consumed with getting the job done that we do often neglect getting it done right. In our haste to move on to the next exciting project and/or technology, we neglect the tenets of simple design, test-driven development, merciless refactoring, clean code, etc. We're often quite satisfied with the "hacky solution here" and the "quick and dirty solution there."&lt;br /&gt;&lt;br /&gt;Quite frankly, I've had enough of that. I'm not satisfied when the contractor building my house cuts corners. I'm quite irritable when my mechanic does a less than thorough job with my car. Why should I expect my clients to settle for software built like that?&lt;br /&gt;&lt;br /&gt;So, to make this a practical rant, I thought I'd share a couple of the things that we're doing in our team to move us in the right direction:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;First of all, we started a weekly "brown bag lunch/workshop," inspired by Andy Hunt and Venkat Subramaniam's discussion in &lt;span style="font-style:italic;"&gt;&lt;a href="http://pragprog.com/titles/pad/practices-of-an-agile-developer"&gt;Practices of an Agile Developer&lt;/a&gt;&lt;/span&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Second, we selected books to read as a team that will point us in the right direction. Our first two titles were &lt;span style="font-style:italic;"&gt;&lt;a href="http://pragprog.com/titles/tpp/the-pragmatic-programmer"&gt;The Pragmatic Programmer: From Journeyman to Master&lt;/a&gt;&lt;/span&gt; (see, there's craftsmanship right away!) and &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.pearsonhighered.com/educator/academic/product/1,3110,0132350882,00.html"&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt;&lt;/span&gt; (sense a pattern yet?).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Third, we make a point of our weekly discussions to look at ways we can integrate the principles and practices that we're learning into our daily work. An example: We're working to integrate peer code review into our development process. The principles, patterns, and practices that we're picking up from &lt;span style="font-style:italic;"&gt;Clean Code&lt;/span&gt; will be informing us as we review code and look for possible improvements.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;So, with that said, tonight I became a signatory of the manifesto. &lt;a href="http://manifesto.softwarecraftsmanship.org/sign/new"&gt;Why don't you join me and fight the fight against crappy code!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2913733185899741958?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2913733185899741958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2913733185899741958' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2913733185899741958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2913733185899741958'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2009/03/manifesto-for-software-craftsmanship.html' title='The Manifesto for Software Craftsmanship'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7798733339443378787</id><published>2009-03-13T22:08:00.002-05:00</published><updated>2009-03-13T22:39:25.817-05:00</updated><title type='text'>Grails+Dojo Ajax File Upload</title><content type='html'>I'm currently working on a &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; application with a requirement for uploading product images, which are subsequently resized into thumbnails of various sizes for different shopping screens. Since it took a bit of doing to get this done, I thought I'd post my solution here in case anyone could benefit from it.&lt;br /&gt;&lt;br /&gt;First, to set the stage, I've upgraded the application all the way to the newly released &lt;a href="http://www.springsource.org/node/1107"&gt;Grails 1.1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To start off, I naively attempted to use the built-in Prototype library to do the upload with a simple &lt;code&gt;&amp;lt;g:submitRemote/&amp;gt;&lt;/code&gt; tag. You might have guessed that this didn't work at all. Continuing to learn the hard way (without reading the manual I might add), I submitted this as a bug to the Grails project. Graeme ever so politely informed me that this was known and expected behavior, as Prototype doesn't support such a thing. However, it was Graeme that also tipped me off to try Dojo.&lt;br /&gt;&lt;br /&gt;So, continuing down this path, I proceeded to install the Grails Dojo plugin. Once this is done, a &lt;code&gt;&amp;lt;g:javascript library="dojo"/&amp;gt&lt;/code&gt; is supposedly all that is required to convert your Ajax calls from Prototype to Dojo. This turned out to not be the case for me, with Javascript errors popping up all over the place, not the least of which was that dojo.js seemed to be installed in an unexpected location via the plugin. The hacker in me simply copied this to the expected location and moved along. However, as I attempted to work with Dojo's file upload support, I discovered that the version of Dojo shipped with the plugin seemed at first glance to be way behind. Frustrated by this, I went ahead and stripped the Dojo plugin out and installed &lt;a href="http://download.dojotoolkit.org/release-1.2.3/dojo.js"&gt;the latest version available (at this writing 1.2.3)&lt;/a&gt;, and set about to develop my solution. &lt;br /&gt;&lt;br /&gt;Here goes:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Add the necessary Dojo dependencies to your GSP:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js; html-script: true"&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="${createLinkTo(dir: 'js/dojo', file: 'dojo.js')}"&lt;br /&gt;   djConfig="parseOnLoad:true, isDebug:true"&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;g:javascript&amp;gt;&lt;br /&gt;   dojo.require("dojo.io.iframe");&lt;br /&gt;&amp;lt;/g:javascript&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. Write a function using dojo.io.iframe to send the form:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;function submitForm() {&lt;br /&gt;   dojo.io.iframe.send({&lt;br /&gt;      form: 'uploadProductImageForm',&lt;br /&gt;      load: function (data) {&lt;br /&gt;         dojo.byId('productImage').innerHTML = data;&lt;br /&gt;      }&lt;br /&gt;   });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. Create the file upload form:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;g:form name="uploadProductImageForm" method="post" action="uploadProductImage" enctype="multipart/form-data"&amp;gt;&lt;br /&gt;   &amp;lt;input type="hidden" name="id" value="${productInstance?.id}"/&amp;gt;&lt;br /&gt;   &amp;lt;input type="file" name="newProductImage"/&amp;gt;&lt;br /&gt;   &amp;lt;span class="button"&amp;gt;&amp;lt;input class="add" type="button" name="uploadImage" value="Upload Image" onclick="submitForm()"/&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/g:form&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Create the controller method:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;def uploadProductImage = {&lt;br /&gt;   def f = request.getFile('newProductImage')&lt;br /&gt;   if (!f.empty) {&lt;br /&gt;&lt;br /&gt;   def imagePath = grailsApplication.config.store.productImages.location&lt;br /&gt;&lt;br /&gt;   //Create unique name for this image set based on current timestamp&lt;br /&gt;   def name = "image" + new Date().getTime()&lt;br /&gt;&lt;br /&gt;   //Store the file &lt;br /&gt;   def file = new File("${imagePath}/${originalFilename}")&lt;br /&gt;   f.transferTo(file)&lt;br /&gt;&lt;br /&gt;   //Do some image processing (resizing, etc.)&lt;br /&gt;   ...&lt;br /&gt; &lt;br /&gt;   //Dojo requires returning the result nested in an HTML document containing a body and textarea tag. Do this with&lt;br /&gt;   //Groovy's built-in MarkupBuilder&lt;br /&gt; &lt;br /&gt;   def writer = new StringWriter()&lt;br /&gt;   def xml = new MarkupBuilder(writer)&lt;br /&gt;&lt;br /&gt;   xml.html {&lt;br /&gt;     body {&lt;br /&gt;       textarea {&lt;br /&gt;         img(src: resource(dir: grailsApplication.config.store.productImages.webPath, file: product.mediumImage.name), width: '250')&lt;br /&gt;       }&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   render writer.toString()&lt;br /&gt;   }&lt;br /&gt;   else {&lt;br /&gt;      flash.message = 'file cannot be empty'&lt;br /&gt;      redirect(action: show)&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And there you have it. Let me know what you think of this solution. It definitely works for me. You will notice that I didn't include an upload progress bar - I'll be doing this in a future iteration of the project. Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7798733339443378787?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/7798733339443378787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=7798733339443378787' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7798733339443378787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7798733339443378787'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2009/03/grailsdojo-ajax-file-upload.html' title='Grails+Dojo Ajax File Upload'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-528635512942387271</id><published>2009-03-13T12:24:00.001-05:00</published><updated>2009-03-13T12:26:42.212-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jug'/><category scheme='http://www.blogger.com/atom/ns#' term='jms'/><title type='text'>I'm speaking at the March Memphis JUG meeting</title><content type='html'>I learned a great deal about JMS from Mark Richards at last weekend's NFJS Gateway Software Symposium, and I thought I'd share it with the Memphis Java community. Take a look at &lt;a href="http://www.memphisjug.org"&gt;http://www.memphisjug.org&lt;/a&gt; for details!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-528635512942387271?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/528635512942387271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=528635512942387271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/528635512942387271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/528635512942387271'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2009/03/im-speaking-at-march-memphis-jug.html' title='I&apos;m speaking at the March Memphis JUG meeting'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8204286612672895535</id><published>2009-03-13T11:55:00.002-05:00</published><updated>2009-03-13T12:04:39.010-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><title type='text'>My iPod is on rice</title><content type='html'>Let me set the stage for you. I'm driving home happily listening to Ted Neward discuss the merits of Scala on the Javaworld podcast. As I pull into the driveway I see my wife waving frantically in the window. As geek brain struggles to process this, home brain kicks into gear. She needs me in the house now! I jump out of the car and slam the door shut, leaving all of the belongings I typically carry in the house.&lt;br /&gt;&lt;br /&gt;I enter the house to find that a wasp has some how gotten in and is terrorizing the family. What ensues is roughly 15 minutes of wasp hunting. Wasp dead - end of story. Or so I thought.&lt;br /&gt;&lt;br /&gt;As I'm driving my iPod (attached to the iTrip FM transmitter/charger) typically sits in my lap (for some reason I get the least FM interference that way). What I didn't notice in my hasty departure from the vehicle is that my iPod nano flew out of the vehicle and was hanging by the iTrip cable. Unaware of this, I slammed the door on the cable and walked away.&lt;br /&gt;&lt;br /&gt;This in and of itself wasn't a huge problem. Leaving it that way for approximately 24 hours - most of which included rather steady rainfall - was. &lt;br /&gt;&lt;br /&gt;So, a quick Google search finds that the consensus approach seems to be sticking the iPod in a cup of dry rice to soak up the moisture. So there you have it - my iPod is on rice. I hope it works. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8204286612672895535?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8204286612672895535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8204286612672895535' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8204286612672895535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8204286612672895535'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2009/03/my-ipod-is-on-rice.html' title='My iPod is on rice'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6156766568158100639</id><published>2009-03-12T21:32:00.004-05:00</published><updated>2009-03-12T21:49:16.604-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>It's been a long time...</title><content type='html'>...since I actively spent any time blogging. What you don't know is that it has been a long time since I've done any writing whatsoever. The last two posts on this blog revolved around the birth of my first son, Grant Dawson, on May 16, 2009. This was one of several events that took place almost a year ago that sent me directly into a whirlwind of activity that found me barely keeping my head above water.&lt;br /&gt;&lt;br /&gt;It was also about this time that I found myself newly promoted into front-line management. The team that I entered first in 2000 as a Bioinformatics Intern during my last summer as an undergraduate, and then as a Software Engineer/Web Developer I following graduation in 2001, was now mine to lead. After doing this job now for nearly a year, I can safely say that my career as a developer has both prepared me for this role and left me completely bankrupt when faced with the responsibilities that are now mine. More on this to come.&lt;br /&gt;&lt;br /&gt;Another event that transpired in May was the sale of our first home. It had been on the market since March, and we "paused" the showings as Grant's arrival became imminent. It was near the end of May that we received both our first and our last post-Grant showing phone call. I remarked to Wendy - "these folks are going to buy the house." And buy it they did. Unfortunately for us, we had no idea whatsoever where we were going to move. What ensued was a chaotic whirlwind of house hunting which ended with us making an offer on a house that wasn't even on the market. And that's the house I'm sitting in while I write this first entry of 2009. Ask me to tell you the story sometime - it's a good one.&lt;br /&gt;&lt;br /&gt;So, why I'm I here? Why not just leave the blogging task. After all, isn't blogging passe at this point?&lt;br /&gt;&lt;br /&gt;I credit my return to the blogosphere to an incredible book by Jared Richardson and Matthew Bass - &lt;a href="http://www.lulu.com/content/5925115"&gt;Career 2.0: Take Control of Your Life&lt;/a&gt;. The basic premise of this book is to "Actively manage your career." One of the ways by which the authors share how to do this is writing - sharing what you know with the community at-large. Of course what they shared was no surprise to me. I already knew all too well the career benefits associated with blogging. What I needed was a proverbial "kick in the pants." And that's what Career 2.0 did for me. If you're in the software industry - take that back, I don't care what industry you're in (these principles are transcendent) - do yourself a favor and read this book. It will change something about your life, guaranteed.&lt;br /&gt;&lt;br /&gt;So, with that, let's start the conversation again. I'm looking forward to where it might lead. Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6156766568158100639?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/6156766568158100639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=6156766568158100639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6156766568158100639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6156766568158100639'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2009/03/its-been-long-time.html' title='It&apos;s been a long time...'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-3131062979539051457</id><published>2008-08-14T22:54:00.000-05:00</published><updated>2008-08-14T22:54:43.140-05:00</updated><title type='text'>Little Man</title><content type='html'>&lt;div style="MARGIN: 0px auto 10px; TEXT-ALIGN: center"&gt;&lt;a href="http://4.bp.blogspot.com/_Vo63LRwAZbk/SKT-AuXbffI/AAAAAAAAAfQ/559p4D5Sv5E/s1600-h/P8110208.JPG"&gt;&lt;img alt="" src="http://4.bp.blogspot.com/_Vo63LRwAZbk/SKT-AuXbffI/AAAAAAAAAfQ/559p4D5Sv5E/s400/P8110208.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here's little man Grant himself smiling for the camera!&lt;/div&gt;&lt;div style='clear:both; text-align:CENTER'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-3131062979539051457?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/3131062979539051457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=3131062979539051457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3131062979539051457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3131062979539051457'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/08/little-man.html' title='Little Man'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Vo63LRwAZbk/SKT-AuXbffI/AAAAAAAAAfQ/559p4D5Sv5E/s72-c/P8110208.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6611795087284689941</id><published>2008-05-18T14:11:00.000-05:00</published><updated>2008-12-11T01:53:48.883-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Introducing Grant Dawson Stine</title><content type='html'>So I haven't blogged in quite awhile. I've been rather busy - here's one VERY important reason why. Grant was born Friday, May 16, 2008, weighing in at 9 pounds 4 ounces and 22 inches long. Mom and baby are doing wonderfully, but as you can see, Dad is in a bit of shock!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Vo63LRwAZbk/SDCAMcjQJGI/AAAAAAAAAfA/5LZWAyRyOfs/s1600-h/P5160099.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_Vo63LRwAZbk/SDCAMcjQJGI/AAAAAAAAAfA/5LZWAyRyOfs/s400/P5160099.jpg" alt="" id="BLOGGER_PHOTO_ID_5201798520923759714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Vo63LRwAZbk/SDCAMsjQJHI/AAAAAAAAAfI/5frhZqimCJM/s1600-h/P5160126.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_Vo63LRwAZbk/SDCAMsjQJHI/AAAAAAAAAfI/5frhZqimCJM/s400/P5160126.jpg" alt="" id="BLOGGER_PHOTO_ID_5201798525218727026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6611795087284689941?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/6611795087284689941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=6611795087284689941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6611795087284689941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6611795087284689941'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/05/introducing-grant-dawson-stine.html' title='Introducing Grant Dawson Stine'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Vo63LRwAZbk/SDCAMcjQJGI/AAAAAAAAAfA/5LZWAyRyOfs/s72-c/P5160099.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-1466960403235025137</id><published>2008-02-08T14:49:00.001-06:00</published><updated>2008-02-08T14:49:42.054-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='nfjs'/><title type='text'>On our way to the Gateway Software Symposium</title><content type='html'>We're taking most of our team to the St. Louis, Missouri, edition of the &lt;a href="http://www.nofluffjuststuff.com"&gt;No Fluff Just Stuff&lt;/a&gt; 2008 tour. This will be my first actual NFJS event. I attended the &lt;a href="http://www.thespringexperience.com"&gt;Spring Experience&lt;/a&gt; in 2007, which was put on by the NFJS guys, so I expect this event in St. Louis to be great. Since we're based in Memphis, St. Louis is only about a 4 1/2 hour drive. We're all going to pile in a van and road trip. It should be a great time. &lt;br /&gt;&lt;br /&gt;I'm going to have a hard time choosing sessions: Neal Ford, Scott Davis, David Geary, Jeff Brown, and Bryan Sletten all have sessions that I'd like to attend, several of which are in conflict. I hope they do post-conference video delivery of these sessions just like they're doing for the Spring Experience.&lt;br /&gt;&lt;br /&gt;If anyone's going to be there, let's do dinner one night and you can meet some of the St. Jude team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-1466960403235025137?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/1466960403235025137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=1466960403235025137' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1466960403235025137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1466960403235025137'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/02/on-our-way-to-gateway-software.html' title='On our way to the Gateway Software Symposium'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7423010496814928801</id><published>2008-02-05T11:27:00.006-06:00</published><updated>2009-03-13T22:05:45.682-05:00</updated><title type='text'>Set Conditional Breakpoints in IDEA</title><content type='html'>So yesterday I was attempting to debug an issue in a batch processing module within one of our applications. In short, an assertion was failing deep within Hibernate as it attempted to flush the session. Using a combination of various log statements, I had isolated the problem down to a particular record that the batch process was attempting to update. (BTW: I know you shouldn't be using Hibernate for batch processing - however, we're talking about batches of at most 1000 records here, not millions!) What I really wanted to do was set a breakpoint and examine the state of the objects at runtime; however, I dreaded the thought of clicking through the breakpoint time and time again until I got to the particular record that was causing the problem. "Surely," I thought, "there must be a way to tell the debugger to only break under certain conditions."&lt;br /&gt;&lt;br /&gt;So, here's the code I wanted to examine:&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;public Publication parsePublication(String inputLine)&lt;br /&gt;   throws ParseException {&lt;br /&gt;       Publication publication = new Publication();&lt;br /&gt;&lt;br /&gt;       String[] fields = inputLine.split("\t");&lt;br /&gt;&lt;br /&gt;       publication.setPublicationType(fields[0]);&lt;br /&gt;       ...&lt;br /&gt;       return publication;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Essentially, I wanted to break after &lt;code&gt;inputLine.split("\t");&lt;/code&gt; if and only if &lt;code&gt;fields[35]&lt;/code&gt; existed and was equal to "PM:16732581." After examining IDEA's Breakpoint dialog, I noticed a section in the bottom right-hand corner that I'd never played with before:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Vo63LRwAZbk/R6idFtXVh2I/AAAAAAAAAcw/DpuaZ5TQUCs/s1600-h/breakpoint_dialog.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Vo63LRwAZbk/R6idFtXVh2I/AAAAAAAAAcw/DpuaZ5TQUCs/s320/breakpoint_dialog.jpg" alt="" id="BLOGGER_PHOTO_ID_5163549694182655842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As it turns out, this is exactly what I needed. If you click on the ellipsis next to the drop menu, you get a context-sensitive editor equipped with code completion:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Vo63LRwAZbk/R6idb9XVh3I/AAAAAAAAAc4/MENimxICxyk/s1600-h/condition_dialog2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Vo63LRwAZbk/R6idb9XVh3I/AAAAAAAAAc4/MENimxICxyk/s400/condition_dialog2.jpg" alt="" id="BLOGGER_PHOTO_ID_5163550076434745202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enter the desired conditions and voila! A conditional breakpoint. It worked like a charm the very first time, and I only had to inspect the breakpoint when the problematic record came up.&lt;br /&gt;&lt;br /&gt;Another nice feature of the conditional breakpoint is that if some sort of exception (such as a NullPointerException) occurs while attempting to evaluate the conditional expression, IDEA pops up a dialog informing you what happened and asking if you want to stop at the breakpoint or continue. Nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7423010496814928801?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/7423010496814928801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=7423010496814928801' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7423010496814928801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7423010496814928801'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/02/set-conditional-breakpoints-in-idea.html' title='Set Conditional Breakpoints in IDEA'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vo63LRwAZbk/R6idFtXVh2I/AAAAAAAAAcw/DpuaZ5TQUCs/s72-c/breakpoint_dialog.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8515066997723533789</id><published>2008-02-05T09:48:00.001-06:00</published><updated>2009-03-10T23:05:35.221-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails 1.0 Released!</title><content type='html'>&lt;a href="http://grails.org/Home"&gt;Grails&lt;/a&gt;, by far my favorite of the JVM dynamic language frameworks, was released this morning, with a snazzy, new, "Web 2.0 style" website to boot. Congratulations Graeme and company on all of your hard work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8515066997723533789?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8515066997723533789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8515066997723533789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8515066997723533789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8515066997723533789'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/02/grails-10-released.html' title='Grails 1.0 Released!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8434298895263975426</id><published>2008-02-04T16:43:00.000-06:00</published><updated>2008-02-04T17:03:19.261-06:00</updated><title type='text'>A Javascript Code "Prettifier"</title><content type='html'>I came across a &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;link&lt;/a&gt; today that would allow you to post "pretty" code in any HTML page. I've had plenty of problems (as have others) posting well-formatted source code to my Blogger-based blog. I've wanted to correct this problem for some time, and this project appears to be a decent solution. Here's an example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;function chooseWinner() {&lt;br /&gt;   $('p3').removeClassName('winner');&lt;br /&gt;   participantBo.chooseWinnerForEvent(eventId, function(data) {&lt;br /&gt;      people = $A(data);&lt;br /&gt;      updateDivs();&lt;br /&gt;      intervalId = setInterval(doShift, 500);&lt;br /&gt;   });&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now that isn't too bad is it? There seems to be a bit of a delay as the Javascript is loaded, but I think that's more a symptom of my connection than it is a problem with the script.&lt;br /&gt;&lt;br /&gt;Here's how you can take advantage of this solution (quoted from &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html"&gt;http://google-code-prettify.googlecode.com/svn/trunk/README.html&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;      &lt;li&gt;&lt;a href="http://google-code-prettify.googlecode.com/files/prettify-small.zip"&gt;Download&lt;/a&gt; a distribution&lt;br /&gt;      &lt;li&gt;Include the script and stylesheets in your document&lt;br /&gt;        (you will need to make sure the css and js file are on your server, and&lt;br /&gt;         adjust the paths in the &lt;tt&gt;script&lt;/tt&gt; and &lt;tt&gt;link&lt;/tt&gt; tag)&lt;br /&gt;        &lt;pre class="prettyprint"&gt;&amp;lt;link href="prettify.css" type="text/css" rel="stylesheet" /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="prettify.js"&gt;&amp;lt;/script&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;li&gt;Add &lt;code class="prettyprint"&gt;onload="prettyPrint()"&lt;/code&gt; to your&lt;br /&gt;      document's body tag.&lt;br /&gt;      &lt;li&gt;Modify the stylesheet to get the coloring you prefer&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;Put code snippets in&lt;br /&gt;    &lt;tt&gt;&amp;lt;pre class="prettyprint"&amp;gt;...&amp;lt;/pre&amp;gt;&lt;/tt&gt;&lt;br /&gt;    or &lt;tt&gt;&amp;lt;code class="prettyprint"&amp;gt;...&amp;lt;/code&amp;gt;&lt;/tt&gt;&lt;br /&gt;    and it will automatically be pretty printed.&lt;/li&gt;&lt;br /&gt;    &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8434298895263975426?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8434298895263975426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8434298895263975426' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8434298895263975426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8434298895263975426'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/02/testing-javascript-code-prettifier.html' title='A Javascript Code &quot;Prettifier&quot;'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5760319744836362677</id><published>2008-02-04T14:28:00.000-06:00</published><updated>2008-02-04T14:35:05.205-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><title type='text'>The Spring Experience 2007 - Videos on the way!</title><content type='html'>I got an awesome email today...&lt;br /&gt;&lt;blockquote&gt;We are happy to announce that the video/audio streaming from TSE 2007 will be available online the week of February 11th for you.  You will have the opportunity to see/hear the TSE 2007 presentations you were not able to make at TSE 2007 due to all of the great sessions available per time period.  We have captured the entire session length including any demos/live coding.  Please look for the email from us next Monday, February 11th with the details about viewing the session content online.&lt;/blockquote&gt;I'm extremely excited about this. For two reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I didn't get to finish my reviews of the sessions that I attended. Now that it has been several weeks since the conference, I don't feel like my memory of them is good enough to do a fair review. Now I can do a refresh and write!&lt;/li&gt;&lt;li&gt;There were several sessions that I wanted to attend that I couldn't - now I get to attend...and write!&lt;/li&gt;&lt;/ol&gt;Look forward to some more reviews from The Spring Experience 2007 in the coming weeks!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5760319744836362677?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5760319744836362677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5760319744836362677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5760319744836362677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5760319744836362677'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/02/spring-experience-2007-videos-on-way.html' title='The Spring Experience 2007 - Videos on the way!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6920965198978310620</id><published>2008-01-25T13:29:00.000-06:00</published><updated>2008-01-25T13:31:21.487-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>Practical JRuby on Rails Web 2.0 Projects</title><content type='html'>Are Java's days numbered as a web development technology? With buzzwords like Ruby, Rails, and Web 2.0 zipping around the web development community, one may begin to wonder. Could Java's lifespan be extended by finding synergy between Java and Ruby? On the scene comes JRuby, the definitive implementation of Ruby for the JVM. In his new book from Apress, Ola Bini guides the reader through the development of four Web 2.0 projects using JRuby on Rails. I think that Bini does a masterful job of always using the right tool for the right job. &lt;a href="http://java.dzone.com/reviews/practical-jruby-rails-web-20-p"&gt;Read my review for complete details.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6920965198978310620?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/6920965198978310620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=6920965198978310620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6920965198978310620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6920965198978310620'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/01/practical-jruby-on-rails-web-20.html' title='Practical JRuby on Rails Web 2.0 Projects'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-3623485367090185391</id><published>2008-01-02T16:33:00.000-06:00</published><updated>2008-01-03T12:23:28.230-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='goals'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Mid-Year Review: My Professional Development Goals for 2007-2008</title><content type='html'>Back in July I posted my professional development goals for the year (My performance review is annually in July, so it's a good time to set goals.), and it seemed like a good idea to take a look at my progress while doing the "New Year's Resolution" thing. &lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Learn Groovy and Grails&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  Andy and Dave suggest learning a new language every year, so this seemed like a good goal for me. I can't say that I've truly learned Groovy and Grails in depth, but I did learn them enough &lt;a href="http://www.memphisjug.org/october25%2C2007"&gt;to do a presentation on them&lt;/a&gt; (as well as Ruby, JRuby, and Rails) at our Java User Group meeting  in October, so I've effectively touched on two languages and two frameworks for those languages. I've since gotten interested in Scala as well. At any rate, I'd like to go deeper w/ Groovy and Grails as I have time, which is scarce!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Release &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;HallKeeper&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; v1.0 as part of #1&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This project seems destined to fail. I haven't worked on it in any meaningful way since the summer. I've thought about it in the past week, and I'd actually like to try doing it in straight Java POJOs with Spring and Hibernate since I'm more well-versed in that area. At any rate, it really is my lack of spare time that keeps this one on the perpetual back burner.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Read and LEARN the following books:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;ul&gt;&lt;li&gt;The Definitive Guide to Grails - Rocher&lt;/li&gt;&lt;li&gt;The Pragmatic Programmer - Hunt, Thomas&lt;/li&gt;&lt;li&gt;Computer Algorithms: Introduction to Design &amp;amp; Analysis - Baase, Van Gelder&lt;/li&gt;&lt;li&gt;Concepts of Programming Languages: Sebesta&lt;/li&gt;&lt;li&gt;Groovy in Action - Konig&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; I've pretty much finished #1, got started on #2, and haven't really touched the last three. Again, the needs of the moment have necessitated I focus on other areas, particularly other books. Recent projects have pointed me to three additional books I'd really like to cover this year, so I may not get to my original list. Here are the titles:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Working Effectively with Legacy Code - Feathers&lt;br /&gt;&lt;/li&gt;&lt;li&gt;POJOs in Action - Richardson&lt;/li&gt;&lt;li&gt;Domain Driven Design - Evans&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Review two books for the &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;JavaLobby&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;DZone&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; book review team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is one I've hit the nail on. I just completed my second book review, which will be published some time in the next few weeks. My first review, &lt;a href="http://matt-stine.blogspot.com/2007/10/ajax-construction-kit-building-plug-and.html"&gt;Ajax Construction Kit: Building Plug-and-Play Ajax Applications&lt;/a&gt;, was published in October 2007. These have been rather time consuming and have kept me from other projects, so I don't plan to take any more reviews this year.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pass the Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 Exam&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Haven't touched this one yet. Preparing for this will be one of my foci in the coming weeks.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Write one Java/software development blog article per week&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I haven't done so hot on this one. OK, let's be really honest. I haven't come close. However, my recent flurry of entries on The Spring Experience 2007 have gotten me into a bit of a groove. I'm going to try to keep up the momentum and finish this year strong.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Attend &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;JavaOne&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; 2008 or similar conference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've actually traveled twice since my original post. My first trip was to the &lt;a href="http://nerlscd.biotech.cornell.edu/"&gt;Northeast Life Sciences Core Directors Meeting&lt;/a&gt; last November at Cornell University in Ithaca, NY. The purpose of this trip was to present and generate interest around our open source shared resource management system for core facilities, &lt;a href="http://stjude-srm.sourceforge.net/"&gt;STJUDE-SRM&lt;/a&gt;. The trip was a great success. My second trip really fulfills this goal, as I attended &lt;a href="http://www.thespringexperience.com/conference/hollywood/2007/12/index.html"&gt;The Spring Experience 2007&lt;/a&gt; in Hollywood, FL. This proved to be one of the best technical conferences I've ever attended, and also one of the most fun!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Start a Memphis/Mid-South Area Java User Group&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't think this goal could have gone any better than it has. In late July I started a &lt;a href="http://groups.google.com/group/memphis-mid-south-jug"&gt;Google Group&lt;/a&gt; and a small Google Page Creator website to attempt to drum up interest in a Java User Group for the Memphis, TN and surrounding Mid-South area. On July 23, 2007, along comes Diane Tabulog, a technical recruiter with local company &lt;a href="http://www.vaco.com/Technology/tech_about.htm"&gt;Vaco Technology&lt;/a&gt;, who convinces her company to throw its support behind our JUG. All of a sudden we have an offer for a meeting location, food budget, giveaways, etc. Later, Clayton Naeve, our CIO at St. Jude, agreed to let us use our awesome conference room at our division's new offices at 160 Shadyac Avenue to meet, as Vaco's facilities were a bit small. On August 15, &lt;a href="http://weblogs.java.net/blog/caroljmcdonald"&gt;Carol McDonald&lt;/a&gt;, a Java Technology Evangelist from Sun Microsystems, offered to speak at our JUG, and we signed her up for the first meeting. Little by little, all of the necessary pieces started to fall into place, including additional free giveaways from Sun, O'Reilly, Atlassian, and JetBrains. &lt;a href="http://www.memphisjug.org/september20%2C2007"&gt;The first meeting&lt;/a&gt; was a great success, and since then we've had two more successful meetings. Our next meeting is Thursday, January 17, 2008. Find out more at &lt;a href="http://www.memphisjug.org"&gt;http://www.memphisjug.org&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-3623485367090185391?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/3623485367090185391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=3623485367090185391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3623485367090185391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3623485367090185391'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2008/01/mid-year-review-my-professional.html' title='Mid-Year Review: My Professional Development Goals for 2007-2008'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2002946949539465869</id><published>2007-12-21T14:48:00.000-06:00</published><updated>2007-12-21T15:54:00.182-06:00</updated><title type='text'>Web Application Data Access Patterns: Keith Donald</title><content type='html'>Well, after a short hiatus of getting back to "real" work, I'm going to attempt to squeeze in another Spring Experience 2007 entry. This particular session was my first of Friday morning. I've always enjoyed Keith Donald as a speaker, having first heard him at &lt;a href="http://www.theserverside.com/tt/articles/content/JIApresentations/Donald.pdf"&gt;TheServerSide.com's Java In Action conference in 2005&lt;/a&gt;, and again during his &lt;a href="http://mattatjavaone2007.blogspot.com/2007/05/java-university-developing-enterprise.html"&gt;Java University session at JavaOne 2007&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Keith began with a discussion of why we need patterns. In his opinion, patterns simply provide a way of thinking about a particular approach to a problem. One could liken them to blueprints. They typically have a name, a description of the problem being solved, a description of the solution approach, and finally a selection of implementation guidelines and considerations. Pretty nice summation.&lt;br /&gt;&lt;br /&gt;The particular patterns that Keith planned to discuss surrounded the different data access patterns typically found in web applications.&lt;br /&gt;&lt;br /&gt;Keith began by discussing the "Unit of Work" pattern, which he defined as a unit of interaction with a shared resource that executes independently of other units. These interactions exhibit &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID properties&lt;/a&gt;, and a database transaction provides a typical  example. In the context of an ORM such as Hibernate, a Unit of Work tracks changes to the object graph during a transaction and then synchronizes those changes with the database when the transaction is complete. Keith followed this discussion with an implementation example from his "Reward Network" sample application.  &lt;br /&gt;&lt;br /&gt;Keith followed this discussion with two of what I'll call "subpatterns" of the Unit of Work pattern: Pessimistic and Optimistic Locking. With pessimistic locking, you prevent other units from accessing your data during a given unit of work, and then release the "lock" as soon as possible. This locking is performed to prevent a &lt;a href="http://en.wikipedia.org/wiki/Race_condition"&gt;race condition&lt;/a&gt;, resulting in an inconsistent state in your model. Keith briefly illustrated implementation of pessimistic locking with Hibernate.&lt;br /&gt;&lt;br /&gt;It's always interesting when someone asks a slightly off-topic question which ends up in a take home gem of information. At this point, someone asked if the implementations that Keith was showing showcased Spring's Hibernate support. To this Keith surprised me by answering (and I paraphrase), "Hibernate's native API's are much more mature and powerful now, so we recommend you use those rather than Spring's Hibernate API wrapper. Why add another dependency?" He then proceeded to recommend Rossen Stoyanchev's Saturday morning session on "Working with Hibernate in a Spring 2.5 Environment" (blog entry to come later!). One of the better quotes of the conference came during this aside as well:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;i&gt;Whenever you can eliminate a dependency, you should.&lt;/i&gt;&lt;br /&gt;- Keith Donald&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Well, back to the presentation. Keith then moved into a discussion of Optimistic Locking. Here, within a business transaction that executes across a series of system transactions, you use optimistic locking to prevent corruption of shared data. An examples is where several users can edit account information concurrently, but the frequency of concurrent access is fairly low. Data integrity is still at risk, so you use optimistic locking to handle those infrequent cases. Keith them demonstrated the use of &lt;a href="http://www.hibernate.org/hib_docs/reference/en/html/transactions.html#transactions-optimistic"&gt;Hibernate versioning to implement optimistic locking&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Keith next moved into a discussion of the controversial "Open Session in View" pattern. This is a specialized technical pattern where by the Hibernate session is kept open for the duration of a given web request. It is generally used as a "quick fix" to prevent lazy loading exceptions in the view tier. This is generally considered a bad thing, as you end up with a great deal of "N+1 Select" situations while rendering the view, resulting in way too much SQL executed against the database. Typically, the need to use this pattern reveals a flaw in the design of your model or queries. For example, since you generally know how far in the object graph you'll need to go for a specific view, you should load those relationships eagerly for that use case. You may also consider whether or not a given object association is appropriate to begin with.&lt;br /&gt;&lt;br /&gt;The final major pattern that Keith discussed was the "Conversational Persistence Context" pattern that is present in the upcoming Spring Web Flow 2.0 release. It is essentially a more flexible variation of the Open Session in View pattern, where by you can have an open session spanning multiple requests during a long-running user interaction context, or "conversation." To be perfectly honest, I still don't quite "get" this pattern beyond that, probably because I don't know much about Web Flow or it's cousins (e.g. Seam, Web Beans JSR-299).&lt;br /&gt;&lt;br /&gt;Keith closed with a very brief description of Master Detail, where you show an overview of objects in a collection and then allow drilling down into object details, and Paging, where you allow users to easily browse through a list of items of interest. I raised a point of contention with Keith at this point. His example implementation showed delegation of the paging concern to the DAO layer, rather than implementing that concern in the View layer. When I asked him where he thought it belonged, he thought it was obvious that it belonged in the DAO layer. I then let on that we had this debate in our team and decided the the concern belonged in the View layer. Why should I run the same query multiple times just to page through the data? Why not load the entire data set and then let the View tier decide how to page through it? Keith gracefully acknowledged my point.&lt;br /&gt;&lt;br /&gt;All in all, this was a great session, if for no other reason than it reminded me of some best practices in this area and let me in on the little secret about using native Hibernate API's rather than Spring's Hibernate template. Nice job, Keith.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2002946949539465869?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2002946949539465869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2002946949539465869' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2002946949539465869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2002946949539465869'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/web-application-data-access-patterns.html' title='Web Application Data Access Patterns: Keith Donald'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-1125929799059301942</id><published>2007-12-15T21:09:00.000-06:00</published><updated>2007-12-15T21:31:05.996-06:00</updated><title type='text'>Goodbye Spring Experience 2007!</title><content type='html'>&lt;a border="0" href="http://picasaweb.google.com/matt.stine/TheSpringExperience2007/photo#5144397897054158610"&gt;&lt;img src="http://lh3.google.com/matt.stine/R2SSoZUt_xI/AAAAAAAAAYQ/Ijb1Py3pDN4/s288/DSCN0746.JPG" align="left" /&gt;&lt;/a&gt;Well it had to end eventually. As you can see, I'm hopelessly behind on my blog entries, having only made it through my first day of sessions. I've still got several more I intend to cover (I probably won't do the last two as I started blanking out - I think my brain was pretty much melted by this afternoon). Look for those entries in the coming days. Many thanks go out to &lt;a href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff &lt;/a&gt;and &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt; for putting on an awesome conference!&lt;br /&gt;&lt;br /&gt;There were several things I really liked about this conference that I believe set it apart from most of the conferences that I have attended.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The technical content was top-notch - Spring topics from the developers themselves. There were also quite a few architecture/design sessions that were also superb.&lt;/li&gt;&lt;li&gt;The session length, at 90 minutes, provided ample time to cover each topic pretty well in-depth. The session scope cooperated with this, as most of the speakers didn't try to do too broad of subjects for the time allotted.&lt;/li&gt;&lt;li&gt;It was a smaller conference, at a little over 500 developers. This meant you weren't trying to weave through crowds to get in queues for packed out sessions like at JavaOne. Much less stressful.&lt;/li&gt;&lt;li&gt;The atmosphere was just plain fun. Everyone was laid back. I mean, how many conferences give you a bobblehead doll on the first night! I now issue a call out to Sun that we must have a James Gosling bobblehead doll issued to every attendee at JavaOne 2008!&lt;/li&gt;&lt;li&gt;The food was top notch - every meal was provided, buffet-style (no boxes!!!). I ate way too much.&lt;/li&gt;&lt;li&gt;The location was great. You can't beat a front-on view of the Atlantic Ocean from the conference center balcony during session breaks.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SWAG! Let's see what all I collected: a computer bag, a binder with all of the slides, two t-shirts, a hat, sunglasses, a beach towel, a Frisbee, a NFJS Anthology, a bobblehead doll, a Spring Source toolkit (two screwdrivers and a measuring tape - you'd have to see it)...what's more, Jay Zimmerman distributed the left-over swag after the conference closed. I picked up two more computer bags full of swag and two conference binders to give away at the January and February Memphis JUG meetings!&lt;/li&gt;&lt;/ol&gt;Once again, thanks for a great conference. It was easily the best all-around that I've attended.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a border="0" href="http://picasaweb.google.com/matt.stine/TheSpringExperience2007/photo#5144397905644093234"&gt;&lt;img src="http://lh5.google.com/matt.stine/R2SSo5Ut_zI/AAAAAAAAAYg/BUmwMhV_HoQ/s288/DSCN0752.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-1125929799059301942?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/1125929799059301942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=1125929799059301942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1125929799059301942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1125929799059301942'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/goodbye-spring-experience-2007.html' title='Goodbye Spring Experience 2007!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5788511462671683580</id><published>2007-12-15T09:06:00.000-06:00</published><updated>2007-12-15T13:38:43.548-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>The State of the Art in Dependency Injection: Rod Johnson</title><content type='html'>This was a truly fascinating talk. If you ever wanted to learn the entire history and landscape of dependency injection (DI), this was your opportunity. I really didn't realize how deep of a topic DI really is.&lt;br /&gt;&lt;br /&gt;According to Rod, DI had its beginnings in 2002, in the Interface 21 Framework that was born from his seminal work, &lt;a href="http://www.amazon.com/Expert-One-One-Design-Development/dp/1861007841"&gt;&lt;span style="font-style: italic;"&gt;Expert One-on-One J2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;EE&lt;/span&gt; Design and Development&lt;/span&gt;&lt;/a&gt;. In the beginning, DI was done solely through setter injection (SI), with external &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;metadata&lt;/span&gt; (usually in XML). 2003 gave us Spring 0.9, which had the same DI model, but added &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;FactoryBeans&lt;/span&gt; for indirection and proxy-based &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;AOP&lt;/span&gt; (enabling among other things, declarative transaction management). With Spring, DI was always just one enabler of a complete enterprise solution. Contrast that with &lt;a href="http://www.picocontainer.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;PicoContainer&lt;/span&gt;&lt;/a&gt;, also arriving on the scene in 2003, which was an ultra-lightweight DI-only container. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;PicoContainer&lt;/span&gt; brought us several innovations, including constructor injection, automatic resolution by type, and an attempt to dispense with external configuration.&lt;br /&gt;&lt;br /&gt;Rod then discussed the Pros and Cons of Constructor Injection (CI). On the Pro side, we see that CI is great for immutable objects, can be used with existing code, enforces that the necessary dependencies are provided at object construction, and allows developers to dispense with methods like &lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;afterPropertiesSet&lt;/span&gt;()&lt;/span&gt;. On the Con side, there are no default arguments in Java, which forces us to ALWAYS provide all of the necessary dependencies, constructor overriding can be somewhat messy, and constructor &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;argument&lt;/span&gt; names are not usually available through reflection, which forces us to depend on argument order for dependency resolution.&lt;br /&gt;&lt;br /&gt;Spring 1.0, which arrived in late 2003, incorporated some of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;PicoContainer's&lt;/span&gt; innovation: CI, "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Autowiring&lt;/span&gt;" by type and by name, as well as the ability to mix CI and SI. Here Rod reflected on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Spring's&lt;/span&gt; pragmatic philosophy, whereby they are more than willing to incorporate the good ideas that others had first.&lt;br /&gt;&lt;br /&gt;Spring 1.1 brought us method injection, a unique Spring feature, which solved the problem of long-lived managed objects which depend on short-lived objects. It also brought us Factory Methods. You now had the ability to create objects through invoking static factory methods or instance methods on other beans.&lt;br /&gt;&lt;br /&gt;With the finalization of the &lt;a href="http://java.sun.com/products/ejb/docs.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;EJB&lt;/span&gt; 3.0 standard&lt;/a&gt; in May 2006, several new ideas became available in the world of DI: annotation-based DI, annotations for callback methods (e.g. &lt;span style="font-weight: bold; font-style: italic;"&gt;@&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;PostConstruct&lt;/span&gt;&lt;/span&gt;), scanning for annotations without any external configuration needed for a deployment unit, and field injection (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;FI&lt;/span&gt;). These &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;EJB&lt;/span&gt; standard brought with it a new philosophy - that annotations are a superior model and that externalization should be a second-class citizen. The Pros of this standard? One big one - no configuration is necessary for simple cases. The Cons? Rod listed several: resources could only be injected from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;JNDI&lt;/span&gt;, no CI, limited control over object &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;lifecycle&lt;/span&gt;, unsuitability for fine-grained object graphs, effectively &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_17"&gt;usable&lt;/span&gt; ONLY with annotations, as the XML configuration option is so verbose, and it isn't just DI - it brings along with it enforcement of many obsolete &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;EJB&lt;/span&gt; concepts (such as bean instance pooling).&lt;br /&gt;&lt;br /&gt;Spring 2.0 arrived in late 2005 with its own share of innovations: integration with &lt;a href="http://www.eclipse.org/aspectj/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;AspectJ&lt;/span&gt;&lt;/a&gt;, the ability to inject &lt;span style="font-style: italic;"&gt;anything&lt;/span&gt; with an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;AspectJ&lt;/span&gt; aspect via &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;@Configurable&lt;/span&gt;&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;namespaces&lt;/span&gt; to provide an XML-based &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;DSL&lt;/span&gt; for external configuration, the &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;@Required&lt;/span&gt;&lt;/span&gt; annotation, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;pluggable&lt;/span&gt; scopes to manage the object &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;lifecycle&lt;/span&gt;. About that same time, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;JBoss&lt;/span&gt; Seam introduced many strange ideas (that I didn't quite grasp from Rod's explanation): &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;bijection&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;outjection&lt;/span&gt;, and subversion of control.&lt;br /&gt;&lt;br /&gt;Some additional players on the field include Spring Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Config&lt;/span&gt;, which is a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;DSL&lt;/span&gt; for configuration in Java, &lt;a href="http://code.google.com/p/google-guice/"&gt;Google &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;Guice&lt;/span&gt; 1.0&lt;/a&gt;, and the &lt;a href="http://jcp.org/en/jsr/detail?id=299"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;JSR&lt;/span&gt;-299 Web Beans spec&lt;/a&gt;, which Rod described as "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;blogware&lt;/span&gt;" in that there is currently no available implementation.&lt;br /&gt;&lt;br /&gt;Finally we got to Spring 2.5, released last month. Rod didn't have his slides printed or available on the web (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;argh&lt;/span&gt;!), so about this time my hand was really hurting from taking furious notes, and I simply gave up. Fortunately, most of what Rod covered was redundant from some of the other sessions, so I'll have or will blog about it later. About the only thing I really don't have good notes on is Spring Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;Config&lt;/span&gt;, which he discussed pretty extensively. If you want to learn more about it, check out &lt;a href="http://www.springframework.org/javaconfig"&gt;http://www.springframework.org/javaconfig&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5788511462671683580?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5788511462671683580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5788511462671683580' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5788511462671683580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5788511462671683580'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/state-of-art-in-dependency-injection.html' title='The State of the Art in Dependency Injection: Rod Johnson'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2839688267337207077</id><published>2007-12-14T14:40:00.000-06:00</published><updated>2007-12-14T14:57:40.375-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Ajax Integration Guide for 2008: Jeremy Grelle</title><content type='html'>This talk looked really exciting going in. Jeremy is a member of the Spring Web Products team and the lead of Spring Faces, as well as a member of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JSF&lt;/span&gt; 2.0 Expert Group. He describes himself as the resident Ajax freak at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SpringSource&lt;/span&gt;. Jeremy began by discussing the current Ajax landscape, highlighting what he believes are the important features a successful framework must deliver, and then identifying the frameworks he considers to be the cream of the crop. No surprises here on the list: Prototype/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Scriptaculous&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;jQuery&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;YUI&lt;/span&gt;, Ext, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Dojo&lt;/span&gt;. He then gave a brief high-level overview of each framework - I really didn't learn anything new here, as I've been following these frameworks for quite awhile. He mentioned the commonality that all of these frameworks are about more than asynchronous client-server communication - they're about improving your client-side code and user experience. See Dion's May 2007 comment that Ajax "was never about the acronym - it's about building killer websites." What is good about all of these frameworks is that you can use all of them in an unobtrusive manner and progressively enhance your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;UI&lt;/span&gt;. This gives you the ability to only &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Ajaxify&lt;/span&gt; what you need and also get graceful degradation.&lt;br /&gt;&lt;br /&gt;In the second portion of his talk, Jeremy talked about connecting to Spring. I was really hoping that the "goods" would be delivered here. He started by mentioning &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;DWR&lt;/span&gt;, which I think is a really nice framework. It merited 2 slides and no demo (even though there was a slide mentioning a demo). I don't think Jeremy really cares for it or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;GWT&lt;/span&gt;, as he sort of lumped them together and didn't mention them again. I do appreciate his point that neither really allows you to harvest any existing controlling infrastructure that we may have built using Spring &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;MVC&lt;/span&gt; or another framework.&lt;br /&gt;&lt;br /&gt;Jeremy then moved into what he considers the better way to do it, which is the progressive enhancement I mentioned above. He took the existing Spring Booking &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;MVC&lt;/span&gt; + Web Flow example application and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;ajaxified&lt;/span&gt; portions of it. He did this using an interesting combination of Apache Tiles, some Javascript "pseudo-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;AOP&lt;/span&gt;" he lifted from the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;SpringFaces&lt;/span&gt; project, and a bit of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Dojo&lt;/span&gt;. It seemed to work really well, but it wasn't immediately clear how this type of technology was going to be made available to us as developers. He said something along the lines of "you don't have to be using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;JSF&lt;/span&gt; to use this Javascript, so we probably need to change the name to something else." I hope they figure out soon so I can get my hands on it. :-)&lt;br /&gt;&lt;br /&gt;He closed by briefly discussing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;REST's&lt;/span&gt; place in the future of Spring Web. The ideal scenario, according to Jeremy, is that we will be able to request different representations of the same resource. For example, we could request HTML for full page display or partial DOM updates, and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;JSON&lt;/span&gt; for intelligent widgets like the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;Dojo&lt;/span&gt; table.&lt;br /&gt;&lt;br /&gt;It looks like a lot of exciting things will happen in 2008. I hope I don't have to wait too long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2839688267337207077?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2839688267337207077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2839688267337207077' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2839688267337207077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2839688267337207077'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/ajax-integration-guide-for-2008-jeremy.html' title='Ajax Integration Guide for 2008: Jeremy Grelle'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2997920160192591744</id><published>2007-12-14T14:20:00.001-06:00</published><updated>2007-12-14T14:37:16.599-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>What's New in Spring 2.5? : Juergen Hoeller</title><content type='html'>This was my second talk of TSE 2007. I have to admit I chose it by process of elimination - none of the second session talks particularly jumped out and grabbed me like Chris Richardson's talk.&lt;br /&gt;&lt;br /&gt;Juergen is the project lead for the Spring Framework, so he was the obvious choice to give this talk. Juergen split it up into three sections:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Platforms&lt;/li&gt;&lt;li&gt;Annotation Configuration&lt;/li&gt;&lt;li&gt;AspectJ Support&lt;/li&gt;&lt;/ol&gt;To break down part one as quickly as possible, Spring supports virtually EVERYTHING. You get JDK 1.4 all the way to Java 6, including all of the new API's in Java 6. It fully supports Java EE 5 while remaining backward compatible all the way to J2EE 1.3.  You can now deploy a Spring ApplicationContext as a RAR file, and you also get full JCA 1.5 support (if you want to know what that means, don't ask me :-)). Quite notable was the fact that they have worked with IBM to support WebSphere's proprietary transaction manager. Also interesting was Spring's continuing strong support for OSGi as an alternative enterprise runtime.&lt;br /&gt;&lt;br /&gt;The annotation configuration part of the talk was quite fascinating. I'm something of an annotations junkie - I have to be careful about that. At any rate, it was so good that I was interested enough to attend Juergen and Mark Fisher's later talk that was completely dedicated to the subject. I'll leave the details for my entry on that talk.&lt;br /&gt;&lt;br /&gt;The final portion, on AspectJ support, was equally fascinating. The first new feature was the ability to advise specific beans by name rather than by type using AspectJ. This was made even sweeter by the fact that you can use pattern matching in your &lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;aop:advisor&gt;&lt;/span&gt; definition.  Very exciting was the ability to do AspectJ load-time weaving, meaning you can use the power of AspectJ at runtime without involving the AspectJ compiler. Unfortunately, this isn't available across all appservers. I didn't get a chance to ask and comfirm, but it seems that JBoss (our primary appserver) does not support this. GlassFish, Weblogic, OC4J, and Tomcat were all mentioned as being able to handle it.&lt;br /&gt;&lt;br /&gt;The most interesting part of this talk for me was the ability to annotate a class as &lt;span style="font-weight: bold; font-style: italic;"&gt;@Configurable&lt;/span&gt;, and then do dependency injection on it even thought it isn't managed by Spring. You could do this in Spring 2.0, but you had to use the AspectJ compiler. Now, with load-time weaving, you can do this at runtime! I really could have used this recently when I wanted to inject a single dependency into a class that was really overkill to manage as a Spring bean. Since I'm using Spring 2.5 in this project, I can go back and try this feature. Exciting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2997920160192591744?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2997920160192591744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2997920160192591744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2997920160192591744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2997920160192591744'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/whats-new-in-spring-25-juergen-hoeller.html' title='What&apos;s New in Spring 2.5? : Juergen Hoeller'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5190283237176990605</id><published>2007-12-13T20:20:00.001-06:00</published><updated>2008-12-11T01:53:50.108-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><title type='text'>Pair Programming with the Official Rod Johnson Bobblehead</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Vo63LRwAZbk/R2HoivNFFDI/AAAAAAAAAWg/Kp-khRPCwxU/s1600-h/rod_johnson_pairprog.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Vo63LRwAZbk/R2HoivNFFDI/AAAAAAAAAWg/Kp-khRPCwxU/s400/rod_johnson_pairprog.jpg" alt="" id="BLOGGER_PHOTO_ID_5143647932918338610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;As you can see, Rod really likes my Spring MVC configuration. :-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5190283237176990605?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5190283237176990605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5190283237176990605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5190283237176990605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5190283237176990605'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/pair-programming-with-official-rod.html' title='Pair Programming with the Official Rod Johnson Bobblehead'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Vo63LRwAZbk/R2HoivNFFDI/AAAAAAAAAWg/Kp-khRPCwxU/s72-c/rod_johnson_pairprog.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2242143335085168132</id><published>2007-12-13T16:32:00.000-06:00</published><updated>2007-12-13T19:24:30.960-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><title type='text'>Improving Application Design with a Rich Domain Model: Chris Richardson</title><content type='html'>This was my very first session of the conference. I've really been looking forward to it. I became pretty excited about object-oriented programming when I first really learned it in my computer simulation course at Ole Miss. In that course we built discrete event simulation programs using collaborating Java threads. Each thread implemented an object from the domain model representing a particular simulation problem. Once I got into the "working world," I found that the architecture described by Rod Johnson as the "J2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;EE&lt;/span&gt; stove pipe" had made my &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;OO&lt;/span&gt; skills essentially unusable in the projects on which I was required to work on a day-to-day basis. My recent experiences developing in a more &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;POJO&lt;/span&gt;-based style, particularly with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;JPA&lt;/span&gt;/Hibernate, have allowed me to get closer to my preferred &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;OO&lt;/span&gt;-style, but the business logic still lived in the service-tier. My domain model was still essentially "anemic" to borrow from Martin Fowler.&lt;br /&gt;&lt;br /&gt;When I read the description for this session I was elated! Finally I could see that someone was building real enterprise applications using object-oriented techniques! I've never quite been able to articulate what I felt was wrong with the way we're building applications in my group. I was fortunate enough to have breakfast with Chris Richardson prior to the session, and he said that addressing my inability to articulate those problems was one of the goals of his talk. Awesome! On to the session...&lt;br /&gt;&lt;br /&gt;Chris began with a tour through his object-based programming experience, beginning in LISP, followed by C++ and then Java. Around 1999 he got into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;EJB&lt;/span&gt; programming, and described his experience as "Applications were still built from objects, but those objects were very different..." Basically the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;EJB&lt;/span&gt; paradigm caused us to abandon object-oriented programming in favor of procedural programming. Why? Well, for all of the pros surrounding &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;EJB&lt;/span&gt;, it made writing object-oriented code difficult, and in some cases, impossible. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;EJB&lt;/span&gt;/procedural style works very well for simple business logic, but it doesn't scale well as business logic becomes more complex. The result is a few monolithic transactional classes containing hundreds to thousands of lines of code embedded in very long methods. Hence, the legacy of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;EJB&lt;/span&gt; (and I quote):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java is an object-oriented language, AND...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Object-oriented design is a better way to tackle complexity, YET...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Many complex enterprise Java applications are written in a procedural style&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Chris then moved on to discuss the rich domain model pattern, which is really nothing new at all. It's just good &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;OO&lt;/span&gt; design. Most of your classes (or entities) correspond to real world concepts, and the business logic is spread amongst them. Classes are true objects: they contain state and behavior. The goal is to push as much business logic as possible down into the domain objects, which is exactly where it belongs. What do you get? Better maintainability, better testability, better &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;reusability&lt;/span&gt;, and a better shared understanding of your domain. Not only that, but your code is &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;quantifiably&lt;/span&gt; simpler! Who doesn't want that? The main drawback to this is that you have to have good &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;OO&lt;/span&gt; design skills to make it happen - which is exactly what the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;EJB&lt;/span&gt; programming model has made scarce.&lt;br /&gt;&lt;br /&gt;Chris followed this up by discussing the building blocks of domain models, concepts he derived from Eric Evans' book &lt;span style="font-style: italic;"&gt;Domain Driven Design&lt;span style="font-style: italic;"&gt;. &lt;/span&gt;&lt;/span&gt;In a nutshell, they are Entities, Value Objects, Aggregates, Services, Factories, and Repositories - the reader can get the book to find out what these are. Interesting notes for me include the fact that Repositories are nearly equivalent to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;DAO's&lt;/span&gt;, especially the way I typically implement them. The concept of a Service is far different from what I'm used to. I "grew up" writing services according to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;EJB&lt;/span&gt; Session Bean/Facade model, where essentially all of your business logic resides in service methods. Chris defined a service as a class implementing only logic that cannot be put in a single entity. They are actually quite thin!&lt;br /&gt;&lt;br /&gt;Next came the discussion of frameworks and their role. In short, frameworks act as an enabler to rich domain models when used properly. Your domain model should be implemented purely as Plain Old Java Objects (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;POJO's&lt;/span&gt;) in that they don't implement any infrastructure interfaces or call infrastructure &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;API's&lt;/span&gt;. The jury is still out on annotations - Chris argues that they still violate the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;POJO&lt;/span&gt; concept, I'm not so sure. You then wire your model together using dependency injection, handle crosscutting concerns (transaction management, security, logging, etc.) with Aspect-Oriented Programming (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;AOP&lt;/span&gt;), and use object/relational mapping (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;ORM&lt;/span&gt;) for persistence. What you often run into as obstacles are that many of these frameworks, particularly web and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;ORM&lt;/span&gt; frameworks, force you to introduce "smells" into your code for the framework to use them. Examples include requirements for public default constructors and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;JavaBean&lt;/span&gt;-style setters.&lt;br /&gt;&lt;br /&gt;Chris closed with an awesome discussion of common code smells and the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;refactorings&lt;/span&gt; used to eliminate them. I was most interested in Feature Envy, which is where you have methods that are far too interested in data belonging to other classes. This is very common in session facades, and the healing factor is to push that logic down into the appropriate domain classes. Another interesting smell was Primitive Obsession, where code uses built-in types (such as String and Integer) instead of application classes to represent state. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;refactoring&lt;/span&gt; in this case is to introduce Value Objects, which are immutable, validated objects representing domain concepts (e.g. a shipping address).&lt;br /&gt;&lt;br /&gt;Chris closed with the charge to begin &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;refactoring&lt;/span&gt; our procedural designs into a rich domain model on MONDAY! Oh, how I can't wait to begin. Good job Chris!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2242143335085168132?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2242143335085168132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2242143335085168132' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2242143335085168132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2242143335085168132'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/improving-application-design-with-rich.html' title='Improving Application Design with a Rich Domain Model: Chris Richardson'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2383585779561975667</id><published>2007-12-13T13:02:00.000-06:00</published><updated>2007-12-13T19:24:30.961-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thespringexperience2007'/><title type='text'>Enterprise Java and the Changing of the Guard</title><content type='html'>Greetings from &lt;a href="http://www.thespringexperience.com"&gt;The Spring Experience 2007&lt;/a&gt; in Hollywood, FL. So far this has been a great conference - I'm currently waiting for my third session of the day to start. As much as I enjoy all of the hype and eye candy at &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JavaOne&lt;/span&gt;, I really get a lot more out of these smaller conferences as you're not running around stressed out trying to weave through thousands of geeks as you move from session to session (or more &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;accurately&lt;/span&gt;, from session to queue!).&lt;br /&gt;&lt;br /&gt;I wanted to post a few insights that I gained from Rod Johnson's keynote last night (the title of this entry). The basis for Rod's presentation was a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Gartner&lt;/span&gt; report entitled "&lt;a href="http://www.gartner.com/DisplayDocument?ref=g_search&amp;amp;id=525420&amp;amp;subref=simplesearch"&gt;Trends in Platform &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Middleware&lt;/span&gt;: Disruption Is in Sight&lt;/a&gt;." To summarize, there are many converging forces in the enterprise Java space that are causing or will probably cause a great deal of disruption in the way we develop enterprise Java applications. These forces include our collective experience with application servers, the rediscovery of object-oriented or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;POJO&lt;/span&gt;-based programming, open source innovation, non-Java challengers (.NET, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;RoR&lt;/span&gt;), the rise of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SOA&lt;/span&gt;, and Rich Internet Applications. Rod sees a big movement from the "old guard," which he described as the "J2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;EE&lt;/span&gt; Stovepipe Architecture" which was based primarily around the idea of distributed objects, to a world in which many of the highest volume Java applications don't even use a Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;EE&lt;/span&gt; application server. An interesting point was the stagnation in job requirements for the big name application servers coupled with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;BZ&lt;/span&gt; Research statistic that 64% of Java application developers are using Tomcat for production deployment. Yet another force for disruption is the emergence of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;OSGi&lt;/span&gt;, which allows developers to modularize applications and provides facilities for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;versioned&lt;/span&gt; components, fine-grained redeployment, and library conflict resolution - all features that Java EE currently does not and perhaps cannot address. Open source provides yet more disruption, as developers have become participants in rather than spectators of the development of Java enterprise solutions. Innovation is now primarily coming from the open source world. All of this culminated in the rather telegraphed conclusion that Rod (and also the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Gartner&lt;/span&gt; report apparently) believes that Spring is uniquely positioned to provide the best value for ongoing Enterprise Java development in the face of the current trends. Of course, what would you expect him to say? :-) &lt;a href="http://www.gartner.com/DisplayDocument?ref=g_search&amp;amp;id=525420&amp;amp;subref=simplesearch"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;I do tend to agree with him. The pace at which Spring is innovating and addressing the Java enterprise pain points far outpaces the pace of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;JCP&lt;/span&gt;. It just takes too long to design specs by committee. One of the more wise things that Spring does is to learn from and in most cases &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;accommodate&lt;/span&gt; the changing landscape of Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;EE&lt;/span&gt; and integrate the best features directly into the framework. I for one am glad to be developing applications with Spring, as it makes it very easy to do the things I want to do and write quality code that isn't directly dependent on an infrastructure framework. Generally, it stays out of my way.&lt;br /&gt;&lt;br /&gt;More to come on the sessions I've attended thus far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2383585779561975667?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2383585779561975667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2383585779561975667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2383585779561975667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2383585779561975667'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/12/enterprise-java-and-changing-of-guard.html' title='Enterprise Java and the Changing of the Guard'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-1898096725946207099</id><published>2007-11-08T08:22:00.000-06:00</published><updated>2007-12-13T19:24:06.601-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>13949712720901ForOSX</title><content type='html'>Here's my vote for Java 6 on Mac OS X Leopard!&lt;br /&gt;&lt;br /&gt;13949712720901ForOSX&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-1898096725946207099?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/1898096725946207099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=1898096725946207099' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1898096725946207099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1898096725946207099'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/11/13949712720901forosx.html' title='13949712720901ForOSX'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-646978298338342752</id><published>2007-10-12T17:03:00.000-05:00</published><updated>2007-10-12T17:05:07.245-05:00</updated><title type='text'>Ajax Construction Kit: Building Plug-and-Play Ajax Applications</title><content type='html'>&lt;a href="http://www.javalobby.org/articles/ajax-construction-kit/"&gt;My first book review&lt;/a&gt; for &lt;a href="http://www.javalobby.org"&gt;Javalobby&lt;/a&gt; was published today!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-646978298338342752?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/646978298338342752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=646978298338342752' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/646978298338342752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/646978298338342752'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/10/ajax-construction-kit-building-plug-and.html' title='Ajax Construction Kit: Building Plug-and-Play Ajax Applications'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-9048609246664272893</id><published>2007-09-05T11:00:00.000-05:00</published><updated>2007-09-05T11:03:37.801-05:00</updated><title type='text'>Please support me in the 2007 Walk to Cure Diabetes</title><content type='html'>This year, I'll be taking part in JDRF's Walk to Cure Diabetes, along with one-half million other walkers across the country, as we try to reach our goal of raising $90 million.&lt;br /&gt;&lt;br /&gt;Type 1, or juvenile, diabetes, is a devastating disease that affects millions of people - a large and growing percentage of them children. One of them is my oldest daughter, Abby, who is three years old.&lt;br /&gt;&lt;br /&gt;Since Abby's diagnosis, she's had her fingers pricked over 800 times already. She's received more than 200 shots in her arms, legs, and tummy. Over the course of her life, she'll continue to receive daily insulin injections and finger pricks. She must take insulin to stay alive. We must constantly monitor her glucose levels to ward off complications such as blindness, kidney failure, and stroke. Abby must maintain strict control of her diet every day (even on birthdays and holidays), check her blood sugar at least 6 times a day, and take insulin at least twice a day.&lt;br /&gt;&lt;br /&gt;There is some good news, though. For the first time, scientists are predicting that we CAN expect to see a cure well within our lifetime! This is exactly what we're wishing for, so we've formed a team called "Wishing With Abby," and we'd love to have your help.&lt;br /&gt;&lt;br /&gt;Please visit my Walk Web page if you would like to donate online or see how close I am to&lt;br /&gt;reaching my personal goal:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://walk.jdrf.org/walker.cfm?id=86761462"&gt;http://walk.jdrf.org/walker.cfm?id=86761462&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Follow this link to make a donation:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://walk.jdrf.org/support.cfm?id=86761462"&gt;http://walk.jdrf.org/support.cfm?id=86761462&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-9048609246664272893?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/9048609246664272893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=9048609246664272893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/9048609246664272893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/9048609246664272893'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/09/please-support-me-in-2007-walk-to-cure.html' title='Please support me in the 2007 Walk to Cure Diabetes'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8000672706428938914</id><published>2007-08-29T16:11:00.000-05:00</published><updated>2008-12-11T01:53:50.372-06:00</updated><title type='text'>Welcome to Matt's Mac Paradise</title><content type='html'>&lt;div style="MARGIN: 0px auto 10px; TEXT-ALIGN: center"&gt;&lt;a href="http://2.bp.blogspot.com/_Vo63LRwAZbk/RtXhAhQ4WVI/AAAAAAAAAQM/bMm-2pre3v8/s1600-h/DSCN0713.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_" alt="" src="http://2.bp.blogspot.com/_Vo63LRwAZbk/RtXhAhQ4WVI/AAAAAAAAAQM/bMm-2pre3v8/s400/DSCN0713.JPG" border="0" /&gt;&lt;/a&gt; &lt;/div&gt;I've been wanting to post a picture of my new work setup for awhile, but I wanted to wait until I finished getting setup over at 160 Shadyac Avenue. Just for fun, I thought I'd go VMWare Fusion crazy and boot up every virtual machine I've got - you're actually looking at 7 OS's booted concurrently between two machines. To the left I've got my 15" MacBook Pro (2.2 GHz Intel Core 2 Duo processor, 4 GB 667 MHz DDR2 SDRAM) running Mac OS 10.4, Windows XP, and Ubuntu. To the right I've got my Mac Pro tower (2 x 2 GHz Dual-Core Intel Xeon processors, 5 GB 66 MHz DDR2 FB-DIMM RAM) driving the dual 19" Dell LCD's, running Mac OS 10.4, Windows XP, Ubuntu, and Solaris Express. Whew - that was a mouthful. Thanks to Matt Raible for &lt;a href="http://raibledesigns.com/rd/entry/re_one_30_monitor_or"&gt;blogging&lt;/a&gt; about the Griffin Technologies iCurve laptop stand - I picked up its successor, the Elevator, for my MacBook Pro. I've got pictures from my past desktops over the years - I need to dig them up and show the procession of developer technology here. It's been quite a ride from my first system as a junior developer six plus years ago.&lt;div style='clear:both; text-align:CENTER'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8000672706428938914?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8000672706428938914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8000672706428938914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8000672706428938914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8000672706428938914'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/08/welcome-to-matts-mac-paradise.html' title='Welcome to Matt&apos;s Mac Paradise'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vo63LRwAZbk/RtXhAhQ4WVI/AAAAAAAAAQM/bMm-2pre3v8/s72-c/DSCN0713.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-4443637511547780754</id><published>2007-08-17T15:54:00.000-05:00</published><updated>2008-12-11T01:53:50.742-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='office'/><title type='text'>Haven't had much time to blog lately....</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Vo63LRwAZbk/RsYLERQ4WSI/AAAAAAAAAP0/Z6Sap8em5GY/s1600-h/DSCN0706.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_" alt="" src="http://2.bp.blogspot.com/_Vo63LRwAZbk/RsYLERQ4WSI/AAAAAAAAAP0/Z6Sap8em5GY/s400/DSCN0706.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;....because we've been packing to move on top of all of our regular projects. St. Jude has nicely renovated a new building for us, so we developers are moving. This is where I'm headed on Monday:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Vo63LRwAZbk/RsYMGBQ4WUI/AAAAAAAAAQE/jDsZtab8xBA/s1600-h/DSC_4433.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Vo63LRwAZbk/RsYMGBQ4WUI/AAAAAAAAAQE/jDsZtab8xBA/s400/DSC_4433.JPG" alt="" id="BLOGGER_PHOTO_ID_5099776925601651010" border="0" /&gt;&lt;/a&gt;I'm both loving it and a little sad - I've been sitting in my desk for nearly my entire career as a software developer. I just know I'm going to park in the garage and come downstairs one morning to find my office gone. :-)&lt;br /&gt;&lt;/div&gt;&lt;div style="clear: both; text-align: center;"&gt;&lt;a href="http://picasa.google.com/blogger/" target="ext"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-4443637511547780754?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/4443637511547780754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=4443637511547780754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/4443637511547780754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/4443637511547780754'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/08/havent-had-much-time-to-blog-lately.html' title='Haven&apos;t had much time to blog lately....'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vo63LRwAZbk/RsYLERQ4WSI/AAAAAAAAAP0/Z6Sap8em5GY/s72-c/DSCN0706.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7153262465060836569</id><published>2007-07-27T13:59:00.000-05:00</published><updated>2007-07-27T14:03:08.478-05:00</updated><title type='text'>STJUDE-SRM 1.0 Released</title><content type='html'>From &lt;a href="http://sourceforge.net/forum/forum.php?forum_id=719803"&gt;http://sourceforge.net/forum/forum.php?forum_id=719803&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;On July 27, 2007, STJUDE-SRM 1.0 was released.&lt;br /&gt;&lt;br /&gt;STJUDE-SRM is a laboratory management system designed to support shared resource facility (or core lab) activities. It was designed and developed by the Hartwell Center for Bioinformatics and Biotechnology at St. Jude Children's Research Hospital.&lt;br /&gt;&lt;br /&gt;Shared resources supported include DNA synthesis, Peptide synthesis, DNA sequencing, Functional Genomics (spotted microarray laboratory), and Affymetrix (commercial microarrays) laboratories. STJUDE-SRM was also designed so that it is sufficiently modular and scalable to support other laboratory activities as needed. It could conceivably support all facilities on a campus or at a research organization and provide a single portal for investigators to access these resources, retrieve data, receive invoices for services, and generate reports.&lt;br /&gt;&lt;br /&gt;Currently available is a build of STJUDE-SRM which is certified for JBoss 4.2.0.GA running on J2SE 5.0. Builds for JBoss 4.0.5.GA and BEA Weblogic Server 8.1 are forthcoming.&lt;br /&gt;&lt;br /&gt;STJUDE-SRM 1.0 can be downloaded here: &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=197795" target="_new"&gt;http://sourceforge.net/project/showfiles.php?group_id=197795&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please report all bugs you find in the STJUDE-SRM bug tracker: &lt;a href="http://sourceforge.net/tracker/?group_id=197795&amp;atid=962898" target="_new"&gt;http://sourceforge.net/tracker/?group_id=197795&amp;amp;atid=962898&lt;/a&gt;&lt;/blockquote&gt;&lt;a href="http://sourceforge.net/tracker/?group_id=197795&amp;atid=962898" target="_new"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a VERY satisfying announcement for me, as I have spent the better part of the last six years working on this project. I was so excited when I learned we would be releasing it to the open source community. Enjoy!&lt;br /&gt;&lt;br /&gt;For more information on STJUDE-SRM, please visit: &lt;a href="http://stjude-srm.sourceforge.net"&gt;http://stjude-srm.sourceforge.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/tracker/?group_id=197795&amp;amp;atid=962898" target="_new"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7153262465060836569?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/7153262465060836569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=7153262465060836569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7153262465060836569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7153262465060836569'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/07/stjude-srm-10-released.html' title='STJUDE-SRM 1.0 Released'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7884160153641895756</id><published>2007-07-10T14:14:00.000-05:00</published><updated>2007-07-10T22:22:29.902-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>My Professional Development Goals for 2007-2008</title><content type='html'>I posted earlier on my desire to &lt;a href="http://matt-stine.blogspot.com/2007/07/help-me-become-better-programmer.html"&gt;become a better programmer&lt;/a&gt;. Well, I've since put together a plan of action for the next twelve months. I've based some of these goals on suggestions from &lt;span style="font-style: italic;"&gt;The Pragmatic Programmer&lt;/span&gt; by Andy Hunt and Dave Thomas.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Learn Groovy and Grails&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Andy and Dave suggest learning a new language every year. I had already informally started learning Groovy and Grails after &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JavaOne&lt;/span&gt; 2007. Since I already have a head start on this one, Groovy will be my language for the next year (I'm learning Grails mainly because of my web development background - it will provide me more opportunity to apply my Groovy knowledge). This should be an easy way to get started on the goal of a new language each year since my Java knowledge should transfer easily.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Release &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;HallKeeper&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; v1.0 as part of #1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Several years ago I started an open source project called &lt;a href="http://code.google.com/p/hallkeeper"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;HallKeeper&lt;/span&gt;&lt;/a&gt;. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;HallKeeper&lt;/span&gt; is planned to be a web-based management system for university residence halls. Life got in the way of this project so it lay dormant for a few years. I've recently revived it as sort of a "lab" in which to learn Groovy and Grails, and hopefully have a little fun along the way.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Read and LEARN the following books:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Definitive Guide to Grails - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Rocher&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The Pragmatic Programmer - Hunt, Thomas&lt;/li&gt;&lt;li&gt;Computer Algorithms: Introduction to Design &amp; Analysis - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Baase&lt;/span&gt;, Van &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Gelder&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Concepts of Programming Languages: &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Sebesta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Groovy in Action - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Konig&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;When I say LEARN, I mean I don't just want to do a cursory read of these. I want to really engage the concepts presented in each and apply them to my day-to-day work. I already have a head start reading the first two books. The third and fourth books are actually textbooks from my undergraduate education. I could really use a refresher on these concepts, and I think I'm a much more serious student now as a professional than I was when I was actually a student.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Review two books for the &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;JavaLobby&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;DZone&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; book review team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I joined this team several months ago and was actually assigned to review two books - again, life got in the way (if you have any small children, you'll understand). Things have settled down a bit now and I've asked to rejoin. Hopefully I'll be able to crank out some reviews this time and learn something in the process.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pass the Sun Certified Programmer for the Java 2 Platform, Standard Edition 5.0 Exam&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I want to do this mainly to give myself an excuse to go back over the fundamentals of Java, as well as learn the new features that 5.0 brought to the table in detail (generics, annotations, etc.). I have still basically been living in a Java 1.4 world as I'd say roughly 85% of my daily work is on an application that is still bound to that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;JDK&lt;/span&gt;. So, passing this is mainly just a reason to study, and it is a nice edition to the resume as well.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Write one Java/software development blog article per week&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This would be &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;numero&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;uno&lt;/span&gt;! I've always stressed about the frequency of my blog writing - I've felt compelled to write every single day, and I usually end up writing a one paragraph synopsis of some other guy's blog entry. Not exactly something that will attract many readers. I'll still post those on a more frequent basis as they keep the content flowing, but I also want to write at least one in-depth article per week to give people something to look forward to. One way I'll do this is to blog about the books I'm reading. &lt;span style="font-style: italic;"&gt;The Pragmatic Programmer&lt;/span&gt; provides challenges and/or exercises at the end of each chapter - great seeds for entries.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Attend &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;JavaOne&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; 2008 or similar conference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This one depends on the boss - hopefully I'll get to travel again this year. I'd love to go back to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;JavaOne&lt;/span&gt; - I learned a lot, and big geek shows always motivate me to go back and introduce new technology to the group, as well as get more involved in the community. I always feel a surge in my professional development in the 2-3 month period following my attending a conference.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Start a Memphis/Mid-South Area Java User Group&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We don't have a JUG in this area and I really think that we could benefit from one. My company has a large number of Java developers, and I know that several others in the area, including FedEx and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;Autozone&lt;/span&gt; do as well. This would be a great way to get some of the good speakers from the conferences I've attended to speak locally, and it may even serve to get us on the map with some of the smaller shows like &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;NFJS&lt;/span&gt;. Sun and others really seem to take an interest in supporting JUGS, so I look forward to see what happens. I've started a &lt;a href="http://groups.google.com/group/memphis-mid-south-jug"&gt;Google Group&lt;/a&gt; for the newborn JUG, and I'll be blogging more in the future about it.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7884160153641895756?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/7884160153641895756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=7884160153641895756' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7884160153641895756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7884160153641895756'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/07/my-professional-development-goals-for.html' title='My Professional Development Goals for 2007-2008'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7349952015694431073</id><published>2007-07-09T09:48:00.000-05:00</published><updated>2007-07-09T09:48:04.318-05:00</updated><title type='text'>On Agile: Why You Won't Fix It Later</title><content type='html'>Ryan Cooper writes a brilliant essay on why quick fixes today turn into tomorrow's code rot. I believe every word of this article. Unfortunately, I'm all too often my own worst enemy when it comes to implementing these ideas. Thanks for the reminder, Ryan!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://on-agile.blogspot.com/2007/04/why-you-wont-fix-it-later.html"&gt;On Agile: Why You Won't Fix It Later&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7349952015694431073?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://on-agile.blogspot.com/2007/04/why-you-wont-fix-it-later.html' title='On Agile: Why You Won&apos;t Fix It Later'/><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/7349952015694431073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=7349952015694431073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7349952015694431073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7349952015694431073'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/07/on-agile-why-you-wont-fix-it-later.html' title='On Agile: Why You Won&apos;t Fix It Later'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5251966494786255023</id><published>2007-07-06T09:28:00.000-05:00</published><updated>2007-07-06T09:28:42.143-05:00</updated><title type='text'>Graeme Rocher's Blog: 5 More Misconceptions About Grails</title><content type='html'>Graeme Rocher, founder of the Grails project, answers five more misconceptions about Groovy/Grails vs. Ruby/Rails. I've grown to be quite fond of both of these languages/frameworks; however, given the amount of investment I've placed into learning and applying Spring and Hibernate to the applications I've developed over the past two years, I have to say that Grails just makes sense for me as the next step toward becoming more "dynamic" in my approach to development projects.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://graemerocher.blogspot.com/2007/07/5-more-misconceptions-about-grails.html"&gt;Graeme Rocher's Blog: 5 More Misconceptions About Grails&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5251966494786255023?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5251966494786255023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5251966494786255023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5251966494786255023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5251966494786255023'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/07/graeme-rochers-blog-5-more.html' title='Graeme Rocher&apos;s Blog: 5 More Misconceptions About Grails'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5622122075707120725</id><published>2007-07-02T15:12:00.000-05:00</published><updated>2007-07-02T15:16:09.854-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Help me become a better programmer!</title><content type='html'>I have decided to embark upon a quest to become a better programmer. I would really like to improve my understanding of the computer science that underlies my day-to-day tasks, particularly as it relates to programming language design as well as algorithm design and complexity analysis. I would also like to improve my analytical and problem solving skills. I've found that I'm really good at learning new technologies and quickly bringing them to bear on web application development problems, but take me out of that problem space and I get nervous rather quickly.&lt;br /&gt;&lt;br /&gt;Who has ideas about the best way to go about this? Please comment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5622122075707120725?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5622122075707120725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5622122075707120725' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5622122075707120725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5622122075707120725'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/07/help-me-become-better-programmer.html' title='Help me become a better programmer!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-4937412411989632893</id><published>2007-06-27T12:54:00.000-05:00</published><updated>2007-12-15T12:45:19.172-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>How to implement form-level validation in JSF</title><content type='html'>Recently I was faced with the challenge of implementing form-level (or page-level) validation in a JSF-based application. What I mean by form-level validation is the need to evaluate a subset of a form's fields as a unit, rather than simply validating each field in isolation. An example of this type of validation can be found on a user registration form where one has to select a password in one text field, and then retype the same password in another text field for confirmation. Validating that these two text fields contain the same password is an example of form level validation.&lt;br /&gt;&lt;br /&gt;In my case, I had two date selector components on my form, one for a start date/time and one for an end date/time for an event that was being scheduled. The rule I needed to validate was that the end date/time was later than the start date/time.&lt;br /&gt;&lt;br /&gt;There are a few ways to implement validation like this, including but not limited to:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Build a custom component that renders selectors for both the start and end date/time, then validate as a unit. This actually is field-level validation and doesn't truly address the form-level problem.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Implement a validator method on a managed bean that will evaluate the data submitted for multiple components.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I'll address the second method in this HOWTO.&lt;br /&gt;&lt;br /&gt;First, you'll need to bind at least &lt;i&gt;n-1&lt;/i&gt; of the components that you want to validate to properties on your managed bean. The simplest way is to declare properties of type &lt;b&gt;UIInput&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private UIInput startDateComponent;&lt;br /&gt;&lt;br /&gt;public UIInput getStartDateComponent() {&lt;br /&gt;    return startDateComponent;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setStartDateComponent(UIInput startDateComponent) {  &lt;br /&gt;    this.startDateComponent = startDateComponent;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;and do the actual binding in the JSP:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;t:inputDate id="eventStart" value="#{orderForm.sampleInfo.requestedStartTime}"&lt;br /&gt;    type="both"&lt;br /&gt;    popupCalendar="true"&lt;br /&gt;    ampm="true" binding="#{dateValidationForm.startDateComponent}"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Next, you'll implement the validation method, which can have any name you like, but must share the same signature as this example:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;public void validateEndDate(FacesContext context, UIComponent toValidate, Object value) {&lt;br /&gt;    Date endDate = (Date) value;&lt;br /&gt;    Date startDate = (Date) getStartDateComponent().getLocalValue();&lt;br /&gt;&lt;br /&gt;    if (startDate == null) {&lt;br /&gt;        context.addMessage(getStartDateComponent().getClientId(context),new FacesMessage("Please specify a valid date and time."));&lt;br /&gt;        throw new ValidatorException(new FacesMessage());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    long endTime = endDate.getTime();&lt;br /&gt;    long startTime = startDate.getTime();&lt;br /&gt;&lt;br /&gt;    if (startTime &gt;= endTime) {&lt;br /&gt;        addError("errors.batchOrder.invalidEndDate");&lt;br /&gt;        throw new ValidatorException(new FacesMessage("Event end must be later than event start."));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;And finally, you'll bind the validation method to the last component in your subset of components that need to be validated together:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;t:inputDate id="eventEnd" value="#{orderForm.sampleInfo.requestedEndTime}" type="both" popupCalendar="true" ampm="true" validator="#{dateValidationForm.validateEndDate}"/&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;To understand why I say &lt;i&gt;n-1&lt;/i&gt; components, think of the way the validation phase occurs in JSF. Data is bound to the components in the order that they occur in the JSF component tree, which just so happens to be the order in which they appear in the JSP source. Looking at the &lt;b&gt;validateEndDate&lt;/b&gt; method, you'll see that I only reference the &lt;b&gt;startDateComponent&lt;/b&gt; from the binding, but I reference the &lt;b&gt;endDate&lt;/b&gt; as the &lt;b&gt;Object value&lt;/b&gt; reference that was passed into the method. This is why you only need to bind &lt;i&gt;n-1&lt;/i&gt; components, because you get the &lt;i&gt;nth&lt;/i&gt; component from the method signature.&lt;br /&gt;&lt;br /&gt;If you want to be more uniform and bind all of the components, you could create an extra dummy hidden value component and bind the validator method to it. You could then bind all of the components to your managed bean and access them all from the bindings rather than accessing one from the method signature.&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;validateEndDate&lt;/b&gt; method itself is rather simple. First you access the data by getting the local value of each component (again, the &lt;b&gt;endDate&lt;/b&gt; value is not accessed in this way - in fact, it hasn't been bound yet because it must be validated first, and that's what's happening in this method!). You then apply the business rule. You'll see that first I look to see if the &lt;b&gt;startDate&lt;/b&gt; is null. I'm not sure why this is possible, but if the &lt;b&gt;startDate&lt;/b&gt; was not submitting a good value on the FIRST submit, the local value was null. So, I catch that here. I add an error message to the &lt;b&gt;startDateComponent&lt;/b&gt; and throw a &lt;b&gt;ValidatorException&lt;/b&gt;. If the business rule is violated, throw a &lt;b&gt;ValidatorException&lt;/b&gt;. (I'm also using the &lt;b&gt;addError&lt;/b&gt; method provided by AppFuse to work w/ its message framework as well, but that is not necessary w/ all JSF apps).&lt;br /&gt;&lt;br /&gt;Now, for the final problem I encountered. In Weblogic server, which we're still using for the time being, if your session cannot be serialized then it deletes your entire session. Obviously this can cause major problems in any web app. To deal with this, ANY SESSION SCOPED MANAGED BEAN must be fully serializable, meaning it and any objects referenced in its state. Herein lies the problem for JSF. Instances of &lt;b&gt;UIComponent&lt;/b&gt; (an ancestor of &lt;b&gt;UIInput&lt;/b&gt;) are not serializable, so if we bind our components to &lt;b&gt;UIInput&lt;/b&gt; fields on a session-scoped managed bean (the bean backing this form is an Order Form/Shopping Cart style bean), it will not be serializable and Weblogic will kick out your session.&lt;br /&gt;&lt;br /&gt;To deal with this problem, realize that there is no reason that you can only have one managed bean backing a form. In fact, you can reference as many managed beans as you need. Since validation is done for each request, there is no need to manage any state there across multiple requests like we need to do with a shopping cart. So, why not declare an additional managed bean that is REQUEST SCOPED, and then put the bindings and validation method there. That is exactly what I did. Here is the entire bean:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;public class DateValidationForm extends BasePage {&lt;br /&gt;&lt;br /&gt;    private UIInput startDateComponent;&lt;br /&gt;&lt;br /&gt;    public UIInput getStartDateComponent() {&lt;br /&gt;        return startDateComponent;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    public void setStartDateComponent(UIInput startDateComponent) {&lt;br /&gt;        this.startDateComponent = startDateComponent;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void validateEndDate(FacesContext context, UIComponent toValidate, Object value) {&lt;br /&gt;        Date endDate = (Date) value;&lt;br /&gt;        Date startDate = (Date) getStartDateComponent().getLocalValue();&lt;br /&gt;&lt;br /&gt;        if (startDate == null) {&lt;br /&gt;            context.addMessage(getStartDateComponent().getClientId(context),new FacesMessage("Please specify a valid date and time."));&lt;br /&gt;            throw new ValidatorException(new FacesMessage());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        long endTime = endDate.getTime();&lt;br /&gt;        long startTime = startDate.getTime();&lt;br /&gt;&lt;br /&gt;        if (startTime &gt;= endTime) {&lt;br /&gt;            addError("errors.batchOrder.invalidEndDate");&lt;br /&gt;            throw new ValidatorException(new FacesMessage("Event end must be later than event start."));&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;and the declaration in faces-config.xml:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;managed-bean&amp;gt;&lt;br /&gt;    &amp;lt;managed-bean-name&amp;gt;dateValidationForm&amp;lt;/managed-bean-name&amp;gt;&lt;br /&gt;    &amp;lt;managed-bean-class&amp;gt;org.stjude.hc.srmcti.webapp.action.ordering.DateValidationForm&amp;lt;/managed-bean-class&amp;gt;&lt;br /&gt;    &amp;lt;managed-bean-scope&amp;gt;request&amp;lt;/managed-bean-scope&amp;gt;&lt;br /&gt;&amp;lt;/managed-bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;The added bonus is that you can reuse this bean across all forms where you need this behavior. My application happens to have 2 additional forms where I would have repeated this logic, so I just reference this bean there.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-4937412411989632893?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/4937412411989632893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=4937412411989632893' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/4937412411989632893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/4937412411989632893'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/06/how-to-implement-form-level-validation.html' title='How to implement form-level validation in JSF'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6974719590926213534</id><published>2007-06-22T21:27:00.001-05:00</published><updated>2008-12-11T01:53:50.997-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffee'/><title type='text'>The Grove Coffee House Rocks!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Vo63LRwAZbk/RnyFS6P46_I/AAAAAAAAAPo/9HmazK6qAZk/s1600-h/image001.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_Vo63LRwAZbk/RnyFS6P46_I/AAAAAAAAAPo/9HmazK6qAZk/s320/image001.png" alt="" id="BLOGGER_PHOTO_ID_5079081039687117810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's Friday night, and what am I doing but coding. My wife's night out is spent at the scrapbook store working on her latest layouts - mine is at my new favorite coffee shop, working on open source. I discovered this place on a date with Wendy a couple of months ago. The nice thing about it is the distinctly Christian atmosphere. A good friend of mine and I meet here on Friday mornings for accountability. Well, since they hand out free wireless internet, I thought I'd drop by for my night out as well. Good coding atmosphere - I have a nice corner with a plugin for my laptop, so I'm good to go. Check this place out if you're in DeSoto County, MS or the Memphis metro area anytime soon - &lt;a href="http://grovecoffeehouse.com"&gt;http://grovecoffeehouse.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6974719590926213534?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/6974719590926213534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=6974719590926213534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6974719590926213534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6974719590926213534'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/06/grove-coffee-house-rocks.html' title='The Grove Coffee House Rocks!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Vo63LRwAZbk/RnyFS6P46_I/AAAAAAAAAPo/9HmazK6qAZk/s72-c/image001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2462616675265879184</id><published>2007-06-19T16:50:00.001-05:00</published><updated>2007-06-19T16:53:33.698-05:00</updated><title type='text'>Migrated</title><content type='html'>I recently migrated all of my Java/Development related posts from &lt;a href="http://www.analienandastranger.com"&gt;http://www.analienandastranger.com&lt;/a&gt;. I want to make this a PRIMARILY Java/Development-related blog. When I was splitting my efforts between Christianity and Software Development, I was quickly getting burned out and not writing anything. If you want to read any of my old devotional posts, I will be keeping the other blog alive for awhile. Since the hosting is being provided to me free (as well as the domain), I will in good conscience need to shut it down eventually. I just feel that using Blogger gives me greater visibility - I do want people to actually read this stuff, ya know? :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2462616675265879184?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2462616675265879184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2462616675265879184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2462616675265879184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2462616675265879184'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/06/migrated.html' title='Migrated'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-1137043833412972018</id><published>2007-05-11T22:57:00.000-05:00</published><updated>2009-03-12T22:22:27.247-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>And then it was over...</title><content type='html'>&lt;a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5063512122879158706"&gt;&lt;img src="http://lh4.google.com/image/matt.stine/RkU1crgYqbI/AAAAAAAAAOI/fn4ypOF5zkQ/s288/DSCN1138.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I really enjoyed "The Toy Show" this morning. James Gosling went through a flurry of different demos from around the "cool" Java world. I was especially impressed with Project Wonderland (http://lg3d-wonderland.dev.java.net/), a virtual workplace environment, and with the real-time robotics demos. Unfortunately I was so sucked in that I didn't get any good photos.&lt;br /&gt;&lt;br /&gt;If anything you could call this my day on the back end. I attended four sessions, two of which were focused on that.&lt;br /&gt;&lt;br /&gt;- Comparing the Developer Experience of Java EE 5.0, Ruby on Rails, and Grails: Lessons Learned from Developing One Application&lt;br /&gt;- Implementing Java EE Applications Using Enterprise JavaBeans (EJB) 3 Technology: Real-World Tips, Tricks, and New Design Patterns&lt;br /&gt;- The Top 10 Ways to Botch Enterprise Java Technology-Based Application Scalability and Reliability&lt;br /&gt;- Exploting JRuby: Building Domain-Specific Languages for the Java Virtual Machine&lt;br /&gt;&lt;br /&gt;I scheduled the first session because I thought it was be a good way to tie together all that I had learned about Grails and Rails and then compare it to my existing Java EE knowledge. As it turns out, the speaker believed that given tool support, the development experience wasn't all that different between the three. He then gave some performance comparisons, but I wasn't all that sure the analysis was very sound. Java EE came out way on top. I hadn't heard that it outperformed the others by quite as much as he showed. He made a rather dubious statement when he said that Grails and Rails weren't protected by standards. Groovy is a JSR and Grails just sits on top of it. If that isn't standard protection, then what is?&lt;br /&gt;&lt;br /&gt;The EJB tips, tricks, and patterns session was quite nice. I learned a few nuances of the platform. The patterns part was the best. They first went through some of the design patterns from the EJB 2.x days and identified which ones were obsolete and which ones were still useful. They then provided several new design patterns. Unfortunately the slides for this talk were not yet available and I just don't feel like combing through my handwritten notes. Definitely check this one out online when it is posted.&lt;br /&gt;&lt;br /&gt;Cameron Purdy's "Top 10" talk was both humorous and thought-provoking. I'll never do justice to it. Check it out when the video comes available.&lt;br /&gt;&lt;br /&gt;The final session of the conference for me addressed a burning question I had in my mind since Monday - what in the world is a DSL? I heard it thrown around in the Grails and Ruby talks at Java University, but nobody ever defined the acronym. Domain Specific Language - that what it is! I mainly attended this talk because I thought there might be applications for DSL's in our work at St. Jude. A DSL is a custom language designed for a specific purpose. Ruby's Rake language for instrumenting application builds is an example. Rob Harrop gave an impressive demo of how he built two DSL's, one providing a simpler API for JMX, and another for corporate action entitlement calculations. While I can't think of a direct application for DSL's yet, I'm not tossing out the possibility.&lt;br /&gt;&lt;br /&gt;JavaOne was a great conference for me. If I didn't hate to leave my family for this long, I'd love to attend every year. It's definitely drinking from a fire hydrant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-1137043833412972018?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/1137043833412972018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=1137043833412972018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1137043833412972018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1137043833412972018'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/and-then-it-was-over.html' title='And then it was over...'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8342151488317930860</id><published>2007-05-11T22:17:00.000-05:00</published><updated>2009-03-12T22:22:27.299-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='restaurants'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Thursday was slow...</title><content type='html'>for me, not for JavaOne. Of course I was a good little programmer and used the schedule builder to sign up for all of my sessions. I edited them a bit after the first two keynotes. Even then, I had one lone session scheduled for Thursday morning (that wasn't really directly applicable to my work, it just looked interesting), and then two sessions in the afternoon, the first starting at 4:10. I decided to skip out on the morning session and do a little shopping at Pier 39. The highlight was a "Bucket of Boat Trash" and clam chowder at the Bubba Gump Shrimp Company. And yes, we Ole Miss Rebels are represented as far out as the end of Pier 39:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5063511710562298018"&gt;&lt;img src="http://lh4.google.com/image/matt.stine/RkU1ErgYqKI/AAAAAAAAAMA/6BJ0mkhqgn8/s288/DSCN1117.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The two sessions that I attended were:&lt;br /&gt;&lt;br /&gt;- RubyTooling: State of the Art&lt;br /&gt;- Using Ajax with POJC (Plain Old JavaServer Faces Components)&lt;br /&gt;&lt;br /&gt;I attended the first session simply to get a little more detail on all of the hype surrounding Ruby tooling support in NetBeans 6. What I got was even more than I bargained for. The project leaders actually walked us through not only the features that were available, but how they were implemented. I had never really thought about the problems with providing code completion and refactoring with a dynamically-typed language. It was really cool to see the thought process that went into their solutions. I'd love to hear a similar discussion from the JetBrains guys, as the Ruby support in IntelliJ IDEA is quite good as well.&lt;br /&gt;&lt;br /&gt;For me the second session was the best of the conference for me up until that point, and arguably it still is after attending Friday's sessions. Craig McClanahan, of Struts fame, was the main speaker and was joined by his colleagues Matthew Bohm and Jayashri Visvanathan. What made this session so good for me was that they presented a problem - "How can I add Ajax behaviors to my JavaServer™ Faces technology based application, without throwing away my investment in existing component libraries?" - and then provided three different solutions to that problem - low, medium, and high level.&lt;br /&gt;&lt;br /&gt;The low level consisted of simply using the HTML event pass-through attributes that are implemented by most standard JSF components (onClick, onBlur, etc.). One could use an existing JavaScript framework such as Dojo to send an XMLHttpRequest and then map that request to a Servlet or JSF handler using a technology such as Shale Remoting. The response could be sent back as JSON data which could then be transformed into the desired UI update.&lt;br /&gt;&lt;br /&gt;The medium level consisted of actually extending existing JSF components and adding the desired Ajax behavior. Due to time constraints they didn't cover this solution in detail, but they did provide a link to a detailed discussion in the Java BluePrints catalog: https://blueprints.dev.java.net/bpcatalog/ee5/ajax/extendingRenderFunctionality.html&lt;br /&gt;&lt;br /&gt;The high level solutions addressed the following needs (copied directly from the slides):&lt;br /&gt;&lt;br /&gt;● Partial page submit—gather up a particular set of&lt;br /&gt;input element values, and send them to a bit of server&lt;br /&gt;side business logic&lt;br /&gt;● Partial page refresh—the business logic needs to&lt;br /&gt;refresh the content of one or more subtrees of the&lt;br /&gt;client side DOM&lt;br /&gt;● Synchronization—the benefits of synchronizing the&lt;br /&gt;server side state&lt;br /&gt;● Don’t repeat yourself (DRY)—reuse existing&lt;br /&gt;components and renderers for partial page updates&lt;br /&gt;&lt;br /&gt;To address these issues, the speakers highlighted two add-on frameworks:&lt;br /&gt;&lt;br /&gt;● Ajax4JSF (http://labs.jboss.com/portal/jbossajax4jsf)&lt;br /&gt;● Dynamic Faces (https://jsf-extensions.dev.java.net/)&lt;br /&gt;&lt;br /&gt;I was quite impressed with both of these frameworks. One of my colleagues is currently implementing Ajax behavior in a Facelets-based application using Ajax4JSF and he is quite happy with it. Dynamic Faces looked really awesome, especially its tooling support in NetBeans (actually I'm quite impressed with the overall JSF support in NetBeans - I'll definitely be adding it to my tool belt). The highlight of the presentation was Matt's video of him building an entire currency trading application in 28 minutes - except it was "fast-played" to finish in 3 1/2 minutes and set to techno music. Matt wowed us with his dancing abilities while we watched true RAD. The crowd went wild!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8342151488317930860?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8342151488317930860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8342151488317930860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8342151488317930860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8342151488317930860'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/thursday-was-slow.html' title='Thursday was slow...'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8023246102085118629</id><published>2007-05-10T18:49:00.000-05:00</published><updated>2009-03-12T22:22:27.318-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><category scheme='http://www.blogger.com/atom/ns#' term='jMaki'/><title type='text'>Wednesday was AJAX Day</title><content type='html'>Not officially, but nearly every session I attended had something to do with AJAX:&lt;br /&gt;&lt;br /&gt;- Creating Amazing Web Interfaces with Ajax&lt;br /&gt;- jMaki: Web 2.0 App Building Made Easy&lt;br /&gt;- Fast, Beautiful, Easy: Pick Three - Building Web User Interfaces in the Java Programming Language with Google Web Toolkit&lt;br /&gt;- Killer JavaScript Technology Frameworks for Java Platform Developers: An Exploration of Prototype, Script.aculo.us, and Rico&lt;br /&gt;&lt;br /&gt;I have to say that I was rather impressed by what I saw.&lt;br /&gt;&lt;br /&gt;The first talk was by Ben and Dion, the Ajaxian guys. It was an appropriate way to start, as they gave a quick history overview of Ajax. One nice point they made was that Ajax really isn't about the acronym - it never was - it's about building killer websites. Who cares what the actual technology behind it is. They discussed a couple of what they seemed to consider the better frameworks available - Dojo and ExtJS. They then explored some amazing up and coming features, including offline support and 2D client side graphics manipulation.&lt;br /&gt;&lt;br /&gt;I was rather impressed with jMaki - in short it is a wrapper around many of the popular JavaScript frameworks available (Dojo, Yahoo UI, Script.aculo.us, Spry, Google), and makes them accessible to Java, PHP, and Ruby. It has excellent tool support in NetBeans and Eclipse. It provides protection from changes in the API's of all of these projects - you can mix and match frameworks and only be concerned about one API - jMaki's. It does the work of linking all of the widgets together and communicating amongst them and with the server side.&lt;br /&gt;&lt;br /&gt;The GWT talk was easily my favorite of the day. I'm extremely impressed with what these guys have done. I hadn't had much opportunity to look at GWT until now, and I really wish I had. I was initially skeptical about writing an entire application in Java and letting it generate HTML and JavaScript. I guess these guys knew that, because they're development philosophy addresses my concerns quite nicely:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;To radically improve the web experience for&lt;br /&gt;users by enabling developers to use existing&lt;br /&gt;Java tools to build no-compromise AJAX for&lt;br /&gt;any modern browser&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From what I can see, they deliver on their mission. They've optimized their code for speed and for browser specificity (e.g. from what I understand, if your client is using Firefox, you get Firefox optimized JavaScript, same for IE, etc.). You can use all of your favorite IDE features to build the code, including the debugger. I really want to try to make use of this toolkit in the near future.&lt;br /&gt;&lt;br /&gt;The final talk was less informative for me, but only because I had experience with most of the technologies already. The killer part of this was how the speaker extended existing JSF components and added Script.aculo.us effects. It really made his version of Yahoo maps shine.&lt;br /&gt;&lt;br /&gt;Ajax isn't going anywhere but up. I just left yet another Ajax/JSF session, which for me was the best session of the conference so far. In a later entry I'll tell you why.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8023246102085118629?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8023246102085118629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8023246102085118629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8023246102085118629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8023246102085118629'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/wednesday-was-ajax-day.html' title='Wednesday was AJAX Day'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-9002215988191716845</id><published>2007-05-08T17:57:00.000-05:00</published><updated>2009-03-12T22:22:27.338-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamiclanguages'/><title type='text'>It seems to be the year of the dynamic/scripting language</title><content type='html'>&lt;a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5062324250889201762"&gt;&lt;img src="http://lh6.google.com/image/matt.stine/RkD9FbgYqGI/AAAAAAAAALY/NEPT0IawaRY/s288/DSCN1113.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It has been a whirlwind of a day. I've been to two keynotes (close to 5 hours of information there) and one technical session. Couple that information with what I heard at Java University yesterday, and you find many common themes. One that keeps coming up is the emerging trend of making other languages, particularly dynamic/scripting languages, first-class citizens on the JVM. &lt;br /&gt;&lt;br /&gt;According to Wikipedia, "Dynamic programming language is a term used broadly in computer science to describe a class of high level programming languages that execute at runtime many common behaviors that other languages might perform during compilation, if at all. These behaviors could include extension of the program, by adding new code, or by extending objects and definitions, or by modifying the type system, all during program execution. These behaviors can be emulated in nearly any language of sufficient complexity, but dynamic languages provide direct tools to make use of them." This definition seems to fit quite nicely with what I've heard the last two days. A couple of dynamic languages I've heard A LOT about are Groovy and Ruby.&lt;br /&gt;&lt;br /&gt;Yes, Ruby and its most popular framework, Ruby on Rails, have survived the initial hype. They are here to stay. Not only that, they seem poised to make a serious impact on the way we will do web application development over the next several years. Sun made a HUGE splash when they decided to hire the core developers of JRuby, the project which in its current pre-1.0 release already runs 98% of Ruby on Rails as a first-class citizen on the JVM. Not only that, you can now create a WAR file from a Ruby on Rails application and deploy it to any Java application server! I'll write more on this in another entry as I attended a full technical session on it.&lt;br /&gt;&lt;br /&gt;If you're too uncomfortable getting away from Java, why not try Groovy? After all, it is a JSR (241). All of Java syntax is legal in Groovy, plus a lot more. Groovy is a dynamic scripting language like Ruby and also compiles to bytecode, making it a first-class citizen on the JVM. It has its own MVC framework, Grails (formerly Groovy on Rails), which is a direct competitor to Ruby on Rails. I've already written on Groovy and Grails in an earlier entry.&lt;br /&gt;&lt;br /&gt;I plan to attend some additional sessions focused on these dynamic languages, as it seems they will be really important in the years to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-9002215988191716845?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/9002215988191716845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=9002215988191716845' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/9002215988191716845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/9002215988191716845'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/it-seems-to-be-year-of-dynamicscripting.html' title='It seems to be the year of the dynamic/scripting language'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-584912153070542567</id><published>2007-05-07T16:47:00.000-05:00</published><updated>2009-03-12T22:22:27.357-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javauniversity'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Java University: Rapid Web Site Development with Groovy and Grails</title><content type='html'>I'm currently sitting in this session - Graeme Rocher is the presenter. He is the creator of Grails, which is Groovy's answer to the Ruby on Rails like development experience. He's currently doing Q&amp;A, so I thought I'd take the opportunity to write a short entry. So far this session is awesome! Graeme is a great presenter and has had the perfect balance of slides and live coding. Unfortunately they ran out of slides before I got to the presentation (more on the sometimes laughable logistics at JavaOne later), so I'm having trouble remember details to write about (they've promised to email me the slides). The first part of the session was an introduction to Groovy, Java's "scripting" language. I had NO IDEA just how cool and powerful Groovy was. I am especially impressed with its MetaClass concept, whereby you can override almost every behavior of the Java language that you can imagine - method calling, operator overloading, etc. Imagine being able to do AOP type things without using AOP. Not only that, it has all of my favorite pet features like "everything is an object," closures, dynamic lists, etc. It's an OOP nuts dream. I'll write more later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-584912153070542567?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/584912153070542567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=584912153070542567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/584912153070542567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/584912153070542567'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/java-university-rapid-web-site.html' title='Java University: Rapid Web Site Development with Groovy and Grails'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5697820691538176063</id><published>2007-05-07T15:09:00.000-05:00</published><updated>2009-03-12T22:22:27.374-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javauniversity'/><title type='text'>Java University: Developing Enterprise Applications with the Spring Framework</title><content type='html'>This was the first session that I attended at Java University. You could take either a full-day course or two half-day courses - I elected to do the latter. Keith Donald, project lead for Spring WebFlow, presented. I have quite a bit of Spring experience already through AppFuse, but I was hoping to get a more complete view of Spring as most of what I have learned is from tinkering with existing systems. Keith promised that we'd build a system from the ground up, so it sounded like I'd get what I bargained for.&lt;br /&gt;&lt;br /&gt;And build from the ground up we did. I'd say we were almost halfway through the entire session before we even TOUCHED Spring. Up until that point all we had done was do test driven development on all of the business entities and logic. It was very interesting to me that Keith's coding methodology is quite different from what I typically find myself doing. He implemented almost all of the business logic of the application without any regard to the eventual supporting technologies (i.e. ORM frameworks, web frameworks, etc.). It seems like I almost always bind my application to a set of technologies (say Hibernate/Spring/JSF) before I ever write a line of business logic. What did he get from this? Well, his application had fully implemented and tested business logic that would work with nearly any of the available supporting frameworks. Good stuff.&lt;br /&gt;&lt;br /&gt;Another thing that was interesting to me is his disdain for packaging classes according to application layer. I can't think of an application that I've built recently where the DAO's weren't in a dao package, the "Manager's" weren't in a manger/service package, and the web classes weren't in a web package. Keith totally changed all of this. Our two main entities in this application were account and restaurant. Anything that had to do with an account (be it a DAO, service bean, web form, etc.) went in the account package. The same went for the restaurant package. I'm not sure if I like this or not, but he seemed convinced of the value.&lt;br /&gt;&lt;br /&gt;Overall it was a good session. He incorporated A LOT of live coding, and almost all of it was done from scracth - he had very little pre-made skeleton code. The drawback to that was that he only made it through 6 of the 8 sections of his slides. I wish he had backed down on one or the other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5697820691538176063?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5697820691538176063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5697820691538176063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5697820691538176063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5697820691538176063'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/java-university-developing-enterprise.html' title='Java University: Developing Enterprise Applications with the Spring Framework'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-839783569003794286</id><published>2007-05-05T18:31:00.000-05:00</published><updated>2009-03-12T22:22:27.392-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restaurants'/><title type='text'>Siam Thai Restaurant Doesn't Disappoint</title><content type='html'>I ended up at the restaurant across the street from the one pictured in my last entry. I found out from reading the reviews that it was the original, and then opened an additional location across the street. Strange, huh? At any rate, the Chicken Satay was definitely a 5-star dish for me. Even better than Bhan Thai back home in Memphis. I followed that up w/ the Thai Fried Rice w/ Beef. Also awesome. I will probably eat here again during the week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-839783569003794286?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/839783569003794286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=839783569003794286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/839783569003794286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/839783569003794286'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/siam-thai-restaurant-doesn-disappoint.html' title='Siam Thai Restaurant Doesn&amp;#39;t Disappoint'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2599729296935702488</id><published>2007-05-05T16:18:00.000-05:00</published><updated>2009-03-12T22:22:27.408-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Greetings from San Francisco!</title><content type='html'>&lt;a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5061188923529143090"&gt;&lt;img src="http://lh3.google.com/image/matt.stine/Rjz0grgYozI/AAAAAAAAAAs/tgIAHcd27AE/s288/DSCN0998.JPG"  /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the view from my quaint little hotel room at the Hotel Nikko in downtown San Francisco, California. I arrived here after a long morning of travel. First ~4 hours of flight from Memphis, TN to San Francisco International, followed by traversing the airport maze to find the BART (Bay Area Rapid Transit) train station. Once I found the right station, it was another 15 minutes of waiting on a train followed by a 40 minute train ride. Almost home? Not quite. As I ride the escalator out of the subway, I realize just what a country boy I am. There are literally hundreds of people crawling around on the streets, and here I am, toting a large rolling suitcase, a laptop, and a backpack, and looking totally clueless! Where is my hotel? I was definitely a prime target for predators just looking to make a quick buck. Within seconds I heard, "Where you looking to go? I've got a map." I quickly responds with "I've got it, thanks." Of course, I didn't have it. But I didn't have 20 bucks for the guy either! Not a few more steps up the sidewalk I'm confronted by Indian monks wanting to share their religion with me. I did have a nice conversation with this guy and got him to take one of my pocket Gospels of John (thank you Pocket Testament League!). Finally a nice family pointed me in the right direction. I figured out that if you look like you're on a mission and you know what you're doing, people don't come up to you, so I put on my best serious face and headed for the Hotel Nikko. Now here I am, and from my window I've got a nice view of the pool area which is surrounded by an interesting looking rock garden:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5061188992248619858"&gt;&lt;img src="http://lh3.google.com/image/matt.stine/Rjz0krgYo1I/AAAAAAAAAA8/G7sMo_WekFc/s288/DSCN1000.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also can see what looks like a potentially good Thai restaurant on the corner:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5061188940709012290"&gt;&lt;img src="http://lh3.google.com/image/matt.stine/Rjz0hrgYo0I/AAAAAAAAAA0/poC9lBKXNDw/s288/DSCN0999.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The reviews on Google Maps look promising!&lt;br /&gt;&lt;br /&gt;On a final note for this entry, I desperately miss my family. Our goodbye at Memphis International was tear-filled, especially by Wendy. I haven't been this far away from them in a LOOOOONG time. In fact, Abby was only about 10 months old the last time I went on a business trip without them. Isabella and Ali Kate weren't even conceived yet! I managed to get a web camera for the trip, so I'm going to send them a video message every day. Check your email sweetheart! I love you all SO MUCH!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2599729296935702488?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2599729296935702488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2599729296935702488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2599729296935702488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2599729296935702488'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/05/greetings-from-san-francisco.html' title='Greetings from San Francisco!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5404817057247628734</id><published>2007-04-30T14:38:00.000-05:00</published><updated>2009-03-12T22:22:27.427-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Welcome!</title><content type='html'>I plan to start posting here on Saturday, May 5, 2007. Look for photos, videos, and session synopses, as well as miscellaneous banter about JavaOne 2007 in San Francisco, CA!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5404817057247628734?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5404817057247628734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5404817057247628734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5404817057247628734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5404817057247628734'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2007/04/welcome.html' title='Welcome!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7594909257094294684</id><published>2006-08-17T09:46:00.000-05:00</published><updated>2007-06-19T09:47:29.620-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Matt, RTFM! Commons Collections HAS CLOSURES.</title><content type='html'>&lt;p&gt;Thanks to everyone who pointed me to &lt;a href="http://jakarta.apache.org/commons/collections/"&gt;Commons Collections&lt;/a&gt; and its &lt;a href="http://jakarta.apache.org/commons/collections/api-release/org/apache/commons/collections/functors/package-summary.html"&gt;Functor package&lt;/a&gt; yesterday. To me, this is just one step below having closures natively present in the language. FYI, I was able to remove all duplication from my class and reduce the LOC from 211 to 136 - in other words, 75 lines of useless code GONE.&lt;/p&gt; &lt;p&gt;Here is what I did. First, I defined Predicates for each of my conditions. The simplest ones called a boolean method on the User object:&lt;/p&gt; &lt;pre&gt;private final Predicate isX = new Predicate() {&lt;br /&gt;  public boolean evaluate(Object object) {&lt;br /&gt;     return ((User) object).isX();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Only slightly more complicated ones checked to see if a given Collection was empty on the User object:&lt;/p&gt; &lt;pre&gt;private final Predicate isX = new Predicate() {&lt;br /&gt;  public boolean evaluate(Object object) {&lt;br /&gt;     return CollectionUtils.isNotEmpty(((User) object).getItems());&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Next, I defined a method that would check the delegations for the User to see if any of them were an X:&lt;/p&gt; &lt;pre&gt;boolean checkDelegations(User user, Predicate checkPredicate) {&lt;br /&gt;  return CollectionUtils.exists(user.getDelegations(), checkPredicate);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Finally, I implemented the security methods:&lt;/p&gt; &lt;pre&gt;public boolean canDoThis() {&lt;br /&gt;  return isX.evaluate(loggedInUser) || checkDelegations(loggedInUser, isX);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Maybe it isn’t the most elegant or simplest of solutions, but it sure is a lot better than what I posted yesterday!&lt;/p&gt; &lt;p&gt;P.S. Since this is a Christian blog, I must remind you that RTFM stands for Read The &lt;strong&gt;FINE&lt;/strong&gt; Manual! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7594909257094294684?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7594909257094294684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7594909257094294684'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/08/matt-rtfm-commons-collections-has.html' title='Matt, RTFM! Commons Collections HAS CLOSURES.'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5190288048168735483</id><published>2006-08-16T09:45:00.000-05:00</published><updated>2007-06-19T09:46:05.149-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java needs closures</title><content type='html'>&lt;p&gt;I’m sure everyone is sick of reading this same rant over and over, but I just had to add more fuel to the fire. I’m attempting to implement access privilege delegation in a JSF application - basically, users can delegate their ability to do “stuff” in our application to other users. I have a backing bean that has several methods that are called by the JSF components, returning whether or not to render that component based on security privileges. Well, I now have to make all of those methods aware of delegation! I have something like this in several methods:&lt;/p&gt; &lt;pre&gt;boolean notX = (loggedInUser.isX());&lt;br /&gt;if (notX) {&lt;br /&gt;  boolean result = false;&lt;br /&gt;  Set delegations = loggedInUser.getDelegations();&lt;br /&gt;  for (Iterator i = delegations.iterator(); i.hasNext();) {&lt;br /&gt;     User delegator = (User) i.next();&lt;br /&gt;     if (delegator.isX()) {&lt;br /&gt;        result = true;&lt;br /&gt;        break;&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;  return result;&lt;br /&gt;} else {&lt;br /&gt;  return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Now, it would be nice if I could extract the contents of that if block into a new method, say “checkDelegations()”. Unfortunately, the isX() that I need to call is different for every method following this pattern. I’d like to be able to pass a function that calls isX() on the delegator into the checkDelegations() method. No dice in Java. Does anyone else have a solution to this problem? &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5190288048168735483?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5190288048168735483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5190288048168735483'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/08/java-needs-closures.html' title='Java needs closures'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-1737572032009104667</id><published>2006-08-15T09:44:00.000-05:00</published><updated>2007-06-19T09:44:54.032-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><title type='text'>Raible’s Wiki: AppFuseRoadmap</title><content type='html'>&lt;p&gt;Raible updated the &lt;a href="http://raibledesigns.com/wiki/AppFuseRoadmap.html"&gt;AppFuseRoadmap&lt;/a&gt; yesterday. I’m really excited about where the project is going. XDoclet has been a good friend, but I’m really happy to see its demise in favor of annotations. JDK 5 and JSP 2.0 will also be really helpful - I’ve wanted to leverage these technologies for a long time, but haven’t had an easy way to do so. I think the most interesting thing for me will be the switch over to Maven 2. I have absolutely ZERO experience with Maven, other that seeing the pretty websites that it generates for many of my favorite open source projects. I consider myself to be something of an Ant wizard, so I hope that I’ll be able to leverage that experience in Maven. &lt;/p&gt; &lt;p&gt;It looks like TestNG replacing JUnit is a nice-to-have for 2.0 - I hope this becomes a configuration option. I don’t know anything about TestNG. Perhaps it’s time to learn. &lt;img src="http://www.analienandastranger.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /&gt; &lt;/p&gt; &lt;p&gt;AppFuse 2.2 is where things are really going to start getting cool. Convention over configuration (ala RoR) will really speed development, and features by plugin will make my life really easier. I spend a lot of time stripping things out that I don’t need for particular projects - the time I save by using AppFuse is worth the pain of stripping them out - so this will be yet another way that AppFuse will make Java EE development a pleasure. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-1737572032009104667?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1737572032009104667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1737572032009104667'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/08/raibles-wiki-appfuseroadmap.html' title='Raible’s Wiki: AppFuseRoadmap'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7712858695605868751</id><published>2006-08-15T09:43:00.000-05:00</published><updated>2007-06-19T09:43:50.164-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>It seems that AppFuse has a competitor!</title><content type='html'>&lt;p&gt;I found &lt;a href="http://blogs.opensymphony.com/plightbo/2006/08/project_able_a_complete_java_w.html"&gt;Project Able&lt;/a&gt; while reading &lt;a href="http://www.analienandastranger.com/?p=25"&gt;Raible’s blog&lt;/a&gt; this morning. While it doesn’t claim to duplicate everything that AppFuse does (i.e. they pick a framework and stick with it instead of providing choice), they are doing some neat things. I may take a look at it if I ever have time. &lt;img src="http://www.analienandastranger.com/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /&gt; &lt;/p&gt; &lt;blockquote&gt;&lt;p&gt; Project Able is a full Java-based web development stack designed to make web development painless. In a sense, it is an attempt to bring together quality opensource tools in one cohesive stack, similar to what Rails has done for Ruby, while also encouraging common practices I’ve used in software engineering for a long time.&lt;/p&gt; &lt;p&gt;It is very similar to projects such as Trails, Grails, and AppFuse. However, there are a few key differences:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;The stack components are different (WebWork, Spring, iBatis, etc).&lt;/li&gt;&lt;li&gt;In addition to the basic framework, Able also encourages common development techniques and patterns (more below).&lt;/li&gt;&lt;/ul&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7712858695605868751?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7712858695605868751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7712858695605868751'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/08/it-seems-that-appfuse-has-competitor.html' title='It seems that AppFuse has a competitor!'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-3207288310348880838</id><published>2006-08-09T09:40:00.000-05:00</published><updated>2007-06-19T09:40:52.657-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><title type='text'>Seven simple reasons to use AppFuse</title><content type='html'>&lt;p&gt;I’ve wanted for some time now to write a blog entry promoting my favorite open source project - AppFuse. Since I started developing web applications using AppFuse as a base, I can truly say that I’ve rediscovered the joy of software development. I’ve found no other technology or methodology that has allowed me to place as much focus as I now do on solving business problems and not on technology ramp-up or figuring out the eccentricities of “framework X.” In this article, &lt;a href="http://raibledesigns.com/"&gt;Matt Raible&lt;/a&gt;, the founder of the &lt;a href="http://www.appfuse.org/"&gt;AppFuse&lt;/a&gt; project, humbly states very compelling reasons that you should use AppFuse for your J2EE development. To summarize, here are the 7 reaons:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Testing&lt;/li&gt;&lt;li&gt;Integration&lt;/li&gt;&lt;li&gt;Automation&lt;/li&gt;&lt;li&gt;Security Features and Extensibility&lt;/li&gt;&lt;li&gt;Code Generation with AppGen&lt;/li&gt;&lt;li&gt;Documentation&lt;/li&gt;&lt;li&gt;Community&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Read the article to get the meat:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-appfuse/"&gt;Seven simple reasons to use AppFuse&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-3207288310348880838?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3207288310348880838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3207288310348880838'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/08/seven-simple-reasons-to-use-appfuse.html' title='Seven simple reasons to use AppFuse'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6636877331181294888</id><published>2006-07-25T09:38:00.000-05:00</published><updated>2007-06-19T09:39:28.340-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>JFreeChart-AppFuse Integration</title><content type='html'>&lt;p&gt;I recently finished integrating &lt;a href="http://http//www.jfree.org/jfreechart/"&gt;JFreeChart&lt;/a&gt; with AppFuse for a project I'm working on. JFreeChart is a really powerful Java chart library. If your application has any requirements for charts/graphs, I highly recommend it. The user manual and demo code come with a price tag ($39.95 for a single developer), but they are well worth the purchase - especially the demo code. If you don't have the $$$, the &lt;a href="http://www.jfree.org/phpBB2/viewforum.php?f=3"&gt;support forum&lt;/a&gt; is also very helpful.&lt;/p&gt; &lt;p&gt;I plan to put together a tutorial to help anyone interested in using JFreeChart in their AppFuse application. Look for it here and on the appfuse-user mailing list. It will be based on JSF since that's what I'm using right now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6636877331181294888?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6636877331181294888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6636877331181294888'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/07/jfreechart-appfuse-integration.html' title='JFreeChart-AppFuse Integration'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-3976487459946210022</id><published>2006-07-25T09:37:00.000-05:00</published><updated>2007-06-19T09:38:03.628-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>I Made Raible's Blog</title><content type='html'>&lt;p&gt;Apparently Matt Raible thought my JSF modifications to the AppFuse-Compass tutorial were good enough to merit a mention on his blog: &lt;a href="http://raibledesigns.com/page/rd?entry=appfuse_videos_updated_for_1"&gt;AppFuse Videos updated for 1.9.3&lt;/a&gt;.  Check out the bottom of the entry.&lt;/p&gt; &lt;p&gt;Compass really is a nice tool - I was able to provide search capabilities for an app I'm working on right now with about 2 days worth of work (having never worked w/ Compass before), and man is it fast! I can't get a search to exceed 1.5 seconds!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-3976487459946210022?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3976487459946210022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3976487459946210022'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/07/i-made-raibles-blog.html' title='I Made Raible&apos;s Blog'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2049020513481727270</id><published>2006-07-24T09:34:00.000-05:00</published><updated>2007-06-19T09:36:35.962-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developer'/><title type='text'>Stiff asks, Matt answers</title><content type='html'>&lt;p&gt;I found an interesting article this morning by way of &lt;a href="http://digg.com/programming"&gt;Digg.com Programming&lt;/a&gt;: &lt;a href="http://sztywny.titaniumhosting.com/2006/07/23/stiff-asks-great-programmers-answers/"&gt;Stiff asks, great programmers answer&lt;/a&gt;. The author posed 5 questions to some of the more well-known programmers of today, and their answers made for very interesting reading. Not to say that I'm a great programmer or anything, but I thought it might be a fun thought exercise to answer these questions myself. Here we go:&lt;/p&gt; &lt;p&gt;&lt;b&gt;How did you learn programming? Were any schools of any use? Or maybe you didn't even bother with attending any schools &lt;img src="http://www.analienandastranger.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /&gt;  ?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;How did I learn programming? There have been several different stages of my development as a programmer. I started out copying BASIC programs from magazines into my Atari 800 and then modifying them to see what would happen. This progressed through the Commodore 64 and Apple II. In the 8th grade I earned the distinction of “Best Programmer,” not that that means very much - I figured out how to make the U.S. flag program run with only a handful of lines of code using loop and control structures vs. typing out the entire graphics display line by line.&lt;/p&gt; &lt;p&gt;In High School I jumped to the exciting world of Quick Basic. I can't remember the exact name of the course I took, but it was not very far above the level of what I did in Middle School/Junior High, nor was it very far below the level of my intro-level course in College. As I recall, we spent a lot of time hacking the machines to see what we could do with them. Of course you couldn't do anything cool like change your class schedule ala Hackers.&lt;/p&gt; &lt;p&gt;At some point I decided I would major in Computer Science at the University of Mississippi. I really enjoyed my time at Ole Miss, and I learned a lot - unfortunately, I also picked up a lot of bad programming habits. You ask were schools of any use? Definitely - one of my favorite professors secured me an internship at St. Jude, which led to my current and only full-time software development job. It wasn't until I started developing real code for real clients that I got truly serious about programming as a profession. It was then that I learned that hacking out quick and dirty scripts that worked most of the time and would get past a graduate assistant's grading wasn't what programming was all about. I think the turning point of my career was when I attended XP/Agile Universe in 2002. It was here that I really started to grasp agility, test-driven development, refactoring, and simple design - principles and practices that I consider essential to developing software of any magnitude.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What do you think is the most important skill every programmer should possess?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;I'll answer this question very much like David Heinemeier Hansson answered the 10-100 times question below. I think the ability to quickly view a problem in the abstract and then mentally apply Occam's razor to it until you have what is needed for implementation is essential to programming. When I'm not managing a project team/schedule - i.e. I'm actually doing software development - I would consider this to be the core of what I do every day.&lt;/p&gt; &lt;p&gt;&lt;b&gt;Do you think mathematics and/or physics are important skills for a programmer? Why?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;I can't remember ever using any of the physics I've learned. Take that back, the concept of the electromagnetic field was useful when I was trying to understand Mass Spectrometry, which is at the heart of several of my clients' work. Mathematics, on the other hand, is key. The concepts I learned in my discrete mathematics course seem to lie under the surface of many of the problems that I face. Even if I don't directly apply the mathematics on a day-to-day basis, the “way of thinking” that you develop when studying mathematics really sharpens you as a programmer in my opinion.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What do you think will be the next big thing in computer programming? X-oriented programming, Y language, quantum computers, etc?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Like many of those interviewed, I'm not into fortune telling and/or hype. The next big thing always quickly becomes yesterday's news as we cut through the hype to the core value of what product/technique/practice X offers. We then integrate that core value into our regular day-to-day toolset and then go back to business as usual. &lt;/p&gt; &lt;p&gt;&lt;b&gt;If you had three months to learn one relatively new technology, which one would you choose?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;THREE MONTHS?!?!? WOW! Although it isn't that new, it's still fairly new to me. I would spend the next three months learning everything I can about &lt;a href="http://www.springframework.org/"&gt;the Spring framework&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What do you think makes some programmers 10 or 100 times more productive than others?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;This flies in the face of a lot of the agile methodologies out there, but I think solving as many problems as you can without interrupting any of your other team members will turn you into an uber-productive programmer. I taught myself 90% of what I know through self-study and independent troubleshooting. If every time you have an issue with your work you quickly run to someone on your team that “knows that software/technology/issue better,” you'll never advance past infancy as a programmer. Just like babies have to be spoon-fed, so do infant programmers. You have to learn how to feed yourself. The next time you have a problem in code that you're not familiar with, trace the execution, line-by-line. Understand for yourself how the program works. If you run across a technology or API that you're not familiar with, study the available resources related to it. “Google it” for crying out loud. The more you do this, the better you'll get at it. Soon you'll find yourself asking questions of your team members only about 5% of the time, and you'll become the most productive member of your team. Don't believe me? Give it a try.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What are your favorite tools (operating system, programming/scripting language, text editor, version control system, shell, database engine, other tools you can't live without) and why do you like them more than others?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;My current tool set includes IntelliJ IDEA (as well as a smattering of Eclipse when I need it), &lt;a href="http://www.appfuse.org/"&gt;AppFuse&lt;/a&gt; - probably the best thing that has ever happened to J2EE development, Cygwin, Tomcat, and MySQL. If I'm doing anything else in a text editor besides coding, vim is my friend. Wiki-wise we're very invested in Confluence - it rocks as a wiki. Of course I really can't live without Firefox - besides my IDE I probably spend more time there than anywhere else.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What is your favorite book related to computer programming?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;I think I have to call a tie here between &lt;a href="http://www.amazon.com/gp/product/0135974445/sr=8-2/qid=1153761714/ref=pd_bbs_2/102-7769528-6502532?ie=UTF8"&gt;Agile Software Development, Principles, Patterns, and Practices&lt;/a&gt; by Robert C. Martin and &lt;a href="http://www.amazon.com/gp/product/0131016490/sr=1-1/qid=1153761786/ref=pd_bbs_1/102-7769528-6502532?ie=UTF8&amp;s=books"&gt;Test Driven Development: A Practical Guide&lt;/a&gt; by David Astels.  Both of these books were instrumental in my development as a more agile developer.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What is your favorite book NOT related to computer programming?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;This is an easy one - the Bible.  My main translation is the &lt;a href="http://www.esv.org/"&gt;English Standard Version&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;If I had to choose a book that wasn't the Bible, it would be &lt;a href="http://www.livingwaters.com/Merchant2/merchant.mv?Screen=PROD&amp;amp;Product_Code=102"&gt;The Way of the Master&lt;/a&gt; by Ray Comfort.  This book literally changed my life.&lt;/p&gt; &lt;p&gt;&lt;b&gt;What are your favorite music bands/performers/composers?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;Right now my favorite artists include The David Crowder Band, Casting Crowns, and Todd Agnew.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2049020513481727270?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2049020513481727270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2049020513481727270'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2006/07/stiff-asks-matt-answers.html' title='Stiff asks, Matt answers'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5336806811625070840</id><published>2005-11-16T11:13:00.001-06:00</published><updated>2009-03-12T22:19:54.310-05:00</updated><title type='text'>Abby in Costume</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/mattstine/63930699/" title="photo sharing"&gt;&lt;img src="http://static.flickr.com/24/63930699_e249fb2cc1_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/mattstine/63930699/"&gt;Abby in Costume&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/mattstine/"&gt;javasage1978&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;I realized I haven't posted any pictures of the girls - here is Abby before the fall fun festival at Bellevue.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5336806811625070840?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5336806811625070840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5336806811625070840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5336806811625070840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5336806811625070840'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/11/abby-in-costume.html' title='Abby in Costume'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2514048100347627946</id><published>2005-11-16T11:13:00.000-06:00</published><updated>2009-03-12T22:19:54.276-05:00</updated><title type='text'>Isabella in Costume</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/mattstine/63930698/" title="photo sharing"&gt;&lt;img src="http://static.flickr.com/31/63930698_98abc2ade9_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/mattstine/63930698/"&gt;Isabella in Costume&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/mattstine/"&gt;javasage1978&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;Here's Isabella right before we went in to the fun festival...isn't she cute?&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2514048100347627946?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2514048100347627946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2514048100347627946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2514048100347627946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2514048100347627946'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/11/isabella-in-costume.html' title='Isabella in Costume'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2777706103465861810</id><published>2005-11-16T11:10:00.000-06:00</published><updated>2009-03-12T22:19:54.327-05:00</updated><title type='text'>Flickr</title><content type='html'>This is a test post from &lt;a href="http://www.flickr.com/r/testpost"&gt;&lt;img alt="flickr" src="http://www.flickr.com/images/flickr_logo_blog.gif" width="41" height="18" border="0" align="absmiddle" /&gt;&lt;/a&gt;, a fancy photo sharing thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2777706103465861810?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2777706103465861810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2777706103465861810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2777706103465861810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2777706103465861810'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/11/flickr.html' title='Flickr'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5652052547929839831</id><published>2005-11-15T13:05:00.000-06:00</published><updated>2009-03-12T22:19:54.345-05:00</updated><title type='text'>My Spiritual Father Goes Home</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2695/522/1600/Adrian_Rogers2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/2695/522/320/Adrian_Rogers2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This morning, Dr. Adrian Rogers walked into glory. Dr. Rogers was my first pastor. I never had the opportunity to share this with him, but he is ultimately the man who led me to a saving knowledge of Jesus Christ. I experienced false conversion as a child, was never baptized, and never experienced the true change of heart that comes from the new birth. Shortly after our marriage, my wife and I joined Bellevue Baptist Church, where I was then baptized. I realized that I knew very little about the foundations of my faith, so when I learned that Dr. Rogers taught a course on Wednesday nights called "Back to the Basics: What Every Christian Ought to Know," I quickly signed up. It was the second or third week of the class when Dr. Rogers spoke on the subject, "How to Be Saved and Know It." During this class Dr. Rogers revealed that as a young man he had struggled with doubting his salvation.&lt;br /&gt;&lt;br /&gt;Quoting from &lt;a href="http://www.bellevue.org/templates/cusbellevue1103/details.asp?id=1360&amp;PID=33044&amp;amp;mast="&gt;this message&lt;/a&gt;, Adrian Rogers said, "One night I looked up into the heavens and said, 'God, I've got to have assurance. I don't know if I'm lost and the Holy Spirit has me under conviction, or I'm saved and the devil is trying to get me to doubt my salvation. But one thing I know: You said if I would believe on You, You would save me. So, Lord, right now, I trust You to save me.'"&lt;br /&gt;&lt;br /&gt;I went home that evening and prayed that very prayer, and the rest is spiritual history. Though I didn't become instantly perfect (and I'm still quite far away from perfection), I finally experienced that change of heart and life that comes from salvation. I've since been baptized again (to get it in the right order), as after the self-examination commanded by &lt;a href="http://www.biblegateway.com/passage/?search=2%20Corinthians%2013:5;&amp;version=31;"&gt;2 Corinthians 13:5&lt;/a&gt; I realized that that night was when I was truly saved.   So, to Heaven I send a heartfelt thank you to Dr. Adrian Rogers, and I look forward to seeing him again one day.&lt;br /&gt;&lt;br /&gt;Besides him leading me to Christ, if that wasn't enough, I've learned a great deal from Dr. Rogers about what it means to be a man of God and a great husband and father. He's taught me from the pulpit, from books, and from personal example. He truly was, and still is, a good and faithful servant of the Lord Jesus Christ.&lt;br /&gt;&lt;br /&gt;For more information about the passing of Dr. Rogers, visit &lt;a href="http://www.adrianrogers.org/"&gt;http://www.adrianrogers.org&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5652052547929839831?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5652052547929839831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5652052547929839831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5652052547929839831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5652052547929839831'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/11/my-spiritual-father-goes-home.html' title='My Spiritual Father Goes Home'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-3731710977038586363</id><published>2005-11-02T09:06:00.000-06:00</published><updated>2009-03-12T22:19:54.362-05:00</updated><title type='text'>Ruby on Rails Dev Framework on Track for Growth</title><content type='html'>It appears that Ruby on Rails is changing the WORLD of software development - I wasn't aware of just how much influence it was having in the world of other languages. Here Marc Fleury (JBoss CEO) says that it had a huge influence on Seam - JBoss's venture into the Java web framework space. And then the list of RoR clones: Biscuit (PHP), Grails (Java), Monorail (.NET), Turbo Gears (Python), Cake PHP, Subway (Python), Catalyst (Perl).....All I can say is that the RoR guys must have done something right!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eweek.com/article2/0,1895,1880199,00.asp"&gt;Ruby on Rails Dev Framework on Track for Growth&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-3731710977038586363?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/3731710977038586363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=3731710977038586363' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3731710977038586363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/3731710977038586363'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/11/ruby-on-rails-dev-framework-on-track.html' title='Ruby on Rails Dev Framework on Track for Growth'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-93006572014434277</id><published>2005-10-31T10:14:00.000-06:00</published><updated>2009-03-12T22:19:54.379-05:00</updated><title type='text'>NBC2 News Online - The mystery of the eye</title><content type='html'>This is pretty wild....the number 2 appears in the eye of Hurricane Wilma.  They insist that the image and video were not altered....in fact you can barely see it at this NOAA link as well: &lt;a href="http://www.srh.noaa.gov/data/radar/archive/Tue/kamx/241002.gif "&gt;http://www.srh.noaa.gov/data/radar/archive/Tue/kamx/241002.gif&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nbc-2.com/articles/readarticle.asp?articleid=4715&amp;amp;z=3&amp;amp;p="&gt;NBC2 News Online - The mystery of the eye&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-93006572014434277?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/93006572014434277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=93006572014434277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/93006572014434277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/93006572014434277'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/nbc2-news-online-mystery-of-eye.html' title='NBC2 News Online - The mystery of the eye'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6244082204292571878</id><published>2005-10-17T09:31:00.000-05:00</published><updated>2009-03-12T22:19:54.396-05:00</updated><title type='text'>IT Observer - A Glimpse at the Future of Programming Languages: O'Reilly Releases "Beyond Java"</title><content type='html'>The Ruby on Rails hype continues - Bruce Tate considers the possibility that it may be "the next big thing," as well as letting us know that "It's time to start paying attention again. It's time to look at the horizon, beyond Java."  I've been thinking about this issue a lot lately - I mean, even 10 years ago none of us could have predicted that we'd be using Java as much and in the way we are now.  It was a C/C++ world.  Now we don't know what we'd do without Java - or do we.  Scripting languages seem to have the momentum right now - even in the Javaspace (see Groovy).  Ruby on Rails, as much as I've seen of it, is EXTREMELY impressive.  If we can repeatedly solve the BIG problems in a scalable, maintainable way with these languages, plus we get the added benefits of dynamic typing, etc., why wouldn't we transition?  I'm excited to check this book out, and also excited to be in the web development space right now.  Who knows - 10 years from now we might be looking at "Beyond Rails."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ebcvg.com/press.php?id=1761"&gt;IT Observer - A Glimpse at the Future of Programming Languages: O'Reilly Releases "Beyond Java"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6244082204292571878?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/6244082204292571878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=6244082204292571878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6244082204292571878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6244082204292571878'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/it-observer-glimpse-at-future-of.html' title='IT Observer - A Glimpse at the Future of Programming Languages: O&amp;#39;Reilly Releases &amp;quot;Beyond Java&amp;quot;'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-1137528783501895019</id><published>2005-10-14T16:55:00.000-05:00</published><updated>2009-03-12T22:19:54.420-05:00</updated><title type='text'>Spurgeon - Morning and Evening</title><content type='html'>Spurgeon's evening devotional for today packs a punch.  I can't get over the last few sentences:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;O professor, too little separated from sinners, you know not what you lose by your conformity to the world. It cuts the tendons of your strength, and makes you creep where you ought to run. Then, for your own comfort's sake, and for the sake of your growth in grace, if you be a Christian, be a Christian, and be a marked and distinct one. &lt;/span&gt;&lt;em style="font-style: italic;"&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ccel.org/ccel/spurgeon/morneve.d1014pm.html"&gt;Read Spurgeon's Evening for Oct 14.&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-1137528783501895019?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/1137528783501895019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=1137528783501895019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1137528783501895019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/1137528783501895019'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/spurgeon-morning-and-evening.html' title='Spurgeon - Morning and Evening'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2903540192515623577</id><published>2005-10-14T16:34:00.000-05:00</published><updated>2009-03-12T22:19:54.438-05:00</updated><title type='text'>FOXNews.com - The O'Reilly Factor - Talking Points - The ACLU Exposed</title><content type='html'>Bill O'Reilly slams the ACLU for being what it is - not a defender of Constitutional rights, but a militant organization fighting for its own radical, secular, progressive agenda. BO states:&lt;br /&gt;&lt;br /&gt;"The ACLU simply wants a different country, a nation where conduct it approves of, public sexual displays, child molestation literature is allowed. But the ACLU wants to inhibit conduct it disagrees with, like protesting the border and celebrating the birth of Jesus. That's what's going on."&lt;br /&gt;&lt;br /&gt;Read more at &lt;a href="http://www.foxnews.com/story/0,2933,171995,00.html"&gt;FOXNews.com - The O'Reilly Factor - Talking Points - The ACLU Exposed.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2903540192515623577?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2903540192515623577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2903540192515623577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2903540192515623577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2903540192515623577'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/foxnewscom-o-factor-talking-points-aclu.html' title='FOXNews.com - The O&amp;#39;Reilly Factor - Talking Points - The ACLU Exposed'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-7678878056728163307</id><published>2005-10-14T09:43:00.000-05:00</published><updated>2009-03-12T22:19:54.457-05:00</updated><title type='text'>ONLamp.com: What Is Ruby on Rails</title><content type='html'>&lt;p&gt;&lt;a href="http://www.onlamp.com/pub/a/onlamp/2005/10/13/what_is_rails.html"&gt;What Is Ruby on Rails&lt;/a&gt; by Curt Hibbs -- Ruby on Rails is an impressive web development framework that will soon reach version 1.0. While there's a lot of buzz, it can sometimes be difficult to discern the steak beneath the sizzle. Curt Hibbs walks through the features and pieces of Ruby on Rails to show how it fits together and where its big benefits come from.&lt;/p&gt;I read this article this morning and I have to say it makes me even more impressed with Rails. I think it has the potential to be a BIG player in the web application development space - if not to replace Java, PHP, etc., with Ruby as many developers' platform of choice, it will definitely challenge the existing framework developers for Java, etc., to scale even bigger heights when it comes to features and ease of development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-7678878056728163307?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/7678878056728163307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=7678878056728163307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7678878056728163307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/7678878056728163307'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/onlampcom-what-is-ruby-on-rails.html' title='ONLamp.com: What Is Ruby on Rails'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-6209948143205250358</id><published>2005-10-12T10:04:00.000-05:00</published><updated>2009-03-12T22:19:54.476-05:00</updated><title type='text'>Apache iBATIS</title><content type='html'>One technology that I picked up on in the last session of the Java In Action conference was &lt;a href="http://ibatis.apache.org/"&gt;Apache iBATIS&lt;/a&gt;. It is a really cool framework that maps SQL queries to Java objects. It provides the capability to do really AWESOME things with dynamic SQL, and eliminates the N+1 query problem. I've been playing with it on a project the last couple of days and I'm VERY satisfied with what I've seen so far. It has the potential to really help us out in some application hot spots and places w/ a great deal of dynamic SQL. You should definitely take a peek.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-6209948143205250358?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/6209948143205250358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=6209948143205250358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6209948143205250358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/6209948143205250358'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/apache-ibatis.html' title='Apache iBATIS'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-5990282037176800117</id><published>2005-10-12T09:51:00.000-05:00</published><updated>2009-03-12T22:19:54.493-05:00</updated><title type='text'>Supernatural Regeneration</title><content type='html'>I am about halfway through reading &lt;a href="http://rzim.org/publications/jttran.php?seqid=106"&gt;an interview with Ravi Zacharias in the Fall 2005 issue of Just Thinking from Ravi Zacharias International Ministries&lt;/a&gt;. The interview was conducted by Major John Carter of the Salvation Army, and concerned Leadership and Calling. I was extremely taken by a quote by RZ in the interview which I'll reproduce below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I really think that today, as Christian apologists, that the biggest challenge to the faith is not an intellectual question. In fact, I have not heard an intellectual question to the faith that has disturbed me. I am more convinced than ever of the message of the Gospel. But the biggest challenge to the Christian faith is this: If the message that we have lays claim to a supernatural regeneration, then why is it that we do not see that regeneration more often? No other religion claims a supernatural regeneration. They may claim ethics and morality. Hinduism does. But we are the only ones who claim a new birth. Born of the Holy Spirit, our hungers have changed, our disciplines have changed, our behavior has changed. If it is a supernaturally engendered thing, why do we not see it more often? And if that is true of the common person in conversion, how much more true it must be of ones in leadership. So I believe character is essential, and without that, you cannot serve.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To me this really gets to the heart of the matter - how can I or anyone else claim that Jesus Christ has made a difference in my life, that I have been supernaturally changed, if I continue to go on living as I did before I was "converted?" And what's more, how can I position myself as a teacher of God's Word if I don't do the things that Christ has taught us to do - I'm expecting my students to do them, why don't I? It's a matter of being a doer of the Word and not a hearer only. As Christians we all need to check ourselves - are we truly in the faith? And if so, are we daily placing ourselves on the altar of living sacrifice, daily making the decision to leave our desires behind and follow the will of Christ? I'm so thankful for RZ's statement, as it really touched me at a point at which I needed to be touched.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-5990282037176800117?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/5990282037176800117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=5990282037176800117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5990282037176800117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/5990282037176800117'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/supernatural-regeneration.html' title='Supernatural Regeneration'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-8758451468182811214</id><published>2005-10-10T15:38:00.000-05:00</published><updated>2009-03-12T22:19:54.510-05:00</updated><title type='text'>Ruby on Rails</title><content type='html'>I've spent quite a bit of time playing with this &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt; thing.  It's amazing that I was able to build such a nice basic CRUD app w/ only 57 lines of code.  Now, I know this app didn't do much - just manage an Online Cookbook (&lt;a href="http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html"&gt;i.e. the OnLAMP.com Rolling on Rails tutorial&lt;/a&gt;).  I'm going to go through &lt;a href="http://rails.homelinux.org/"&gt;"Four Days on Rails"&lt;/a&gt; next since it purports to be a tutorial with a "Real App."  I'm excited about maybe using Ruby for rapid prototyping for our enterprise-class Java apps...maybe even for production apps.  Who knows...Ruby may replace Java? :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-8758451468182811214?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/8758451468182811214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=8758451468182811214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8758451468182811214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/8758451468182811214'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/ruby-on-rails.html' title='Ruby on Rails'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4108959592704884346.post-2553545552141210936</id><published>2005-10-10T11:37:00.000-05:00</published><updated>2009-03-12T22:19:54.533-05:00</updated><title type='text'>Post #1</title><content type='html'>This is my first post to this blog.  I've just returned to work after spending the last week at TheServerSide.com's Java in Action conference in Orlando, FL.  Got to take the family with me and spend a day at Magic Kingdom.  A good trip, and learned a lot of new technologies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4108959592704884346-2553545552141210936?l=matt-stine.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matt-stine.blogspot.com/feeds/2553545552141210936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4108959592704884346&amp;postID=2553545552141210936' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2553545552141210936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4108959592704884346/posts/default/2553545552141210936'/><link rel='alternate' type='text/html' href='http://matt-stine.blogspot.com/2005/10/post-1.html' title='Post #1'/><author><name>Matt Stine</name><uri>http://www.blogger.com/profile/16849050114945596629</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://bp1.blogger.com/_Vo63LRwAZbk/R5o3cNXVh1I/AAAAAAAAAco/OrQty59Zfdk/S220/DSCN0752.jpg'/></author><thr:total>0</thr:total></entry></feed>
