<?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-3444412265952661654</id><updated>2011-12-10T00:12:47.453-07:00</updated><category term='ruby'/><category term='nostalgia'/><category term='pictures'/><category term='media'/><category term='technology'/><category term='beer'/><category term='sad'/><category term='quartz'/><category term='mamp'/><category term='movies'/><category term='comedy'/><category term='books'/><category term='suck'/><category term='wedding'/><category term='shopping'/><category term='sportsvite'/><category term='christmas'/><category term='hosting'/><category term='tomcat'/><category term='colorado'/><category term='harwell'/><category term='ramblings'/><category term='inspiration'/><category term='service'/><category term='syracuse'/><category term='grails'/><category term='goodness'/><category term='tigers'/><category term='travel'/><category term='agile'/><category term='work job hiring'/><category term='spring'/><category term='geekery'/><category term='dc'/><category term='edufy'/><category term='thoughts'/><category term='family'/><category term='sports'/><category term='macbook'/><category term='performance'/><category term='eclipse'/><category term='work'/><category term='linux'/><category term='ruminations'/><category term='baseball'/><category term='blight'/><category term='hibernate'/><category term='business'/><category term='vitriol'/><category term='jmu'/><category term='mysql'/><category term='personal'/><category term='java'/><category term='php'/><category term='parties'/><category term='process'/><category term='politics'/><category term='programming'/><category term='customer service'/><category term='startup'/><category term='verizon'/><category term='music'/><category term='entrepreneurship'/><category term='metro'/><category term='communication'/><category term='dobbs'/><category term='social web'/><category term='computers'/><category term='unions'/><category term='life'/><category term='economics'/><category term='theft'/><category term='scrum'/><category term='plug'/><category term='jobs'/><category term='denver'/><category term='groovy'/><category term='food'/><category term='software'/><category term='odd'/><category term='mac'/><category term='michigan'/><category term='idiots'/><category term='free trade'/><category term='wikinomics'/><category term='fbconnect'/><category term='management'/><title type='text'>Kirk's World</title><subtitle type='html'>Ramblings about Software, Sports, Books, and Life as a Denver Newbie</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kirkgsworld.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default?start-index=101&amp;max-results=100'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>197</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7759048877121109599</id><published>2010-12-12T21:44:00.000-07:00</published><updated>2010-12-12T21:44:20.695-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='edufy'/><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><title type='text'>Introducing...Edufy</title><content type='html'>Like I mentioned in my last post, I have some big personal news to announce...without further ado -&lt;br /&gt;&lt;br /&gt;My entrepreneurial tendencies have finally resulted in something that lives on the internet!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/TQWjydpG7QI/AAAAAAAAARE/8GXtCKGpBkY/s1600/edufy.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="169" n4="true" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/TQWjydpG7QI/AAAAAAAAARE/8GXtCKGpBkY/s320/edufy.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It's called Edufy (&lt;a href="http://www.edufy.org/"&gt;http://www.edufy.org&lt;/a&gt;). We have built a site for teachers to share and discover learning activities for their students. Our founder, Philip Cooke, is a teacher in Arlington, VA, and his frustration with finding ways to create personalized learning activities for his students inspired him to start this project. After six months of planning, building, testing, and fixing, we launched the site at a couple of conferences in November, and now we want to start spreading the news. &lt;br /&gt;You can check out what Edufy is all about at:&lt;br /&gt;&lt;a href="http://www.edufy.org/about/index"&gt;http://www.edufy.org/about/index&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We'd love it if you could all check out the site and let us know what you think. If you are a teacher, give it a test drive! If you know any teachers, PLEASE send this to them - we are just getting started, and any feedback/criticism/encouragement we can get is highly valued. If you have any questions or comments, please let me know, or send feedback to &lt;a href="mailto:contact@edufy.org"&gt;contact@edufy.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For anyone who cares, I'll be posting about some of the technologies we're using, but for now, check out &lt;a href="http://www.edufy.org/"&gt;Edufy&lt;/a&gt;, and spread the word!&lt;br /&gt;&lt;br /&gt;To keep up with what's new on Edufy, be a fan &lt;a href="http://www.facebook.com/pages/Edufy/112785478755696"&gt;on Facebook&lt;/a&gt;, or follow &lt;a href="http://edufy.wordpress.com/"&gt;our blog&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Thanks from the Edufy Team!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7759048877121109599?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7759048877121109599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7759048877121109599'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/12/introducingedufy.html' title='Introducing...Edufy'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yrO-Y2qwU_A/TQWjydpG7QI/AAAAAAAAARE/8GXtCKGpBkY/s72-c/edufy.bmp' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7369149093132609262</id><published>2010-11-05T19:46:00.000-06:00</published><updated>2010-11-05T19:46:04.265-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><title type='text'>Big News...Coming Soon</title><content type='html'>For months now, I have been working with a group of awesome folks on something. &amp;nbsp;Lots of leaving my job, getting home, and going back to work. &amp;nbsp;I am pretty proud about what we've come up with. &amp;nbsp;In a few days, I'll be sharing it. &amp;nbsp;Fingers crossed. &amp;nbsp;Exciting times ahead...make or break as they say.&lt;br /&gt;&lt;br /&gt;Stay Tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7369149093132609262?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7369149093132609262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7369149093132609262'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/11/big-newscoming-soon.html' title='Big News...Coming Soon'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6255340771135685745</id><published>2010-11-03T17:44:00.000-06:00</published><updated>2010-11-03T17:44:07.847-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Generating .ldif Files using Groovy</title><content type='html'>I recently needed to do a bulk update of an openLDAP directory to add a password for a really big batch of test users. &amp;nbsp;I wrote a little Groovy script to do it. &amp;nbsp;Thought it might be helpful. &amp;nbsp;First things first, generate a password for the test users using the &lt;a href="http://www.zytrax.com/books/ldap/ch14/#slappasswd"&gt;slappasswd&lt;/a&gt; command. &amp;nbsp;Using the defaults will give a you password with SSHA encryption. &amp;nbsp;Now we need an .ldif file that describes the change to make. &amp;nbsp;For more information on ldapmodify commands, &lt;a href="http://docs.sun.com/source/816-6400-10/lmodify.html"&gt;head here&lt;/a&gt;. &amp;nbsp;The script here will loop through a group of sequentially id'd users in a couple of ous and assign them our nicely hashed password:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;        File newFile = new File('modify-script.ldif')&lt;br /&gt;        String username = ''&lt;br /&gt;        String toAdd = ""&lt;br /&gt;&lt;br /&gt;        def stuCount = 80000&lt;br /&gt;        def admCount = 2000&lt;br /&gt;        def teachCount = 18000&lt;br /&gt;&lt;br /&gt;        StringBuilder sb = new StringBuilder()&lt;br /&gt;&lt;br /&gt;        def ous = [ 'ou1', 'ou2' ]&lt;br /&gt;&lt;br /&gt;        for ( ouname in ous ) {&lt;br /&gt;&lt;br /&gt;            for ( i in 1..stuCount ) {&lt;br /&gt;                username = "user_${epname}_${i}"&lt;br /&gt;&lt;br /&gt;                toAdd = """&lt;br /&gt;dn: uid=${username},ou=people,ou=${ouname},dc=yourdc,dc=com&lt;br /&gt;changetype: modify&lt;br /&gt;add: userPassword&lt;br /&gt;userPassword: {SSHA}zW7Q/yQQ8IKZiX8ANJIGugi0deNebN1o&lt;br /&gt;                    &lt;br /&gt;"""&lt;br /&gt;                sb.append( toAdd )&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            sb.append( "\n\n" )&lt;br /&gt;&lt;br /&gt;            newFile &amp;lt;&amp;lt; sb.toString()&lt;br /&gt;        }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;This will produce a file (modify-script.ldif) with a bunch of entries like these:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;dn: uid=user_ou1_1,ou=people,ou=ou1,dc=yourdc,dc=com&lt;br /&gt;changetype: modify&lt;br /&gt;add: userPassword&lt;br /&gt;userPassword: {SSHA}zW7Q/yQQ8IKZiX8ANJIGugi0deNebN1o&lt;br /&gt;                    &lt;br /&gt;&lt;br /&gt;dn: uid=user_ou1_2,ou=people,ou=ou1,dc=yourdc,dc=com&lt;br /&gt;changetype: modify&lt;br /&gt;add: userPassword&lt;br /&gt;userPassword: {SSHA}zW7Q/yQQ8IKZiX8ANJIGugi0deNebN1o&lt;br /&gt;&lt;br /&gt;...&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Now you can simply run the ldapmodify command to update the users:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;ldapmodify -x -D "cn=admin,dc=yourdc,dc=com" -w yourpass -f modify-script.ldif&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I've been able to use derivatives of this script for a few different tasks. &amp;nbsp;Hope it helps someone else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6255340771135685745?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6255340771135685745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6255340771135685745'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/11/generating-ldif-files-using-groovy.html' title='Generating .ldif Files using Groovy'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1529112902160832203</id><published>2010-10-07T21:52:00.001-06:00</published><updated>2010-10-07T22:33:48.395-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails Image Processing with the ImageTools Plugin</title><content type='html'>I recently had a requirement on my side project to add some simple image processing. &amp;nbsp;I had previously used the &lt;a href="http://www.grails.org/ImageTools+plugin"&gt;ImageTools plugin&lt;/a&gt;, but that seems to have falled into a bit of disrepair. &amp;nbsp;I had a multistep process to get this going, and I figured I'd share it. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;According to the &lt;a href="http://github.com/ricardojmendez/grails-imagetools/"&gt;git repository&lt;/a&gt;, the last checkin on version 1.0.4 was way back in January 2010. &amp;nbsp;Grabbing the plugin using the standard grails install-plugin as documented on the plugin documentation page just doesn't cut it. &amp;nbsp;When attempting to use the documentation, you get a message that tells you&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 13px; line-height: 20px;"&gt;unable to resolve class ImageTool @ line xxx, column xxx. def imageTool = new ImageTool();&lt;/span&gt;&lt;/blockquote&gt;This is troubling, as that is the only class included in the plugin. &amp;nbsp;Fortunately &lt;a href="http://github.com/ricardojmendez/grails-imagetools/issues/closed#issue/2"&gt;I found this comment&lt;/a&gt; on a closed (???) issue on github: &lt;br /&gt;&lt;blockquote&gt;&lt;div style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 13px; line-height: 1.5em !important; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;So, to solve this I had to run a git clone on this source tree and then follow the instruction at the link below to create&amp;nbsp;&lt;em style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;my own&lt;/em&gt;&amp;nbsp;version of this plugin with correct package.&lt;/div&gt;&lt;div style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 13px; line-height: 1.5em !important; margin-bottom: 1em !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 1em !important; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://grails.org/doc/latest/guide/12.%20Plug-ins.html" style="color: #4183c4; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;http://grails.org/doc/latest/guide/12.%20Plug-ins.html&lt;/a&gt;&lt;/div&gt;&lt;/blockquote&gt;So it would seem that you need to grab the source, then create a plugin. &amp;nbsp;This is not as easy as you might think. &amp;nbsp;First of all, you might not have git installed. &amp;nbsp;Follow &lt;a href="http://git-scm.com/download"&gt;the instructions here&lt;/a&gt; to 'git git'. &amp;nbsp;Next, you need to grab the code. &amp;nbsp;From the command prompt in the directory you want the code, run the following command:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;git clone http://github.com/ricardojmendez/grails-imagetools.git&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Now you have the code. &amp;nbsp;Even though it's a plugin, you have to tell grails it's a plugin, by running the grails create-plugin command. &amp;nbsp;Now you have a zip file that you can install in your project, using the standard grails install-plugin command.&lt;br /&gt;&lt;br /&gt;From there you can follow the instructions. &amp;nbsp;The import statement is recognized, and we can get finally get down to actually writing the controller code:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;import org.grails.plugins.imagetools.*&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;//the controller method we submit to&lt;br /&gt;def myProfileSave = {&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;uploadPhoto( file, user )&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def uploadPhoto( upfile, user ) {&lt;br /&gt;&lt;br /&gt; if(upfile.empty) {&lt;br /&gt;  flash.message = 'File cannot be empty'&lt;br /&gt;  redirect( action: 'myProfile' )&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def imageTool = new ImageTool()&lt;br /&gt;&lt;br /&gt; imageTool.load( upfile.getBytes() )&lt;br /&gt;&lt;br /&gt; // Crops it to a square&lt;br /&gt; imageTool.square()&lt;br /&gt; &lt;br /&gt;        //make the new squared image the image to operate on &lt;br /&gt; imageTool.swapSource()&lt;br /&gt;  &lt;br /&gt; // Reduces the image size&lt;br /&gt; imageTool.thumbnail( 125 )&lt;br /&gt;&lt;br /&gt; def fileBase = grailsApplication.config.imageLocation&lt;br /&gt; def fullPath = "${fileBase}/user/photo"&lt;br /&gt;        File fullPFile = new File( fullPath )&lt;br /&gt;&lt;br /&gt; if ( !fullPFile.exists() ) {&lt;br /&gt;  fullPFile.mkdirs()&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; def filePath = "${fullPath}/user_${user.id}_125.jpg"&lt;br /&gt;&lt;br /&gt; File toMake = new File( filePath )&lt;br /&gt;&lt;br /&gt; if ( !toMake.exists() ) {&lt;br /&gt;  toMake.createNewFile()&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; // Saves the result&lt;br /&gt; imageTool.writeResult( filePath, "JPEG" )&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Once you get the plugin working, it's a breeze, as you can see! &amp;nbsp;It's a great, simple wrapper around the nasty and complicated JAI library.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Some Tips:&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) You'll probably want to increase your heap size if you are running with a default or small heap. &amp;nbsp;This requires a bit of memory.&lt;br /&gt;2) Remember to specify a multi-part form. &amp;nbsp;A good explanation of this can be found &lt;a href="http://www.grails.org/File+Upload"&gt;in the grails documentation.&lt;/a&gt;&lt;br /&gt;3) Profit!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1529112902160832203?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1529112902160832203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1529112902160832203'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/10/grails-image-processing-with-imagetools.html' title='Grails Image Processing with the ImageTools Plugin'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7202018707277825685</id><published>2010-07-31T20:54:00.000-06:00</published><updated>2010-07-31T20:54:13.214-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>July!</title><content type='html'>Let's talk about family. &amp;nbsp;My grandparents are 94 and 92, and still going. &amp;nbsp;They live by themselves. &amp;nbsp;They take care of themselves. &amp;nbsp;They sometimes complain about how badly they are doing, but I can name multiple couples one third of their age who aren't doing as well as they are! &amp;nbsp;My grandfather has good days and bad, and my grandmother has short-term memory issues, but really all in all, they are both really still rocking. &amp;nbsp;I talked to them today for half an hour, and afterwards, I was hit smack in the face with one of those 'wow am I blessed to have these people in my life' moments. &amp;nbsp;They have been married now for more than SEVENTY years. &amp;nbsp;They are amazing people who have been a part of so much, and who have so many amazing stories. &amp;nbsp;They are 'unconditional love machines', who just amaze me with their capacity to be proud of and kind to their family. &amp;nbsp;They are so positive, so caring, and so full of love. &amp;nbsp;It's really quite refreshing.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_yrO-Y2qwU_A/TFTeUhe4UYI/AAAAAAAAAP4/GTww8Av7fIQ/s1600/IMG_2243.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/TFTeUhe4UYI/AAAAAAAAAP4/GTww8Av7fIQ/s320/IMG_2243.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Thanks Grandma and Granddaddy for being an inspiration. &amp;nbsp;We all love you a ton!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7202018707277825685?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7202018707277825685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7202018707277825685'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/07/july.html' title='July!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_yrO-Y2qwU_A/TFTeUhe4UYI/AAAAAAAAAP4/GTww8Av7fIQ/s72-c/IMG_2243.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3786987904882004218</id><published>2010-07-02T08:13:00.001-06:00</published><updated>2010-07-02T10:35:36.884-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>UberConf, Days 2+3</title><content type='html'>After a great day one, we were looking forward to another great, long day, and we weren't disappointed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scala for Java Programmers&lt;/b&gt; - Day 2 started with a fun Scala workshop by Venkat Subramaniam that spanned two sessions. &amp;nbsp;This was extremely hands-on, and very worthwhile. &amp;nbsp;I learned enough about a language I have had interest in for a while to get started on my own, and got a nice little dose of Computer Science and compiler fun too. &amp;nbsp;My only complaint here was that we spent too much time using closures and Scala syntax craziness to write code in one, perl-ish, unreadable line. &amp;nbsp;We should have used the time writing 'terse' obfuscated code playing more with Scala parallel programming. &amp;nbsp;Actors are nifty, and it's amazing how clearly you can express complicated multi-threaded program flow. &amp;nbsp;If I had access to this goodness, I can think of one project I did at Blackboard that could have been written in half the time, in 1/5 the LOC, and in a much more readable and intuitive way. &amp;nbsp;Hindsight is 20/20, I suppose, but man that made me burn a bit.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Emergent Design&lt;/b&gt; - After lunch, we attended Neal Ford's talk on emergent design. &amp;nbsp;This was a good talk, mostly because Neal Ford is a good speaker, but I wouldn't say this was anything new. &amp;nbsp;No big design up front, test first, don't solve problems that don't yet exist, as this leads to heaps of code debt. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Stability Antipatterns&lt;/b&gt; - This was a workshop by Michael Nygard about common antipatterns you see as it relates to stability - this was more on the operations and integration level than at the code level, and had a fair amount of good tips for things to remember - mostly how to keep your application from dying because there is an external resource that you don't control that is failing. &amp;nbsp;Some of the horror stories he shared were hilarious, and some you could totally see happening to you (if they hadn't already). &amp;nbsp;Good session. &amp;nbsp;Good reminder of things to consider that often fall by the wayside.&lt;br /&gt;&lt;br /&gt;On to Day 3, which was kind of disappointing. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Implementing Domain-Driven Design&lt;/b&gt; - I was excited about this one because DDD is one of those things you always hear about, but never really get. &amp;nbsp;After the session, I still didn't really get what the big deal was - drive the design of your application by the real-world domain. &amp;nbsp;Seems pretty simple to me. &amp;nbsp;What wasn't simple was the 100 slides of UML class diagrams the presenter used to demonstrate DDD. &amp;nbsp;Yikes, not that awesome.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SOLR - A Case Study&lt;/b&gt; - This was an interesting enough presentation, as Solr is something that we are evaluating. &amp;nbsp;I learned enough to know that we didn't really need to do this right away, but not much more. &amp;nbsp;It wasn't really a case study. &amp;nbsp;What I would have liked was either, Solr real-world example, or Migrating from Lucene to Solr, but alas we didn't really get either. &amp;nbsp;It was still a good presentation though, just not what I was looking for.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Android Mobile Development &lt;/b&gt;- Gah! &amp;nbsp;Fail! &amp;nbsp;This could have been a great way to close things out, but the presenter instead did the presentation completely out of order, gave nobody any opportunities to code, and was just generally all over the place. &amp;nbsp;I was at least able to use the time to make my way through some of the Android tutorials that Google provides. &amp;nbsp;Man what a bummer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3786987904882004218?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3786987904882004218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3786987904882004218'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/07/uberconf-days-23.html' title='UberConf, Days 2+3'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6264065595578598746</id><published>2010-06-21T16:43:00.000-06:00</published><updated>2010-06-21T16:43:19.898-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Uberconf Impressions, Day 1</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://uberconf.com/images/promo/uber_itunes_100x100.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://uberconf.com/images/promo/uber_itunes_100x100.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Last week a group of us from eCollege attended the Uberconf presentation here in the Denver area. &amp;nbsp;I figured I'd post a few impressions:&lt;br /&gt;&lt;br /&gt;First off - the venue - the Westin in Westminster, CO. &amp;nbsp;Nice place. &amp;nbsp;Really awesome food whether you are a vegetarian or a carnivore. &amp;nbsp;Free drinks all day. &amp;nbsp;Decent coffee, although the cups were oddly small. &amp;nbsp;One note to the Westin - people operate better at temperatures higher than 58 degrees. &amp;nbsp;It was FREAKING COLD in there.&lt;br /&gt;&lt;br /&gt;Now on the conference organization. &amp;nbsp;This was one of the best flows of any conference I've attended. &amp;nbsp;There weren't too many people working the conference, and it still went well. &amp;nbsp;Easy registration process, good marketing materials (4GB USB stick - not bad), and two t-shirts I would be super embarrassed about wearing. &amp;nbsp;Easy to figure out what sessions were coming up and where they were going to be. &amp;nbsp;One minor nit - it's a developer conference, which means laptops - next time, get more power strips in the rooms, at least for the workshops.&lt;br /&gt;&lt;br /&gt;And, finally the important stuff - the sessions (day 1):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Patterns of Modular Architecture - &lt;/b&gt;This was not quite what I had hoped. &amp;nbsp;I was looking for patterns, and instead got a fairly basic explanation of how to make your dependencies fairly one-way and isolated. &amp;nbsp;Neat I guess? &amp;nbsp;A decent refresher, but definitely nothing earth-shattering, and the most interesting part was OSGI, which the presenter covered for literally two minutes at the end of the presentation. &amp;nbsp;It did look promising, though.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Common Antipatterns and how to Avoid Them&lt;/b&gt; - This was well presented, but it was still a little light. &amp;nbsp;Good reminders on some common sense things NOT to do, and some reasonably interesting stuff out there - that this presentation was really hitting home with some of the attendees scared me - some of these were things that just shouldn't be happening now, and they obviously still are!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Architect for Scale&lt;/b&gt; - This was a good session - lots of 'things you should be doing when you get to this size/load'. &amp;nbsp;There were a fair amount of good notes about what was not enough, what was too much, and how to move up without huge disruptions&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Automated Deployment with Maven &lt;/b&gt;- This was a huge win. &amp;nbsp;It was a discussion about how to use Maven plugins to streamline and automate the numerous steps that go into releasing a module of code. &amp;nbsp;With maven, it involves updating poms, branching, integrating, labeling, etc, and many manual steps. &amp;nbsp;With some of the tips in the presentation, I was able to make a releasable unit this morning in about 10 minutes with the help of some maven doc. &amp;nbsp;Why were we not doing this!?!? &amp;nbsp;Oh well - awesome. &amp;nbsp;Worth the price of the registration itself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Architecture - Non-functional Requirements&lt;/b&gt; - This was more of a 'what goes into architecture' talk, than something specifically about non-functionals, but very interesting nonetheless. &amp;nbsp;As someone who is headed down that path, it validated much of what I think architecture is about. &amp;nbsp;There was some great back and forth in this presentation from the presenter of this session and the presenter of the earlier Antipattern session.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6264065595578598746?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6264065595578598746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6264065595578598746'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/06/uberconf-impressions-day-1.html' title='Uberconf Impressions, Day 1'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5042285784212558656</id><published>2010-06-01T15:22:00.000-06:00</published><updated>2010-06-01T15:22:59.077-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails Wizardry:  Mocking all your web services with Grails</title><content type='html'>&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Background&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;At work, we are using EC2 to run capacity tests on our environment, which would normally be pretty trivial, but we are a big SAAS shop with tons and tons of endpoints internally. &amp;nbsp;Without setting up EVERYTHING in the cloud, we can't really run our tests...or can we? &amp;nbsp;We would love to use Amazon VPC for EC2, but it requires a fair amount of intervention from your network team. &amp;nbsp;That will be a great alternative down the road - being able to point back into the internal network to access machines rather than deploying them in the cloud. &amp;nbsp;So, plan b - Using grails, I was able to mock every single .NET service that our application talks to in about &lt;i&gt;three hours&lt;/i&gt;. &amp;nbsp;Here are the details:&lt;br /&gt;&lt;br /&gt;We use SOAP services that return some XML, I simply used Fiddler to see what responses are sent back over the wire for each service, and I was ready to rock. &amp;nbsp;There are two main pieces to the puzzle:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;MarkupBuilders&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Generating XML is almost too easy in Groovy. &amp;nbsp;Using the &lt;a href="http://groovy.codehaus.org/Creating+XML+using+Groovy's+MarkupBuilder"&gt;instructions here&lt;/a&gt;, I was able to write some code that spits out some xml based on info passed in. &amp;nbsp;For instance this sample Grails controller will take a login and company and return an XML document with a user id and company id:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;import groovy.xml.MarkupBuilder&lt;br /&gt;&lt;br /&gt;class UserController {&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;  * /MyService/users/getuser?login=myuser&amp;amp;company=mycompany&lt;br /&gt;  */&lt;br /&gt;  def returnUser = {&lt;br /&gt;&lt;br /&gt;        def user = params.login&lt;br /&gt;        def comp = params.company&lt;br /&gt;&lt;br /&gt;        def writer = new StringWriter()&lt;br /&gt;        def xml = getXMLBuilder( writer )&lt;br /&gt;&lt;br /&gt;        xml.'user'('xmlns:xsi': getNsXsi(), 'xmlns:xsd': getXsd(), 'xmlns': getXmlNs() ) {&lt;br /&gt;          userId( "${comp }@${user}" )&lt;br /&gt;          compId( "${comp}@compId" )&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        render( text: writer.toString(), contentType:"text/xml", encoding:"UTF-8" )&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def getXMLBuilder( StringWriter writer ) {&lt;br /&gt;&lt;br /&gt;        writer.append(  "" )&lt;br /&gt;&lt;br /&gt;        return new MarkupBuilder( writer )&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def getNsXsi() {&lt;br /&gt;        return "http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def getXsd() {&lt;br /&gt;        return "http://www.w3.org/2001/XMLSchema"&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def getXmlNs() {&lt;br /&gt;        return "http://yourcompany.com/UserStuff/2009/11/01"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that you have defined your controller, you need to make it so your application can make its normal request to the url it has configured but still get to your controller. &amp;nbsp;That's where the URLMappings.groovy class comes in:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;UrlMappings&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The UrlMappings file already exists by default when creating a project. &amp;nbsp;This file is built to map external urls to your controllers - you can use it to create nice shiny RESTful URLs, or just to do some utilitarian mappings for backwards compatibility, etc. &amp;nbsp;Obviously not every project's requirements map to the grails conventions on how urls map to controllers. &amp;nbsp;To add access to your controller from a different url, you just need to add the following snippet - this will allow Grails to map your request from something like&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="line-height: 14px; white-space: pre;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;/MyService/users/getuser?login=me&amp;amp;company=acme&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;to&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;/user?login=me&amp;amp;company=acme&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;    "/MyService/users/getuser" {&lt;br /&gt;          controller = "user"&lt;br /&gt;          action = "returnUser"&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;More information can be found &lt;a href="http://www.grails.org/URL+mapping"&gt;at this link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At this point, you have a service running that will return the valid XML for your service, and will respond to a call at a&amp;nbsp;URL&amp;nbsp;that doesn't actually match. &amp;nbsp;Now you can rinse and repeat for each service that you need to mock out. &amp;nbsp;Happy Grailing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5042285784212558656?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5042285784212558656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5042285784212558656'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/06/grails-wizardry-mocking-all-your-web.html' title='Grails Wizardry:  Mocking all your web services with Grails'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5636356465802334238</id><published>2010-04-28T08:22:00.001-06:00</published><updated>2010-04-28T08:50:15.421-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>PowerMock - Mocking Statics - Supplemental Documentation</title><content type='html'>I have recently suffered through a bit of pain working with &lt;a href="http://code.google.com/p/powermock"&gt;PowerMock&lt;/a&gt;. &amp;nbsp;It seemed extremely promising, as it sits on top of &lt;a href="http://easymock.org/"&gt;EasyMock&lt;/a&gt;, which we use for mock objects in our unit tests (it also works with &lt;a href="http://mockito.org/"&gt;Mockito&lt;/a&gt;, apparently), and promises to give you the tools to mock those pesky static calls that kill testability. &amp;nbsp;I had a few issues getting started, and they centered around jUnit 3.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;PowerMock with jUnit 3&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;All the examples and documentation seem to be based on jUnit 4. &lt;a href="http://code.google.com/p/powermock/wiki/MockStatic"&gt;This page has great examples&lt;/a&gt; on how to run your static mocking tests when running on jUnit 4, but how to do it on jUnit 3?? &amp;nbsp;An extremely simple example of how to do this in jUnit 4 is here:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;@RunWith(PowerMockRunner.class)&lt;br /&gt;public class AwesomeTest {&lt;br /&gt;&lt;br /&gt;  @PrepareForTest(StaticClass.class)&lt;br /&gt;  public void testDoExecute() throws Exception {&lt;br /&gt;    ...&lt;br /&gt;    PowerMock.mockStatic(StaticClass.class);&lt;br /&gt;&lt;br /&gt;    expect( StaticClass.doStuff( param ) ).andReturn( "yo!" );&lt;br /&gt;    replay( StaticClass.class );&lt;br /&gt;&lt;br /&gt;    //test some stuff!&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To accomplish the same thing in jUnit 3, without the annotation support, you can do this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public class MyPowerMockSuite extends PowerMockSuite {&lt;br /&gt;&lt;br /&gt;  public static TestSuite suite() throws Exception {&lt;br /&gt;  &lt;br /&gt;    return new PowerMockSuite(AwesomeTest.class);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  public static void main(String[] args) throws Exception {&lt;br /&gt;  &lt;br /&gt;    junit.textui.TestRunner.run( suite() );&lt;br /&gt;  }  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class AwesomeTest {&lt;br /&gt;&lt;br /&gt;  @PrepareForTest(StaticClass.class)&lt;br /&gt;  public void testDoExecute() throws Exception {&lt;br /&gt;    ...&lt;br /&gt;    PowerMock.mockStatic(StaticClass.class);&lt;br /&gt;&lt;br /&gt;    expect( StaticClass.doStuff( param ) ).andReturn( "yo!" );&lt;br /&gt;    replay( StaticClass.class );&lt;br /&gt;&lt;br /&gt;    //test some stuff!&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;PowerMock and Multiple Classes&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;To mock methods from multiple classes, you will need to amend the '@PrepareForTest' annotation, just passing a string array like so:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public class MyPowerMockSuite extends PowerMockSuite {&lt;br /&gt;&lt;br /&gt;  public static TestSuite suite() throws Exception {&lt;br /&gt;  &lt;br /&gt;    return new PowerMockSuite(AwesomeTest.class);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  public static void main(String[] args) throws Exception {&lt;br /&gt;  &lt;br /&gt;    junit.textui.TestRunner.run( suite() );&lt;br /&gt;  }  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class AwesomeTest {&lt;br /&gt;&lt;br /&gt;  @PrepareForTest({StaticClass.class,StaticClassier.class})&lt;br /&gt;  public void testDoExecute() throws Exception {&lt;br /&gt;    ...&lt;br /&gt;    PowerMock.mockStatic(StaticClass.class);&lt;br /&gt;&lt;br /&gt;    expect( StaticClass.doStuff( param ) ).andReturn( "yo!" );&lt;br /&gt;    replay( StaticClass.class );&lt;br /&gt;&lt;br /&gt;    PowerMock.mockStatic(StaticClassier.class);&lt;br /&gt;&lt;br /&gt;    expect( StaticClassier.doStuff( param ) ).andReturn( "yo!" );&lt;br /&gt;    replay( StaticClassier.class );&lt;br /&gt;&lt;br /&gt;    //test some stuff!&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Gotchas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;PowerMock 1.3.7 only works with EasyMock 2.5.2, which we have had some issues with. &amp;nbsp;I had to move back to PowerMock 1.2.5 to use EasyMock 2.4. &amp;nbsp;I didn't find a lot of issues with using this version, though we had some odd calls that were required where it told me not to stub a return when the method returned something, or where I had to stub out calls that didn't seem like they should be required. &amp;nbsp;With a simple static method that didn't really call many other static methods, it seems to work like a charm.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5636356465802334238?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5636356465802334238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5636356465802334238'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/04/powermock-mocking-statics-supplemental.html' title='PowerMock - Mocking Statics - Supplemental Documentation'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6574970533660338892</id><published>2010-04-14T09:03:00.000-06:00</published><updated>2010-04-14T09:03:15.309-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><title type='text'>How Five Guys Got Big...by being Awesome</title><content type='html'>About once a month when I was young (late 80s into the 90s), my dad and I went to this ratty little burger shop to get the most delicious burgers and out of this world fries at a place called '&lt;a href="http://www.fiveguys.com/history.aspx"&gt;Five Guys&lt;/a&gt;'. &amp;nbsp;The people were always friendly, and the order was always perfect. &amp;nbsp;It was no frills but they promised delicious burgers and fries, and it's what they delivered, without exception. &lt;br /&gt;&lt;br /&gt;Fast forward to today, and Five Guys is EVERYWHERE. &amp;nbsp;It's growing in leaps and bounds - they even have them here in Colorado, with 400 to come in California! &amp;nbsp;Read &lt;a href="http://www.inc.com/magazine/20100401/jerry-murrell-five-guys-burgers-and-fries.html"&gt;the story in Inc. Magazine&lt;/a&gt; about how they got here. &amp;nbsp;You can really learn a lot from the way this business is run.&lt;br /&gt;&lt;br /&gt;In an age when we understand that eating burgers and fries is not good for you, if you are going to do it, don't do it at&amp;nbsp;McDonald's. &amp;nbsp;Go get something worth splurging on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6574970533660338892?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6574970533660338892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6574970533660338892'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/04/how-five-guys-got-bigby-being-awesome.html' title='How Five Guys Got Big...by being Awesome'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6026042391279011078</id><published>2010-03-31T18:15:00.002-06:00</published><updated>2010-03-31T18:21:58.419-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails Wizardry: FCKEditor</title><content type='html'>So I am working on this side project, and obviously I chose Groovy and Grails to do the work. &amp;nbsp;I continuously marvel at how awesome, easy-to-use, and powerful the framework is, but lately I've been even more amazed at the plugins and how many there are now, how well documented (most) are, and how the quality has increased greatly. &lt;br /&gt;&lt;br /&gt;We are using rich editors, and the &lt;a href="http://ckeditor.com/"&gt;FCKeditor&lt;/a&gt; was a no-brainer. &amp;nbsp;I was delighted to find out that it was available as &lt;a href="http://www.grails.org/FCKeditor+plugin"&gt;a grails plugin&lt;/a&gt;. &amp;nbsp;I pulled it into my project, and defining an editor in one of my views was as hard as this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;fckeditor:editor&lt;br /&gt;id="materials"&lt;br /&gt;name="materials"&lt;br /&gt;width="70%"&lt;br /&gt;height="200"&lt;br /&gt;toolbar="Standard"&lt;br /&gt;fileBrowser="default"&lt;br /&gt;value="${fieldValue(bean:mybean, field:'materials').decodeHTML()}"&amp;gt;               ${fieldValue(bean:contentInstance, field:'materials').decodeHTML()}&lt;br /&gt;&amp;lt;/fckeditor:editor&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The important parts here are:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;toolbar&lt;/b&gt;: &amp;nbsp;This gives you the ability to choose the set of tools for your editor. &amp;nbsp;More on this one later&lt;/li&gt;&lt;li&gt;&lt;b&gt;value&lt;/b&gt;: You can identify the preset value. &amp;nbsp;If this is html that was saved, then you must include the decodeHTML() call or else the value you will see is raw html.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The rest is pretty much boilerplate - obviously the height/width will depend on your site.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To customize the contents of your toolbar, you will need to specify a custom configuration file, which is in the form of javascript. &amp;nbsp;Your gsp page must contain:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;fckeditor:config CustomConfigurationsPath="${resource(dir:'js',file:'myconfig.js')}"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;This file looks like this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;FCKConfig.ToolbarSets["ed-limited"] = [&lt;br /&gt;   ['Cut','Copy','Paste'],&lt;br /&gt;   ['Undo','Redo','-','Bold','Italic','Underline','StrikeThrough'],&lt;br /&gt;   '/',&lt;br /&gt;   ['OrderedList','UnorderedList','-','Outdent','Indent'],&lt;br /&gt;   ['Link'],&lt;br /&gt;   //'/',&lt;br /&gt;   ['Style'],&lt;br /&gt;   ['Table','Image','SpecialChar'],&lt;br /&gt;   ['About']&lt;br /&gt;   ];&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;You can define as many of these as you want. &amp;nbsp;See &lt;a href="http://docs.cksource.com/FCKeditor_2.x/Developers_Guide/Configuration/Toolbar"&gt;this link&lt;/a&gt; for configuration details.&lt;br /&gt;&lt;br /&gt;Once you defined this, you can simply update the toolbar attribute on the FCKeditor to point to your new toolbar, in this case 'ed-limited'.&lt;br /&gt;&lt;br /&gt;One big gotcha is that this uses 2.6 currently, while the newest stable version seems to be 3.1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6026042391279011078?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6026042391279011078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6026042391279011078'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/03/grails-wizardry-fckeditor.html' title='Grails Wizardry: FCKEditor'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2309520628793140831</id><published>2010-03-28T16:46:00.000-06:00</published><updated>2010-03-28T16:46:24.814-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='customer service'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>The Brilliance of Southwest</title><content type='html'>When watching the yearly installation of March Madness, CEOs of all the major airlines not named Southwest must be furious. &amp;nbsp;Nearly every commercial break during the games features an advertisement touting Southwest's baggage policy. &amp;nbsp;In fact, most Southwest ads feature ridicule of other airlines. &amp;nbsp;I fly almost exclusively on Southwest. &amp;nbsp;Make no mistake - it's not perfect. &amp;nbsp;Sometimes flights are late. &amp;nbsp;Sometimes you have to too much taxiing, or to wait a while for a gate assignment. &amp;nbsp;The difference between Southwest and the rest is clear: &amp;nbsp;Southwest makes it a bit easier to deal with the stressful travel day by being cordial, helpful, and by performing their jobs professionally and with a smile. &amp;nbsp;Because of this advantage, Southwest can charge a little more than the bargain carriers, and not charge for baggage. &lt;br /&gt;&lt;br /&gt;The CEOs of United, American, et al. can only be furious at themselves. &amp;nbsp;Jena and I were talking about how the show 'Undercover Boss' (which we love by the way) should feature a CEO of an airline, but then we joked that they would have to shut down the entire operation after all employees in the airport were fired by the undercover boss for being surly, unpleasant, and incompetent. &lt;br /&gt;&lt;br /&gt;An example of the rank ineptitude: &amp;nbsp;'The Rest' has employed a baggage fee policy that encourages people to cram all their stuff into oversized baggage that they attempt, usually unsuccessfully, to cram into an overhead bin. &amp;nbsp;After being berated by the rude airplane staff (who let them on the plane with the large bag in the first place), the thrifty passengers are allowed to check their bags FOR FREE. &amp;nbsp;Now the people who played by the rules are mad because they had to pay and the people who cheated didn't. &amp;nbsp;The people who didn't pay aren't happy because they have been treated rudely by the flight attendants. &amp;nbsp;All of the people are wondering why they didn't fly another airline, like...hmmm...Southwest maybe?&lt;br /&gt;&lt;br /&gt;Lesson to any managers of any company, any size, any industry, any location: &amp;nbsp;there is no excuse for rude, unprofessional behavior, no matter how hard or stressful your job may be. &amp;nbsp;If this behavior is tolerated, then it becomes accepted practice, and all of a sudden a few years pass by and you can't watch basketball without your company being made fun of by a company that never accepted that sort of behavior.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2309520628793140831?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2309520628793140831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2309520628793140831'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/03/brilliance-of-southwest.html' title='The Brilliance of Southwest'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3986451139578416227</id><published>2010-02-22T17:56:00.000-07:00</published><updated>2010-02-22T17:56:46.520-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>What's That You're Reading??  February '10 Edition</title><content type='html'>Well once again, the days have become weeks, weeks have become a month, and I haven't checked in on my blog...sigh. &amp;nbsp;I need a personal assistant to hound me into keeping up with this thing. &amp;nbsp;It's not for lack of ideas of what to write about that I let my poor journal languish...I seem to always find something else to do.&lt;br /&gt;&lt;br /&gt;So for an awesome Christmas/Birthday present, my mom got me a Kindle! &amp;nbsp;This is the perfect gift for a serial reader like myself. &amp;nbsp;It's easy to read, easy to use, has free wireless internet (super handy for those of us without iphones/androids), has incredible battery life, and delivers me books in under a minute. &amp;nbsp;It's so awesome! &amp;nbsp;I fired it up, and immediately ordered...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0385504225?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0385504225"&gt;The Lost Symbol&lt;/a&gt;&amp;nbsp;- This is Dan Brown's latest Robert Langdon tale, and what can I say...it's obviously interesting in its conspiracy theory stylings, similar to Angels and Demons and The Da Vinci Code, but this one really seemed to fall short. &amp;nbsp;I loved that it all took place in DC, and down the street from our old house. &amp;nbsp;I liked the initial plot. &amp;nbsp;It's pretty much everything else that took place that really didn't do it for me. &amp;nbsp;I thought it was too long, that the badguy was almost comical, and that the way everything shook out was just a little over the top, even for a fiction. &amp;nbsp;The ending wasn't even earth-shattering. &amp;nbsp;Sigh.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.amazon.com/gp/product/0812978021?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0812978021"&gt;The Last Dickens: A Novel&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0812978021" style="border-bottom-style: none !important; border-color: initial !important; border-left-style: none !important; border-right-style: none !important; border-top-style: none !important; border-width: initial !important; margin-bottom: 0px !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important;" width="1" /&gt;&amp;nbsp;- this was a novel by Matthew Pearl who also wrote the Dante Club, which I really enjoyed. &amp;nbsp;This one is about Dickens' last manuscript, and the trials and tribulations of a small publishing house in Boston that held the rights to Dickens publishing in the US. &amp;nbsp;It's a pretty decent mystery until the end, when it all of a sudden turns out that the entire story was based on a premise that more ridiculous than I ever could have imagined. &amp;nbsp;Fairly disappointing book for the last 20-30 pages...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.amazon.com/gp/product/0060889578?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0060889578"&gt;SuperFreakonomics: Global Cooling, Patriotic Prostitutes, and Why Suicide Bombers Should Buy Life Insurance&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0060889578" style="border-bottom-style: none !important; border-color: initial !important; border-left-style: none !important; border-right-style: none !important; border-top-style: none !important; border-width: initial !important; margin-bottom: 0px !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important;" width="1" /&gt;&amp;nbsp;- this followup to the big blockbuster Freakonomics is more of the same - irreverent discussion of real-life things and how they relate to economics. &amp;nbsp;It's worth a read, quick, and provides a reader with a few more decent 'hmm didn't think of that' moments, but certainly not anything astoundingly good. &amp;nbsp;I'd say it's well written but not really extremely well thought out stuff.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.amazon.com/gp/product/044661873X?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=044661873X"&gt;Simple Genius&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=044661873X" style="border-bottom-style: none !important; border-color: initial !important; border-left-style: none !important; border-right-style: none !important; border-top-style: none !important; border-width: initial !important; margin-bottom: 0px !important; margin-left: 0px !important; margin-right: 0px !important; margin-top: 0px !important;" width="1" /&gt;&amp;nbsp;- Ahh, another David Baldacci book. &amp;nbsp;No need to write much. &amp;nbsp;They are always pretty good without being great.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.amazon.com/gp/product/0812974530?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0812974530"&gt;The Whiskey Rebels&lt;/a&gt;&amp;nbsp;- Another historical fiction from David Liss, whose books I really enjoy. &amp;nbsp;This one is a story about a couple that is tricked into buying a plot of useless land in western Pennsylvania after the Revolution, and a disgraced spy in Philadelphia who gets roped into a crazy plot to bring down Alexander Hamilton's Bank of the United States. &amp;nbsp;Inevitably and rather smartly, the two plot lines intersect in what is a very enjoyable novel. &amp;nbsp;David Liss really has mastered the historical novel (and the non-historical, as evidenced by another book I really liked - The Ethical Assassin).&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0307269981?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0307269981"&gt;The Girl Who Played with Fire&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0307269981" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- This was another really good book by Stieg Larsson. &amp;nbsp;The Girl with the Dragon Tattoo was an immensely enjoyable novel about a disgraced investigative writer in Sweden on the trail of a really juicy story, and his collaboration with the young and troubled investigator Lisbeth Salander. &amp;nbsp;That book was very well written with great character development, and had a great cliffhanger of an ending. &amp;nbsp;This book was even better! &amp;nbsp;A great story that fell into place at a nice pace, with more great writing, interesting characters, and a crazy ending. &amp;nbsp;I can't wait to read Larsson's third (and sadly last) book soon.&lt;br /&gt;&lt;br /&gt;Now that I finished those, I am working on these:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0143116177?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0143116177"&gt;The Ascent of Money: A Financial History of the World&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0143116177" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- this is a (so far) easy to read history of currency. &amp;nbsp;The first fifty pages have been full of interesting information and it's delivered in a very accessible manner.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0679744398?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0679744398"&gt;All the Pretty Horses&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0143038583?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0143038583"&gt;The Omnivore's Dilemma: A Natural History of Four Meals&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0143038583" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- All you can say every time you finish a chapter of this book is 'WOW'. &amp;nbsp;I can't believe that the things we eat have such a colorful (and mostly disgusting) history. &amp;nbsp;Really makes you think about the things you eat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3986451139578416227?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3986451139578416227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3986451139578416227'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/02/whats-that-youre-reading-february-10.html' title='What&apos;s That You&apos;re Reading??  February &apos;10 Edition'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-645805808603940667</id><published>2010-01-26T07:35:00.001-07:00</published><updated>2010-01-26T07:40:13.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Politics!, or Why Scott Brown Matters So Much</title><content type='html'>Well Barack Obama's time in charge hasn't been all peaches and cream. &amp;nbsp;Is anyone surprised?? &amp;nbsp;I am not, but ever since 'worst.candidate.ever' Martha Coakley blundered away Ted Kennedy's seat in Massachussetts, all the talking heads have been writing Obama's political eulogy. &amp;nbsp;I think it's far too early to say that anything is a failure or that Obama will never get anything done. &amp;nbsp;It took two years for Clinton to fail at passing health care, and I think we can agree that from a non-Lewinsky standpoint, he did a pretty decent job. &lt;br /&gt;&lt;br /&gt;Why does it matter so much if the Democrats have only 59 votes?? &amp;nbsp;The filibuster! &amp;nbsp;That's why! &amp;nbsp;Jena and I were talking about it the other day, and I must admit that I was fairly ignorant outside of being able to say that 60 votes allows you to shut down the filibuster completely. &amp;nbsp;&lt;a href="http://www.npr.org/templates/story/story.php?storyId=13"&gt;Fresh Air&lt;/a&gt; to the rescue! &amp;nbsp;The first segment of yesterday's Fresh Air program explains the dynamics of the filibuster...click the link below to listen:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: arial, sans-serif; font-size: 16px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h1 style="font-family: georgia, sans-serif; font-size: 1.4em; line-height: 1.2em; margin-bottom: 0.1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://www.npr.org/templates/story/story.php?storyId=122945445"&gt;Gregory Koger, Explaining The American Filibuster&lt;/a&gt;&lt;/h1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-645805808603940667?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/645805808603940667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/645805808603940667'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/01/politics-or-why-scott-brown-matters-so.html' title='Politics!, or Why Scott Brown Matters So Much'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3383348768207942158</id><published>2010-01-25T17:58:00.000-07:00</published><updated>2010-01-25T17:58:20.821-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><category scheme='http://www.blogger.com/atom/ns#' term='inspiration'/><title type='text'>Couldn't Say it Any Better</title><content type='html'>From Seth Godin: &amp;nbsp;&lt;a href="http://sethgodin.typepad.com/seths_blog/2010/01/without-them.html"&gt;Without Them&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"you can fail by going along with that and not doing it, or you can do it, cause a ruckus and work things out later&lt;/i&gt;"&lt;/blockquote&gt;At work you often run into situations where you see something that just smells. &amp;nbsp;Something that isn't right, but is perpetuated by inertia or apathy. &amp;nbsp;You have two choices. &amp;nbsp;You can say 'well that will never fly - they have been doing this forever', or you can say 'I have an idea and I am going to go ahead and do it, and when people see that things can be better they will get on board or get out of the way'. &lt;br /&gt;&lt;br /&gt;I choose B.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3383348768207942158?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3383348768207942158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3383348768207942158'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/01/couldnt-say-it-any-better.html' title='Couldn&apos;t Say it Any Better'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-11447448710270185</id><published>2010-01-25T17:37:00.000-07:00</published><updated>2010-01-25T17:37:39.677-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='colorado'/><title type='text'>On the Mountain</title><content type='html'>Everyone knows that skiing is a big part of living in Colorado. &amp;nbsp;I wasn't sure how much of an integral part of my Colorado life it was going to be, but surprisingly, it's ended up being something that I really enjoy, and that I can see myself doing a LOT of in the future. &amp;nbsp;Prior to coming out here, I had spent all of 5 or 6 days skiing in my life, with one extremely icy/slushy day at Wintergreen, and a few pretty solid days at Snowshoe and Sugarloaf up in Maine, where I did about six cartwheels on my head while avoiding a potentially deadly collision with an entire ski school. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos-d.ak.fbcdn.net/hphotos-ak-snc3/hs238.snc3/22566_1321154033364_1366222385_2081142_3034302_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://photos-d.ak.fbcdn.net/hphotos-ak-snc3/hs238.snc3/22566_1321154033364_1366222385_2081142_3034302_n.jpg" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Anyway, I got here, and I think there's magic in the air because for someone who is not exactly the most graceful, I was able to get out on the slopes at Copper, and by the end of the day I was sort of skiing like someone who knows how to ski. &amp;nbsp;This inspired us to get a season pass at Arapahoe Basin. &amp;nbsp;We have been up to the mountain four times since then, and this time I went up to the top and skiied the blues all the way down without killing myself. &amp;nbsp;I also completed my very first ski day without a fall. &amp;nbsp;This won't come as a surprise to anyone who has done skiing or snowboarding, but it's pretty awesome. &amp;nbsp;All your cares evaporate, as all you can think about is how fast you are going and whether or not you want to go faster. &amp;nbsp;Awesome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-11447448710270185?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/11447448710270185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/11447448710270185'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2010/01/on-mountain.html' title='On the Mountain'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3650668048091285188</id><published>2009-12-23T15:27:00.000-07:00</published><updated>2009-12-23T15:27:17.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='christmas'/><title type='text'>Christmas?</title><content type='html'>Some people think that Christmas is overrated. &amp;nbsp;That's it's nothing but a meaningless commercialized, materialistic money grab that has lost all of it's real symbolic juice. &amp;nbsp;These people are incredibly adamant that those who do dive whole hog into Christmas are foolish, naive people who are tricking themselves. &amp;nbsp;I heard a kitchen conversation at work the other day and it made me wonder about how I really felt about Christmas. &amp;nbsp;It took a while, but I think I know:&lt;br /&gt;&lt;br /&gt;'The Christmas Season' &lt;i&gt;is&lt;/i&gt; commercialized and materialistic, but it doesn't spoil what Christmas is really all about. &amp;nbsp;The symbolism of Christmas is, to me, what is really important...the part of the year where you unselfishly give to people just to see the smile on their face, a time when you spend time with friends and family and reminisce on the year that was, and a time when you celebrate what's really important in life. &amp;nbsp;Sure you can get carried away buying crap that nobody needs because it's ON SALE!!!, but it doesn't just automatically signify a 'cheapening of the holiday', because the whole gift thing is just a small part of what makes it so great.&lt;br /&gt;&lt;br /&gt;I love this season because my Dad loved this season. &amp;nbsp;A guy who otherwise was quiet and pretty reserved went absolutely all out when it came to Christmas. &amp;nbsp;A guy who really didn't like shopping could be found trolling the malls right up until the night before Christmas. &amp;nbsp;A guy who wasn't really into embellishment would go to great lengths to professionally wrap all his gifts to me and my Mom, no matter how gigantic or oddly shaped. &amp;nbsp;He also made sure to sign the 'from' section on each and every one of the gifts with something ridiculous like 'Santa', or 'Rudolph', or 'The Elves', and he filled the stockings up with more gifts than most people got presents. &amp;nbsp;It was about giving. &lt;br /&gt;&lt;br /&gt;I love this season because it's about traditions. &amp;nbsp;It's about the times that define your family. &amp;nbsp;It's about times like going out with your father to buy a Christmas tree, and remembering the first year your dad let you 'help him' carry the tree in, and you were strong enough to carry it in by yourself. &amp;nbsp;It's about putting all the ornaments that you had accumulated through the years on the tree, stopping to remember how you got that one, or who made this one for you. &amp;nbsp;It's about sitting down and playing the same record you play every year, and having the same special breakfast, that you HAD to eat before you could open presents. &amp;nbsp;These are the kind of times that define families, and Christmas is about the biggest one for a lot of those families.&lt;br /&gt;&lt;br /&gt;It was about one special time in the year when no matter what else was going on, everything was perfect, everyone was happy, and everyone knew how much everyone else in the room loved them. &amp;nbsp;It was special, it stuck with me, and I already do the same thing. &amp;nbsp;I love Christmas. &amp;nbsp;I love that people drive around in cheesy Santa hats. &amp;nbsp;I love giving the bell ringer $20. &amp;nbsp;I love thinking back on all the special Christmas seasons that I spent with my family, and that I can barely remember any of the gifts that I got, but I can certainly remember how I knew how much I was loved.&lt;br /&gt;&lt;br /&gt;So yeah, Christmas isn't necessarily about buying stuff. &amp;nbsp;It's about choosing your own way to express your love for the people around you. &amp;nbsp;If that means you buy some stuff, then hey, why not. &amp;nbsp;It's your money. &amp;nbsp;It doesn't cheapen the season to me. &amp;nbsp;Just make sure everyone you love knows that you love them. &amp;nbsp;That's what it's all about to me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3650668048091285188?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3650668048091285188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3650668048091285188'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/12/christmas.html' title='Christmas?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3324516228602865539</id><published>2009-12-23T15:08:00.000-07:00</published><updated>2009-12-23T15:08:25.088-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>2009 in Review</title><content type='html'>Well it's here again. &amp;nbsp;Another year of Christmas spirit. &amp;nbsp;Here in Denver we actually get a White Christmas - we are in the midst of a 6-incher, which is exciting, except we are trying to fly out to Boston tomorrow morning. &amp;nbsp;Hopefully DIA has their de-icers warmed up and ready to rock...&lt;br /&gt;&lt;br /&gt;This has been one crazy year. &amp;nbsp;It's my first full year as a married man. &amp;nbsp;My first year living somewhere not called Virginia or DC. &amp;nbsp;My first year being involved in selling a house. &amp;nbsp;(It sucks by the way). &amp;nbsp;My first year moving somewhat blindly across the country to a completely new place, where the amount of people I know can be counted using one hand. Yep, crazy year. &amp;nbsp;It was a great year though. &lt;br /&gt;&lt;br /&gt;This year I learned a fair amount about planning. &amp;nbsp;Planning everything so that you can coincide a move, a job, a home sale, finding a new place, and moving into it. &amp;nbsp;It's stressful. &amp;nbsp;This year was a crazy year. &amp;nbsp;Did I mention that? &lt;br /&gt;&lt;br /&gt;The year started out pretty nicely - we went to Aruba with Jena's parents, her sister and bro-law, her Aunt Louise, and our awesome nephew. &amp;nbsp;It was an awesome trip, mostly spent floating around the lazy river...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SzKHwb1PGOI/AAAAAAAAAKI/hUwTk1uF958/s1600-h/IMG_2303.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SzKHwb1PGOI/AAAAAAAAAKI/hUwTk1uF958/s320/IMG_2303.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Spring was pretty uneventful. &amp;nbsp;We were getting ready to sell our house, and starting to do the awesome dance where you leave every weekend and are forced to clean every morning before you leave the house. &amp;nbsp;I got pretty good at being a better cleaner though, so that's good. &amp;nbsp;Also we always came home to a clean house. &amp;nbsp;Those are roughly the only two things that I can think of that were good about selling the house.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKIlsN7BxI/AAAAAAAAAKQ/PuV1Ad3TYfc/s1600-h/P5230030.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKIlsN7BxI/AAAAAAAAAKQ/PuV1Ad3TYfc/s320/P5230030.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Over Memorial Day, we got a visit from Jena's sister and fam. &amp;nbsp;We went to Annapolis where our nephew learned to drive boats and dressed like a pirate. &amp;nbsp;We had a great time out on the boat and walking around town. &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKIvGTxETI/AAAAAAAAAKY/DQeml690M8g/s1600-h/P5230019.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKIvGTxETI/AAAAAAAAAKY/DQeml690M8g/s320/P5230019.JPG" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;a href="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKIvGTxETI/AAAAAAAAAKY/DQeml690M8g/s1600-h/P5230019.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Over the summer, the house sale process dragged on, but it didn't keep us from doing a fair amount of fun stuff. &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SzKKICAUunI/AAAAAAAAAKg/JR16Os9VDFU/s1600-h/P6260043.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SzKKICAUunI/AAAAAAAAAKg/JR16Os9VDFU/s320/P6260043.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;La Jolla Cliffs&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;We did some boating on the Chesapeake Bay, spent July 4th in Annapolis with family, and I made it out to San Diego for the first time. &amp;nbsp;What a beautiful place.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SzKK1waA7dI/AAAAAAAAAKo/1lNRGwrx08M/s1600-h/P7040090.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SzKK1waA7dI/AAAAAAAAAKo/1lNRGwrx08M/s320/P7040090.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We also took in a Tigers game in Baltimore on a beautiful day for baseball. &amp;nbsp;And we got a win! &amp;nbsp;It was a fun time and erstwhile Tiger Edwin Jackson threw a gem! &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKMKScE-iI/AAAAAAAAAKw/3M5nSyolG2I/s1600-h/P5310032.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SzKMKScE-iI/AAAAAAAAAKw/3M5nSyolG2I/s320/P5310032.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We finally sold the house this Summer. &amp;nbsp;Wow, what a pain in the ass, dealing with the most unreasonable buyers and agent, but it allowed us to finally realize our dream of moving to Colorado! &amp;nbsp;With the house sold, we moved in with my parents-in-law while everything fell into place for our journey. &amp;nbsp;Jena was allowed to keep her job at WeddingWire, and I lucked into a job at eCollege in Denver. &amp;nbsp;I traveled out for an interview in August and did some house hunting while I was here. &amp;nbsp;I found a great rental that had everything we wanted in a great neighborhood, and got the job offer, all in the same 48 hrs! &amp;nbsp;It was finally time to roll out!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SzKNDIvvYKI/AAAAAAAAAK4/vPUIcePJFEg/s1600-h/Wedding+and+Other+002.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SzKNDIvvYKI/AAAAAAAAAK4/vPUIcePJFEg/s320/Wedding+and+Other+002.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We got everything packed up in a POD and shipped off to Denver while we waiting for our moving date to arrive. &amp;nbsp;It was a long and tiring process, but the POD worked out great, and everything made it cross-country in one piece. &amp;nbsp;An amazing feat, and it was a pretty good deal too. &amp;nbsp;We moved in with Jena's parents, which was not bad at all. &amp;nbsp;I am blessed with a great pair of parents-in-law, and I think they enjoyed having their daughter back home for a while. &amp;nbsp;We took some time out to attend a beautiful wedding in Vermont and watched Jena's cousin KC get hitched to his beautiful bride Annemarie. &amp;nbsp;Once we got back, it was pretty much go time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos-h.ak.fbcdn.net/hphotos-ak-snc1/hs270.snc1/9733_1255878561518_1366222385_1901805_7559510_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://photos-h.ak.fbcdn.net/hphotos-ak-snc1/hs270.snc1/9733_1255878561518_1366222385_1901805_7559510_n.jpg" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We made it out here pretty quick. &amp;nbsp;We made a couple stops along the way - we saw my grandparents:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos-f.ak.fbcdn.net/hphotos-ak-snc1/hs270.snc1/9733_1255878601519_1366222385_1901806_5766204_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://photos-f.ak.fbcdn.net/hphotos-ak-snc1/hs270.snc1/9733_1255878601519_1366222385_1901806_5766204_n.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And then we stopped in Iowa to see our friend Tricia, who showed us around her wacky little town:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos-e.ak.fbcdn.net/hphotos-ak-snc1/hs250.snc1/9733_1255878721522_1366222385_1901809_1552556_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://photos-e.ak.fbcdn.net/hphotos-ak-snc1/hs250.snc1/9733_1255878721522_1366222385_1901809_1552556_n.jpg" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then we hightailed it the rest of the way to Denver where we were met with an awesome housewarming surprise from Jena's friend Meredith's mom...what a great welcome!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://photos-c.ak.fbcdn.net/hphotos-ak-snc1/hs250.snc1/9733_1255879161533_1366222385_1901820_4064642_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://photos-c.ak.fbcdn.net/hphotos-ak-snc1/hs250.snc1/9733_1255879161533_1366222385_1901820_4064642_n.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So anyway, this is where we live now. &amp;nbsp;Denver. &amp;nbsp;It's weird, because I keep calling the DC area home, and it's not really home anymore. &amp;nbsp;It's a place I grew up, and it's where I am from, but it's not where I live, which is quite a change. &amp;nbsp;I have three months under my belt in Denver, and the other 380 were spent in DC. &amp;nbsp;The good news is that we love it here. &amp;nbsp;We love the friendly people, the great neighborhood we landed in, and the wacky weather is even growing on me a bit. &amp;nbsp;Our house is nice for a rental, but we look forward to buying something that we can call our own. &amp;nbsp;Work is going really well - I couldn't be more pleased with my manager, my team, and the work that I get to do. &amp;nbsp;It's been a really pleasant surprise, as I went in pretty much blind. &amp;nbsp;We have had a lot of good times since we got here. &amp;nbsp;We've done some sightseeing, beer tasting, skiing, and we've been pretty busy sampling all the great restaurants in our area. &amp;nbsp;It's been quite a year, but I can't wait for next year. &amp;nbsp;We are all settled in now, and we can put all our energy in enjoying everything that Colorado has to offer, including snowshoeing, hiking, more beer tasting, and skiing. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Goodbye 2009! &amp;nbsp;Bring it on 2010!&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&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/3444412265952661654-3324516228602865539?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3324516228602865539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3324516228602865539'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/12/2009-in-review.html' title='2009 in Review'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_yrO-Y2qwU_A/SzKHwb1PGOI/AAAAAAAAAKI/hUwTk1uF958/s72-c/IMG_2303.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8931738970521666746</id><published>2009-12-03T19:12:00.000-07:00</published><updated>2009-12-03T19:12:58.542-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>On Intiators, Blockers, Supporters, and Observers</title><content type='html'>&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;In reading &lt;/span&gt;&lt;a href="http://www.amazon.com/gp/product/0385530609?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0385530609"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Sway: The Irresistible Pull of Irrational Behavior&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;, I found myself fascinated with the chapter on the four personality types -&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Initiators&lt;/b&gt;, who have ideas and drive innovation, and are the general optimists.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Blockers&lt;/b&gt;, who are the doom-and-gloom, are you sure that's a good idea types.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Supporters&lt;/b&gt;, who pick the side of the initiators or blockers.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;b&gt;Observers&lt;/b&gt;, who simply provide comments.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;I have done a lot of thinking about what the right balance of personalities is for a team. &amp;nbsp;In a perfect world you want a bunch of &lt;b&gt;initiators&lt;/b&gt;, because they can just think up all kinds of good ideas and knock them out, moving the team and the organization forward. &amp;nbsp;This generally doesn't end up happening this way. &amp;nbsp;I can speak from experience when I say that having a manager who is an initiator and an employee who is an initiator is not necessarily a good mix. &amp;nbsp;This can lead to something of a whirlwind of work that might all be interesting, but isn't necessarily good for the organization. &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;You also don't want a lot of&lt;b&gt; blocker&lt;/b&gt;s and nothing else, because you will sit around spending endless hours justifying why something has to get done, even when it seems relatively clear why it's a good idea. &amp;nbsp;This is the other end of the spectrum. &amp;nbsp;Instead of doing too much and having some of it not be the right stuff, you end up doing not enough of anything. &amp;nbsp;People get fired because of this.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;A perfect balance in my opinion is to have a team made up of an initiator, a blocker, a supporter, and to have the manager be an observer. &amp;nbsp;The initiator gets people fired up, introduces ideas and enthusiasm, and generally dives in with gusto. &amp;nbsp;The blocker is there to make sure the initiator doesn't get carried away, questioning whether something is the right thing to do, or whether it's necessary. &amp;nbsp;The blocker makes the initiator better, because in order to do something new, the initiator knows they will have to pick their battles well, and to justify their enthusiasm with a business case that can sway the supporter and the observer. &amp;nbsp;In my opinion, a manager should be the observer, but can play a bit of a supporter role as well. &amp;nbsp;A manager who is a blocker won't get very far, and a manager who is an initiator can be seen as a little too gung-ho or overzealous by their employees. &amp;nbsp;As an observer, the manager can interject when they see fit, shaping the way that the work evolves without forcing their will on anyone. &amp;nbsp;This makes for happy employees.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;It's just interesting because my office now sort of fits this dynamic, and the give and take is really great. &amp;nbsp;Coming from other places where the balance was definitely lacking, I think it's a great place to really grow. &amp;nbsp;Blockers can become more open to new ideas, and initiators can learn to harness their enthusiasm and be more thorough.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8931738970521666746?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8931738970521666746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8931738970521666746'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/12/on-intiators-blockers-supporters-and.html' title='On Intiators, Blockers, Supporters, and Observers'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5135652602861186649</id><published>2009-12-03T18:49:00.000-07:00</published><updated>2009-12-03T18:49:09.421-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>What's That You're Reading??</title><content type='html'>&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;I realized it's been a while since I shared what I had been reading, what was good, and what wasn't so good. &amp;nbsp;I have been doing a fair amount of reading despite being pretty busy.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;What I've read so far:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/006135323X?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=006135323X"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Predictably Irrational: The Hidden Forces That Shape Our Decisions&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=006135323X" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;&amp;nbsp;- This was a fantastic read about why people do silly things. &amp;nbsp;It's a discussion, reinforced by a series of fascinating and simple experiments, about how the human mind is wired to do things that just plain don't make sense. &amp;nbsp;What makes this one really good is Dan Ariely's easygoing writing style and the fact that the experiments were so well explained. &amp;nbsp;It was a really quick read, spanning only about 5 train rides, but it's the kind of book you could easily go back to a few times and get something out of it again and again.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0385530609?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0385530609"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Sway: The Irresistible Pull of Irrational Behavior&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&amp;nbsp;- I liked Predictably Irrational so much that I went ahead and bought this one.&lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0385530609" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;&amp;nbsp;This is along the same lines as Predictably Irrational, and in fact cites that book a few times. &amp;nbsp;It's even shorter and a quicker read than Predictably Irrational, but takes a bit different tack on irrational behavior, by describing a real-life situation, then illustrating the forces that drive the irrational behavior using experiment results. &amp;nbsp;I especially liked the section describing people who are 'initiators, blockers, and observers', which I'll talk about more in another forthcoming post.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0812975219?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0812975219"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Fooled by Randomness: The Hidden Role of Chance in Life and in the Markets&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0812975219" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- Don't read this book. &amp;nbsp;The ideas in it are fine. &amp;nbsp;Randomness is all around us, and anyone who thinks they can take on the gravity of randomness is a fool, and will be ruined. &amp;nbsp;Good premise I suppose. &amp;nbsp;Unfortunately the author spends roughly 200 pages of the book describing how smart he is compared to the rest of the world, and how everyone else is a buffoon who just doesn't get it. &amp;nbsp;Right or wrong, man is he ever pompous, and it poisons what could be a pretty insightful book.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/080508861X?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=080508861X"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;The Day of Battle: The War in Sicily and Italy, 1943-1944 (Liberation Trilogy)&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=080508861X" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- I finally finished this tome about the Allied campaign in Italy in WW2. &amp;nbsp;Good gracious, if you read this book, you will be taken aback by some of the horrors of low-tech warfare. &amp;nbsp;It's amazing that people had to go through some of the things that were forced upon these soldiers by ambitious officers and politicians, and it's AMAZING that the Allies won with all the blunders they committed during this war. &amp;nbsp;It is a true testament to the courage and grit of the Allies that they could overcome this. &amp;nbsp;This is a really well-written and well-researched book, with much of the narrative coming through letters and diary entries from enlisted men up to General Patton himself. &amp;nbsp;Fascinating book. &amp;nbsp;I recommend it highly to any of my fellow history buffs!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/B001PTG4BO?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001PTG4BO"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Long Tail, The, Revised and Updated Edition: Why the Future of Business is Selling Less of More&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001PTG4BO" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- This is an interesting book by the editor of Wired about how the Internet and e-commerce have changed the way people buy and sell things. &amp;nbsp;I was expecting something earth shattering, but I think the ideas in the book have been out there for so long that I kind of felt like I had already read the book. &amp;nbsp;Good, quick read, nonetheless.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0553212419?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0553212419"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;Sherlock Holmes : The Complete Novels and Stories (Bantam Classic) Volume I&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0553212419" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- Ah, I can reread these over and over again and never get tired of them. &amp;nbsp;Anyone who hasn't read these should, and probably won't help but enjoy them.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0061492183?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0061492183"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;1434: The Year a Magnificent Chinese Fleet Sailed to Italy and Ignited the Renaissance (P.S.)&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0061492183" style="border: none !important; margin: 0px !important;" width="1" /&gt;&amp;nbsp;- This is the 'sequel' to 1421, which I talked about &lt;/span&gt;&lt;a href="http://kirkgsworld.blogspot.com/2008/07/suck-of-sick.html"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;a while back&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;. &amp;nbsp;The premise here, building upon the idea that the Chinese fleet led by the great Admiral Zheng He sailed around the world, is that the Chinese made visits to Venice and Florence in 1434, passing on great quantities of information that helped to spur the Renaissance. &amp;nbsp;There are endless references to ideas that European thinkers of the time passed off as their own, but are obviously based on something from China that had been invented decades if not centuries before the Europeans did it. &amp;nbsp;This book is not written as well as 1421, but was full of thought-provoking stuff. &amp;nbsp;It came across as more of a transcription of a bunch of notes rather than a well-written book.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;What I am reading right now:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.amazon.com/gp/product/0061767905?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0061767905"&gt;The Map That Changed the World: William Smith and the Birth of Modern Geology (P.S.)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0061767905" style="border: none !important; margin: 0px !important;" width="1" /&gt; - A book by the author of 'The Professor and the Madman', this is a book about the life and times of the man behind the modern science of geology.  So far so good.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.amazon.com/gp/product/0812974530?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0812974530"&gt;The Whiskey Rebels: A Novel (Random House Reader's Circle)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0812974530" style="border: none !important; margin: 0px !important;" width="1" /&gt; - I have already read David Liss' other three historical fiction works, and loved each of them.  This one moved away from his previous books, which centered around European Jews, and is set against the backdrop of early America the Whiskey Rebellion.  It's excellent so far, and I enjoy the way it's written, trading chapters between the two main characters in the book, whose circumstances bring them closer to an intersection.  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.amazon.com/gp/product/0375724982?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0375724982"&gt;Eating in the Dark:  America's Experiment with Genetically Engineered Food&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0375724982" style="border: none !important; margin: 0px !important;" width="1" /&gt; - This is a so-far reasonably interesting book about the way that genetically engineered food made a sly entrance into our lives and onto the shelves of our grocery stores.  There is no denying the bias of the author, but she manages to include some arguments from both sides in this slightly frightening book.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;What's in the queue:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.amazon.com/gp/product/0679744398?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0679744398"&gt;All the Pretty Horses (The Border Trilogy, Book 1)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0679744398" style="border: none !important; margin: 0px !important;" width="1" /&gt; - If I like this one as much as 'The Road', then I'll be a happy camper.  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;a href="http://www.amazon.com/gp/product/0805087249?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0805087249"&gt;An Army at Dawn: The War in North Africa, 1942-1943, Volume One of the Liberation Trilogy&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0805087249" style="border: none !important; margin: 0px !important;" width="1" /&gt; - I liked the book about Italy so much I bought the prequel to it.  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5135652602861186649?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5135652602861186649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5135652602861186649'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/12/whats-that-youre-reading.html' title='What&apos;s That You&apos;re Reading??'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-887204783870920791</id><published>2009-11-25T09:44:00.000-07:00</published><updated>2009-11-25T09:44:05.180-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comedy'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Sarah Palin vs the Spring Framework</title><content type='html'>Read &lt;a href="http://doodleplex.com/glassmaze/sarah-palin-interviews-for-a-job/"&gt;this brilliant post&lt;/a&gt; by my friend Ramsey.&amp;nbsp;&lt;a href="http://doodleplex.com/glassmaze/"&gt;His blog&lt;/a&gt; is full of such outstanding writing. &amp;nbsp;Just hilarious reading for any software developer and politics follower. &amp;nbsp;Well done, Ramsey!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-887204783870920791?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/887204783870920791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/887204783870920791'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/11/sarah-palin-vs-spring-framework.html' title='Sarah Palin vs the Spring Framework'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6665297600984347664</id><published>2009-11-24T08:24:00.000-07:00</published><updated>2009-11-24T08:24:35.750-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idiots'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Lou Dobbs for President?</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Really? &amp;nbsp;Lou Dobbs? &amp;nbsp;Gah!!!!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I advise that everyone who likes their life and doesn't want it to get way worse needs to figure out how they can help to keep this from happening. &amp;nbsp;On the bright side, this guy would actually be accountable for once. &amp;nbsp;Instead of just spouting off about how everyone else is an idiot, he might have to propose a better idea, and I am NOT talking about building 50 foot high walls on our borders, Mr Dobbs...&lt;br /&gt;&lt;br /&gt;Clown.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6665297600984347664?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6665297600984347664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6665297600984347664'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/11/lou-dobbs-for-president.html' title='Lou Dobbs for President?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-29218906001074213</id><published>2009-11-19T12:21:00.000-07:00</published><updated>2009-11-19T12:21:31.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idiots'/><title type='text'>When News Really Isn't News</title><content type='html'>Just some quick snark: &lt;br /&gt;&lt;br /&gt;I logged onto CNN today to check and make sure I wasn't missing any catastrophic after three hours of meetings in the morning. &amp;nbsp;Here is what I was met with:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: #9a9a9a; font-family: arial, Helvetica, Utkal, sans-serif; font-size: 11px; font-weight: bold; line-height: 14px;"&gt;&lt;a href="http://www.cnn.com/2009/SHOWBIZ/11/19/nicole.richie.hospitalized/index.html" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #004276; font-family: inherit; font-size: 11px; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: baseline;"&gt;Nicole Richie has pneumonia&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: #9a9a9a; font-family: arial, Helvetica, Utkal, sans-serif; font-size: 11px; font-weight: bold; line-height: 14px;"&gt;&lt;a href="http://www.cnn.com/2009/CRIME/11/19/walmart.trial/index.html" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #004276; font-family: inherit; font-size: 11px; font-style: inherit; font-weight: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none; vertical-align: baseline;"&gt;Rift over Wal-Mart checkout scuffle&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;I can't really say I know much about the business of internet news, but really? &amp;nbsp;A fight at a Wal-Mart and a b-to-c-list celebrity who has a cold? &amp;nbsp;What's next? &amp;nbsp;Reporting the biggest loser competitors have athlete's foot? Not that great. &amp;nbsp;I think my Facebook feed has more insightful topics than this. &amp;nbsp;That is all.&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: #9a9a9a; font-family: arial, Helvetica, Utkal, sans-serif; font-size: 11px; font-weight: bold; line-height: 14px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman'; font-size: medium; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-29218906001074213?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/29218906001074213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/29218906001074213'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/11/when-news-really-isnt-news.html' title='When News Really Isn&apos;t News'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-318532862398501789</id><published>2009-11-13T11:09:00.002-07:00</published><updated>2009-11-13T11:12:55.078-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metro'/><category scheme='http://www.blogger.com/atom/ns#' term='denver'/><category scheme='http://www.blogger.com/atom/ns#' term='dc'/><title type='text'>On Public Transit</title><content type='html'>Today the train was one minute late.  I actually felt like maybe &lt;i&gt;&lt;b&gt;I&lt;/b&gt;&lt;/i&gt; did something wrong because the train wasn't on time.  Did I not check the schedule closely enough?  Was my watch wrong?  Then the train came at 7:20 instead of 7:19.  I still got off at 7:46 like always.  At some point between Pepsi Center and Belleview, the cosmos righted itself.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To compare, &lt;a href="http://crowebar.blogspot.com/2009/11/train-people-from-middle-earth.html"&gt;this&lt;/a&gt; is what I escaped.  To quote, the Metro is:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; "&gt;&lt;blockquote&gt;just one big, damn, anonymous hurry&lt;/blockquote&gt;This article highlights much of what is wrong with the metro, but didn't even get into the DC subway system's frustrating inability to move people from one stop to another reliably.  Just another reason I am happy we escaped.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-318532862398501789?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/318532862398501789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/318532862398501789'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/11/on-public-transit.html' title='On Public Transit'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-926340548932966937</id><published>2009-10-14T22:20:00.005-06:00</published><updated>2009-10-15T08:02:21.521-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='denver'/><title type='text'>Notes on Denver</title><content type='html'>&lt;div&gt;Here are some initial impressions on my new home city:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;1) When you are used to driving in Washington, DC, driving in Denver seems so orderly.  There are precious few diagonal streets, no circles to speak of, and no squares.  I don't miss Pierre L'Enfant's creation one bit!&lt;div&gt;2) Traffic here is relative.  I was moving at 25-30mph the other day and heard the folks on the radio cite bad traffic where I was.  Back in DC, bad traffic meant turn around and go back where you came from.  This is not bad.&lt;/div&gt;&lt;div&gt;3) It was 17 degrees here on Saturday.  In October.  Also, it snowed twice last week.  I am not sure it snowed twice last year in DC.  All year.&lt;/div&gt;&lt;div&gt;4) There are many delicious Colorado beers.  I could spend a great deal of time making my way through all the beers made by Avery, New Belgium, Odell's, Boulder Beer, Breckenridge, etc, and I plan to do so.&lt;/div&gt;&lt;div&gt;5) You have to water your plants approximately 4 times a week here.  It's challenging to keep up with this.&lt;/div&gt;&lt;div&gt;6) People here are oddly friendly.  We actually went to a Home Depot twice and left both times feeling like we were emerging from an alternate universe where the employees are friendly and helpful, the parking lot tranquil, and the store both organized and not overfull.  &lt;/div&gt;&lt;div&gt;7) They close the highways here when it snows.  I don't remember too many road closings back in DC when it actually snowed.  That almost kept us from getting to the airport this weekend.&lt;/div&gt;&lt;div&gt;8) Sunflower Farmers Market is the greatest grocery store in the history of grocery stores.  No matter what you buy, the final bill is no more than $40.  So awesome.  &lt;/div&gt;&lt;div&gt;9) I suppose that eventually I might take it for granted, but man is it incredible to look out the window while driving and see the Rockies.  &lt;/div&gt;&lt;div&gt;10) The light rail here is pleasant to ride.  They have a schedule, and the trains come on schedule.  It's as different as can be from the Metro in DC - the main similarity is that they are both trains.  Past that, you wouldn't really find too many parallels.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More to come.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-926340548932966937?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/926340548932966937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/926340548932966937'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/10/notes-on-denver.html' title='Notes on Denver'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1243949777456673174</id><published>2009-10-14T22:09:00.002-06:00</published><updated>2009-10-14T22:14:00.464-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>When Stupid Attacks (.bat file edition)</title><content type='html'>I'd just like to point out that today I spent about 3 hours trying to write a Windows batch file to do some string replacement.  This script is only for developers and development machines.  The same script took me seriously less than 5 minutes for Linux.  Why so hard on Windows?  Because their scripting environment sucks.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, I stuck it out.  I wrote a long and scary script that tried to take into account empty lines, commented lines, and lines that actually stores the properties that I wanted to write.  I got something that worked 'mostly', and thought about spending even more time on it when I finally stopped being stupid and decided that I should be using the &lt;a href="http://gnuwin32.sourceforge.net/packages/sed.htm"&gt;Windows port of sed&lt;/a&gt;.  It was one of those times that I just wasn't thinking clearly in my haste to write some code.  Just a friendly reminder - if it's hard and feels like a hack, it's probably the wrong thing to do, and there's probably something smarter to do - sometimes you just have to take a step back to do it.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1243949777456673174?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1243949777456673174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1243949777456673174'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/10/when-stupid-attacks-bat-file-edition.html' title='When Stupid Attacks (.bat file edition)'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-732690755043827638</id><published>2009-10-06T14:20:00.003-06:00</published><updated>2009-10-06T14:20:57.790-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='denver'/><title type='text'>Denver!</title><content type='html'>&lt;div style="text-align: left; "&gt;Well, here I am writing to you from Denver, Colorado. At the start of September, I was unemployed, living with my in-laws in Maryland, doing a lot of odds and ends, but generally spinning my wheels. Fast forward to October. After three days on the road, through rain, wind, and farms, we arrived here in the Rockies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/Ssufx-vUBWI/AAAAAAAAAIc/UobZA4Jf4xE/s320/newhouse.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5389577060082779490" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 240px; " /&gt;&lt;/div&gt;&lt;div style="text-align: center; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;This is our new house. So far we love it. It's in a great neighborhood close to restaurants and shopping, a couple miles from the light rail, and near a bunch of grocery stores etc. It's kind of empty right now, as we endeavor to spend all of our money filling it with furniture, but so far it's awesome. There are some things that will take getting used to, like having a yard for the first time since high school, which is great, but which requires foreign activities like lawn mowing and hedge trimming. Also, in Denver you have to drink 700 glasses of water every day or else you dry up and turn into dust, which is a decent trade-off compared to humidity. It's also supposed to snow this weekend (IT'S OCTOBER!!!), but in DC it never snows, if you don't count 1.5 inches of ice every other year.&lt;/div&gt;&lt;div style="text-align: left; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left; "&gt;All in all, we are pretty damned excited to get our life here underway. We miss all of our friends and family back east, but we encourage them to visit early and often, but not too early, as we have no guest mattress yet =)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-732690755043827638?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/732690755043827638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/732690755043827638'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/10/denver.html' title='Denver!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_yrO-Y2qwU_A/Ssufx-vUBWI/AAAAAAAAAIc/UobZA4Jf4xE/s72-c/newhouse.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8356414534402277390</id><published>2009-09-04T08:14:00.004-06:00</published><updated>2009-09-04T10:27:36.167-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='harwell'/><category scheme='http://www.blogger.com/atom/ns#' term='sad'/><category scheme='http://www.blogger.com/atom/ns#' term='baseball'/><title type='text'>Sad</title><content type='html'>&lt;a href="http://detroitnews.com/article/20090904/SPORTS0104/909040378/Ernie-Harwell--91--has-incurable-cancer"&gt;Ernie Harwell has incurable cancer&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is awful news.  For anyone who counts themselves a rabid baseball fan, Ernie Harwell is a household name.  He is a Hall of Fame broadcaster who endeared himself to Tigers fans throughout the years with his 42 years of wonderful play-by-play, captivating stories, and that voice that was &lt;i&gt;made &lt;/i&gt;for radio.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SqEj9k1G-NI/AAAAAAAAAIU/lJc-DZh1SaI/s1600-h/Ernie-Harwell_2.5inht.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 107px; height: 160px;" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SqEj9k1G-NI/AAAAAAAAAIU/lJc-DZh1SaI/s320/Ernie-Harwell_2.5inht.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5377618970822506706" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;I spent many a night listening on the little beat-up Zenith my dad bought when stationed in Korea, as Ernie guided us through the game, never talking too much, never too little, always letting the game and park speak through the radio.  My father and I listened most every night to those games.  I was allowed to stay up way past my bedtime those nights.  Ernie Harwell was a huge part of many of my fondest memories growing up.  It's not often that 'celebrity news' really upsets me, but this article definitely caught me.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Every year at the beginning of spring training, Ernie Harwell would open the broadcast with this quote, from Song of Solomon:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"   style="  font-style: italic; line-height: 19px; font-family:-webkit-sans-serif;font-size:13px;"&gt;&lt;blockquote&gt;For lo, the winter is past, the rain is over and gone; the flowers appear on the earth; the time of the singing of birds is come, and the voice of the turtle is heard in our land.&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Thank you for everything, Mr. Harwell.  I hope your remaining time here is wonderful as can be, and that you will enjoy all that you deserve after you leave us.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  font-style: italic; line-height: 19px; font-family:-webkit-sans-serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8356414534402277390?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8356414534402277390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8356414534402277390'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/09/sad.html' title='Sad'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yrO-Y2qwU_A/SqEj9k1G-NI/AAAAAAAAAIU/lJc-DZh1SaI/s72-c/Ernie-Harwell_2.5inht.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6847150761462234141</id><published>2009-08-26T06:08:00.004-06:00</published><updated>2009-08-26T06:16:45.030-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='idiots'/><category scheme='http://www.blogger.com/atom/ns#' term='jobs'/><title type='text'>How to Spot a Bad Job</title><content type='html'>As someone who is very recently familiar with working at a terrible place for a terrible person, I have been much more diligent about trying to spot 'TERRIBLE JOBS' by closely reading job descriptions.  I recently saw this posting in one of the groups I am a member of on LinkedIn:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; color: rgb(51, 51, 51); font-size: 13px; line-height: 15px; "&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Arial; color: rgb(51, 51, 51); font-size: 13px; line-height: 15px; "&gt;SIGNON BONUSES OFFERED!!! $7,000EMPLOYEEREFERRALBONUS!!! FREE 42 INCH HDTV FOR THE FIRST FIVE QUALIFIEDHIRES!!!&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/blockquote&gt;Now, the first clue is the endless litany of capital letters.  Another hint would be the lack of spaces.  We could perhaps attempt to attribute that to the formatting of LinkedIn postings, but it certainly speaks to a lack of detail orientation.  Finally, we look past appearances to the meat of the content.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Signon bonuses offered&lt;/div&gt;&lt;div&gt;2) $7,000 employee referral bonus&lt;/div&gt;&lt;div&gt;3) Free TV for the first five hires???&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This screams a few things to me.  One, someone promised the government that some work could get done before having any sort of cohesive plan to staff this project.  Two, in this economy if you have to pay a signing bonus and you aren't Google or Apple or Amazon, then your job must really be unattractive.  Three, wow, a new TV?  Really?  Does this company just have some TVs laying around that they want to give away?  If so why?  Does this not reek of used car salesmanship?  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyone who responded to this job ad must really not care where they work.  If this project is so haphazardly put together that they are throwing money and TVs at the first five people to show up to work, how crazy do you think it will be when you get there!  Too crazy, I should think, to have much time left in the evenings to watch your fave program on that big screen tv.  Good luck filling those positions.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6847150761462234141?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6847150761462234141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6847150761462234141'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/08/how-to-spot-bad-job.html' title='How to Spot a Bad Job'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-4465011330735705459</id><published>2009-08-11T10:33:00.003-06:00</published><updated>2009-08-26T06:05:57.866-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='colorado'/><title type='text'>Here We Go</title><content type='html'>Well, in continuing with my bad blogging, I haven't written much lately.  I'm back.  Our stuff is in the POD, and it's sitting somewhere in a (hopefully) safe place, waiting to make its journey to Denver.  Now we are living with Jena's parents, waiting to make our journey!  Coming from someone who could possibly be Arlington, VA's biggest proponent, I can't believe I am leaving the area.  I loved growing up here.  I loved the diversity, the green spaces, the seasons, and the people that I grew up with.  This is the only place I have ever been - the only place I have ever called home.&lt;br /&gt;&lt;br /&gt;That's all changing.  We are going to Denver, CO, to get away from the East Coast hustle and bustle, to avoid weekend traffic jams, to hike around in the mountains, to be tourists every weekend, and to get a fresh start.  It's sad to leave all my friends who remain here in DC, but I trust that they will be visiting our new digs.&lt;br /&gt;&lt;br /&gt;Moving is stressful.  There are a lot of moving parts to orchestrate, not least of which is actually selling your house.  Especially in this market, you have to try to deal with timing a sale of your house with the ability to find a job and a new place to stay at your destination.  Once you have actually sold the house, you get new responsibilities, like inventorying your stuff, sorting, packing, closing out accounts, updating addresses, dealing with home inspections, performing repairs, signing papers, etc.  Then you have to take all your stuff and fit it in a truck.  It's a lot of work.  There is a reason that moving falls under 'most stressful life events'.  I am a pretty laid back dude, and must admit that I have actually lost sleep over this stuff. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, a trip last week to Colorado fixed all that.  I got a new job out in Denver and found a great new house to rent.  Things are looking up.  I start working from here next week, the lease is signed, and things are definitely coming together.  30 days from today, Jena and I are going to get in the car and start a crazy journey.  I can't wait.  Well, I can't wait to do all the stuff that happens after we unpack =).&lt;br /&gt;&lt;br /&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/3444412265952661654-4465011330735705459?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4465011330735705459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4465011330735705459'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/08/here-we-go.html' title='Here We Go'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8989898312061422956</id><published>2009-07-02T08:32:00.003-06:00</published><updated>2009-07-02T08:41:28.784-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fbconnect'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Facebook Connect Users Beware!!!</title><content type='html'>We just ran across a bug that must have been introduced very recently, where all users with new Facebook accounts were unable to access our application when 'connect'-ing their user name to Facebook.  It was a weird issue, because I was able to connect my account with no issue.  I finally noticed that the Facebook profile ID we were storing was the same across all users who were running up against this issue. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Truncation issue!&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;We had defined it as a 12-length INT, which really doesn't matter - the biggest value an INT can store in MySQL is 2147483647.  Anyhow, updating the table to store the value as a BIGINT fixed the problem, but I can't image we're the only ones to run across this mess, and the FB Connect documentation is weak enough that I have never seen anything about suggested storage.  This must have happened in just the last few days, so hopefully others will come across this and make the change proactively if needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8989898312061422956?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8989898312061422956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8989898312061422956'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/07/facebook-connect-users-beware.html' title='Facebook Connect Users Beware!!!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6070970951296316307</id><published>2009-07-01T20:34:00.003-06:00</published><updated>2009-07-01T20:46:37.052-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>What's That You're Reading?</title><content type='html'>I've done a fair bit of reading - I finished &lt;a href="http://www.amazon.com/gp/product/0307386422?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0307386422"&gt;The Lost City&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=0307386422" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, which was great until the end, which included a hallucination sequence that left me as confused as the afflicted character.  Really a poor end to a well-told tale. &lt;br /&gt;&lt;br /&gt;I also knocked through &lt;a href="http://www.amazon.com/gp/product/B000WJS9RA?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000WJS9RA"&gt;The Conscience of a Liberal&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=B000WJS9RA" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, by Paul Krugman.  I can say that I didn't expect to like or agree with this book, and for the most part I don't.  Krugman is obviously a smart guy, and a pretty good writer, but there are certain statements in the book that are just so obviously laced with blind left slant that they seem to erode the general credibility of the message.  One such passage describes the potential for vote-rigging and how this means the Republicans could steal elections.  Is this not true for Democrats as well?!  Anyone been to Chicago lately??  This is a shame, because much of the book is solid and somewhat eye-opening.  I must admit to having my view on public health care softened somewhat by his well-written chapter on national health insurance.  Overall it was worth my time to read this one.&lt;br /&gt;&lt;br /&gt;After that, I read George Pelecanos' '&lt;a href="http://www.amazon.com/gp/product/0316040924?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0316040924"&gt;The Turnaround&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=0316040924" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;'.  This was another in a long line of dark tales set in the DC area.  This one wasn't AS dark as usual, and actually had a pretty happy ending, which was kind of refreshing.  This is a good tale about family, responsibility, and moving forward in life by facing the past.  I love pretty much all his books, but I particularly enjoyed this one.&lt;br /&gt;I then read James Patterson's '&lt;a href="http://www.amazon.com/gp/product/B000FA5Q2M?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000FA5Q2M"&gt;1st to Die&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=B000FA5Q2M" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;', which was a good book.  Sometimes I have to read a fluffy mystery thriller here and there, and this fit the bill.  I finished it in a couple days.  Not great not bad.&lt;br /&gt;&lt;br /&gt;On the plane rides to and from SD, I was able to push through another David Baldacci book, &lt;a href="http://www.amazon.com/gp/product/0446611778?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0446611778"&gt;Last Man Standing&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=0446611778" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, which was a standard fluffy mystery book.  Always enjoyable and fun stories in my opinion.&lt;br /&gt;&lt;br /&gt;Finally, on the way back, I read Clay Shirky's '&lt;a href="http://www.amazon.com/gp/product/B0027VT0C4?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0027VT0C4"&gt;Here Comes Everybody&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=B0027VT0C4" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;'.  This was a good follow-up to Don Tapscott's '&lt;a href="http://www.amazon.com/gp/product/B000QBYEH8?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000QBYEH8"&gt;Wikinomics&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=B000QBYEH8" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;'.  It's about the power of decentralized knowledge, and how the new technological advances have made barriers to entry for previously hard-to-breach industries so much lower.  It was a good read, with a little more hard-core sociology to it rather than anecdotal tales that were the basis of Wikinomics.  I'll probably check out the Long Tail pretty soon as the final word on this sort of 'new economy' reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6070970951296316307?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6070970951296316307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6070970951296316307'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/07/whats-that-youre-reading.html' title='What&apos;s That You&apos;re Reading?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-240858331102234202</id><published>2009-07-01T20:00:00.002-06:00</published><updated>2009-07-01T20:37:05.513-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>Who's Got Two Thumbs and Sucks at Blogging Lately</title><content type='html'>This guy.&lt;br /&gt;&lt;br /&gt;Seriously, I have been a terrible blogger.  After really hitting my stride earlier in the year, I find myself with less and less to write lately.  Part of it is being just plain busy.  Part of it is that it's summer and there is more other stuff going on.  Part of it is me just being lazy.&lt;br /&gt;&lt;br /&gt;Here's something to write about.  Going from someone who is strictly a server-side Java developer who is far more comfortable with tools and databases to someone who writes PHP and uses CSS and HTML to create new pages has been interesting, maddening, and definitely a big change.  I finally felt like an expert at something (Java Web Development), and wham - back to the beginnings.  Obviously the core concepts of software development carry over, but everything else is different.  The good news has been that the codebase I am working with is pretty solid and easy to learn.  The bad news is that it's still WAY different from what I am used to.  It's hard for me to write a blog post about PHP with a straight face - who the hell I am to try to talk about something I am just learning?  It has been a humbling experience, but one that I recommend - in order to really understand this web app stuff, you almost have to use different languages and platforms just to stay on top of your game.&lt;br /&gt;&lt;br /&gt;I really have been busy - I wasn't lying about that.  We have been doing a lot of family stuff (Jena's cousin's daughter's first birthday party, sailing with Jena and her parents), bought fresh herbs, hung out with some friends at a DC United game, and we just got back from a quick trip to San Diego for Jena's friend's baby shower.  Check out &lt;a href="http://kirkandjena.com/photos/main.php?g2_itemId=5335"&gt;the pictures&lt;/a&gt;.  It was my first time in Southern California - it's a beautiful place, with very striking geography and lovely weather.  We spent some time exploring the city of San Diego, walking around in La Jolla, and hiking around Torrey Pines.  I can say that the view from the dorms at UC-San Diego is probably a little better than the view from Eagle Hall in Harrisonburg, VA - who the hell has a dorm room with a view of the Pacific Ocean!?!?  Wow.  The shower was great.  The parents-to-be and family are extremely excited, and everyone had a wonderful time stuffing their face and watching gifts get opened. &lt;br /&gt;&lt;br /&gt;I really hope to get back to technical blog posts - what's heartening is that this sorry little blog still gets dozens of hits each day - it's nice to know that hopefully people are finding this blog and getting an answer to some obscure question they had about something technical.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-240858331102234202?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/240858331102234202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/240858331102234202'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/07/whos-got-two-thumbs-and-sucks-at.html' title='Who&apos;s Got Two Thumbs and Sucks at Blogging Lately'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6981631255385502278</id><published>2009-06-18T07:33:00.002-06:00</published><updated>2009-06-18T07:37:17.058-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='suck'/><title type='text'>MyIEFlashSpace</title><content type='html'>So, as if it weren't ridiculous enough that I am stuck trying to get Flash widgets to link out of Myspace in IE (seemingly impossible), now this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;This profile is undergoing routine maintenance.  We apologize for the inconvenience!&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/blockquote&gt;Apparently all the things I did wrong in my past are coming back to haunt me for this one horrible assignment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6981631255385502278?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6981631255385502278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6981631255385502278'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/06/myieflashspace.html' title='MyIEFlashSpace'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1222466968409381886</id><published>2009-06-01T17:47:00.009-06:00</published><updated>2009-06-01T18:18:21.950-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>The What!</title><content type='html'>I have been lucky enough to have a couple of great weekends in a row. Last week we spent time with Jena's family, and our crazy nephew William.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SiRp24sqnYI/AAAAAAAAAG8/neHwmcPNXsk/s1600-h/P5230010.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SiRp24sqnYI/AAAAAAAAAG8/neHwmcPNXsk/s320/P5230010.JPG" alt="" id="BLOGGER_PHOTO_ID_5342511449621831042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We did a harbor cruise in Annapolis (William even got to drive the boat!), had a delicious dinner, woke up, went down to Annapolis for brunch, then spent the rest of the day golfing and chasing after William. While I didn't play too well, the weather was great, and it's always good to hit the links with my awesome in-laws, and Jena's parents' neighbor Bill.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SiRphZ12QWI/AAAAAAAAAG0/iKRMRpdHGyY/s1600-h/P5230032.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SiRphZ12QWI/AAAAAAAAAG0/iKRMRpdHGyY/s320/P5230032.JPG" alt="" id="BLOGGER_PHOTO_ID_5342511080561590626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Monday we went and watched Angels and Demons, which I thought was pretty good, and certainly better than the adaptation of the Da Vinci Code, which was a good book and terrible movie in my opinion.  We then went over to Archie's house to see everyone, and Jena got to hang out with young Alexander again for the first time in a while.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SiRrq5vXtlI/AAAAAAAAAHE/LV5zs7EvEVM/s1600-h/P5250001.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SiRrq5vXtlI/AAAAAAAAAHE/LV5zs7EvEVM/s320/P5250001.JPG" alt="" id="BLOGGER_PHOTO_ID_5342513442766435922" border="0" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div&gt;Then we had a short week of work, and this weekend, watched the Tigers Friday, then woke up early and got a bunch of stuff done around the house before heading out for a great bike ride.  Saturday was a beautiful day, and we found a sweet trail from my mom's house down to the trail along the GW Parkway.  After we got done riding, we then did a bit of shopping before heading home and making a delicious dinner, including oven-baked onion rings, which were delicious!  Then we watched the Tigers bounce back from tough losses Thursday and Friday, as Clete Thomas went yard twice.  Yes!&lt;br /&gt;&lt;br /&gt;Sunday, we hit the Tigers game at Camden Yards.  It was another great day, 80 and sunny.  We got some great seats, then took a little stroll around the Inner Harbor.  It was nice and breezy, but really didn't smell all that hot.  In fact, there were a ton of dead fish floating on the surface and that might have been the stinky source.  Makes me fear for the Bay.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SiRulP8DVxI/AAAAAAAAAHM/ywIeyl6pSUs/s1600-h/P5310014.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_yrO-Y2qwU_A/SiRulP8DVxI/AAAAAAAAAHM/ywIeyl6pSUs/s320/P5310014.JPG" alt="" id="BLOGGER_PHOTO_ID_5342516644180875026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We went back to the field and watched Edwin Jackson throw a gem, as the Tigers evened the series with a 3-0 win.  It's a great park, and it's always great to check out a Tigers game.  They used to come twice a year, and now it's down to once, what with the ridiculous unbalanced scheduling that they do now.  Grrrr.  Did I mention the fact that Edwin Jackson is awesome?  Well he is.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SiRvd2iiNrI/AAAAAAAAAHU/M6mC1g8nndI/s1600-h/P5310021.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SiRvd2iiNrI/AAAAAAAAAHU/M6mC1g8nndI/s320/P5310021.JPG" alt="" id="BLOGGER_PHOTO_ID_5342517616615503538" border="0" /&gt;&lt;/a&gt;Good times.  Great weekend.&lt;br /&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/3444412265952661654-1222466968409381886?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1222466968409381886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1222466968409381886'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/06/what.html' title='The What!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yrO-Y2qwU_A/SiRp24sqnYI/AAAAAAAAAG8/neHwmcPNXsk/s72-c/P5230010.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-4788527142709663259</id><published>2009-05-08T07:47:00.003-06:00</published><updated>2009-05-08T08:56:51.209-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Happiness is a Big Cup of Coffee and a Good Book</title><content type='html'>I always drink lots of coffee.  Fortunately for me, I have been reading a fair amount of good books lately, too:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0596529961?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596529961"&gt;Web 2.0: A Strategy Guide&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596529961" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; - This one is sort of a handbook for how to do the things that the big web 2.0 sites (Facebook, Flickr, Linkedin) have done, which by itself is not that helpful.  It would be like telling a football team to score more than the other team so they can win every game.  This book digs a bit deeper and breaks down the recipe for success so you can use the constructs and concepts even if you aren't really competing in a similar space.  I think it will be the kind of book I will re-read a few times just to spark my brain every so often.  The 'further reading' section is really great.  Tons of great follow-on reading for any of the topics make this book worthwhile by themselves.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/159448385X?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=159448385X"&gt;A Thousand Splendid Suns&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=159448385X" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; - Everyone knows about this one.  It's the 'highly anticipated follow-up' to the fabulous book The Kite Runner.  I found the Kite Runner to be an incredibly well-written story, and I love when books can be good stories while serving as a window into cultures I am unfamiliar with.  This book is no different, and if anything, the connection to the characters grows even stronger when reading this book.  It's a wonderful story, and a wonderful social history of the female experience in modern-day Afghanistan.  Reading this book will make you think a little deeper when you see stories of war being waged against the Taliban on the nightly news.  Wonderful book.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0307386422?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0307386422"&gt;The Lost City (Vintage Contemporaries)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=0307386422" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; - This one was sort of a random recommendation by Amazon, and it has turned out to be pretty interesting - the story of a British ex-army drifter trying to find himself in a quest to find a lost city in the Andes.  I am a bit more than half way through this one, and it is starting to get interesting.  Full ratings to come.&lt;br /&gt;&lt;br /&gt;I just started reading &lt;a href="http://www.amazon.com/gp/product/0812975219?ie=UTF8&amp;tag=kirswor0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0812975219"&gt;Fooled by Randomness: The Hidden Role of Chance in Life and in the Markets&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;l=as2&amp;o=1&amp;a=0812975219" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; by Nassim Nicholas Taleb.  The book the Black Swan came highly recommended by my friend Ramsey, but I figured I'd read this one first, just to be wild and crazy.  The introduction has already intrigued me.  I am excited to really get into this one.&lt;br /&gt;&lt;br /&gt;I am still working on The Wealth and Poverty of Nations.  I hope that my new longer metro ride will make my transit reading more fruitful.  I am also still creaking through my book on the Allied Campaign in Italy, but I am afraid that my progress through that book is as slow as the campaign itself!&lt;br /&gt;&lt;br /&gt;I have been on a bit of a book-buying spree lately, spurred by Amazon Gift Cards.  Here's what is in the queue:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0142001155?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0142001155"&gt;The Ruin of J. Robert Oppenheimer: And the Birth of the Modern Arms Race&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0142001155" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; - I thought this would be a good follow-up to the biography of him that I read.  He's such a brilliant and polarizing character.  Jena wonders if I am crazy buying this book since it took me about 9 months to read the giant biography of him.  She's probably right, but hey this one is way shorter!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0143114948?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0143114948"&gt;Here Comes Everybody: The Power of Organizing Without Organizations&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0143114948" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; - I have had numerous people suggest this book to me, so I caved.  These books are short and hopefully quick reads so even if they aren't profound works of genius, you can usually get a point or two out of them without putting too much effort in.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0393333132?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0393333132"&gt;The Conscience of a Liberal&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0393333132" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; - As a centrist, I thought I would read this one, then read a far-right manifesto.  I think this one should be especially interesting considering how fervently I have disagreed with Krugman's take on the banking system plans.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/006135323X?ie=UTF8&amp;amp;tag=kirswor0d-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=006135323X"&gt;Predictably Irrational: The Hidden Forces That Shape Our Decisions&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=kirswor0d-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=006135323X" alt="" style="border: medium none  ! important; margin: 0px ! important;" width="1" border="0" height="1" /&gt; - I thought this would be an interesting follow-up to 'Fooled By Randomness', and Amazon has been especially insistent in continuing to push this towards the top of my book recommendations, so I finally relented.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-4788527142709663259?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4788527142709663259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4788527142709663259'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/05/happiness-is-big-cup-of-coffee-and-good.html' title='Happiness is a Big Cup of Coffee and a Good Book'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7571006774227502197</id><published>2009-05-07T22:16:00.002-06:00</published><updated>2009-05-07T22:19:55.072-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Every Now and Then I Get Lightbulbs</title><content type='html'>I have a good idea (I think).  I have run an idea I had this morning by two people whose opinion I trust, and both of them seem to indicate that my idea is good, or at least good in principle, which is good enough for me.  I am pretty jazzed about it - I think it will be a good learning opportunity, a fantastic social sciences experiment, and potentially something that could do some good, so I am hoping I can get it right, and that it drives some interest!&lt;br /&gt;&lt;br /&gt;More about said idea when my thoughts crystallize a little more, and hopefully some samples as we go...also, things have settled down a bit, so hopefully a lot more blogging in general over the next few weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7571006774227502197?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7571006774227502197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7571006774227502197'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/05/every-now-and-then-i-get-lightbulbs.html' title='Every Now and Then I Get Lightbulbs'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-9000461419573810867</id><published>2009-05-07T21:50:00.003-06:00</published><updated>2009-05-07T21:52:38.757-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='media'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>There Are Really Stupid People...</title><content type='html'>&lt;a href="http://www.huffingtonpost.com/2009/05/07/hannity-attacks-obama-for_n_198851.html"&gt;And they work in the media.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Check that link, watch and listen to the legion of idiots, and then tell me what in the hell is wrong with these people?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-9000461419573810867?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/9000461419573810867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/9000461419573810867'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/05/there-are-really-stupid-people.html' title='There Are Really Stupid People...'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8893301848025537757</id><published>2009-05-07T06:08:00.004-06:00</published><updated>2009-05-07T07:59:23.346-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>Visiting the Grandparents</title><content type='html'>Well I am back from my trip to Indiana.  I went with my mom to go and see her parents, who are a couple of pretty amazing folks.  My grandfather just turned 93, and my grandmother is about to turn 91 in a couple of weeks.  Let me tell you - they are still going strong!  They have been married now for 71 years.  That's longer than most people live.  I know I have mentioned this before, but I still can't get over it.  Every time we go they complain about how they can't do the things that they used to, but they live by themselves still, and with the help of a few pretty great neighbors, get along quite well!  I regretfully didn't get any pictures on my trip, but here's a shot of them with my cousin Scott from our trip there for Christmas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SgLn6cv7BrI/AAAAAAAAAGU/yGzrvSb4CQ0/s1600-h/IMG_2253.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 393px; height: 524px;" src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SgLn6cv7BrI/AAAAAAAAAGU/yGzrvSb4CQ0/s320/IMG_2253.JPG" alt="" id="BLOGGER_PHOTO_ID_5333079900095710898" border="0" /&gt;&lt;/a&gt;Every night, before they go to bed, they kiss each other five times.  It's 'their tradition'.  Then grandma tells me that when I am married to Jena for 71 years, we have to have our little traditions too.  I think "Gee grandma, if I make 71 years of marriage, I'll be 101 - I don't think that's realistic", but watching them, you can see that if you live well, and love each other, then I suppose anything is possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8893301848025537757?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8893301848025537757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8893301848025537757'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/05/visiting-grandparents.html' title='Visiting the Grandparents'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_yrO-Y2qwU_A/SgLn6cv7BrI/AAAAAAAAAGU/yGzrvSb4CQ0/s72-c/IMG_2253.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7984274643188879012</id><published>2009-04-22T16:41:00.003-06:00</published><updated>2009-04-22T16:51:54.030-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='pictures'/><title type='text'>New Photos are Up</title><content type='html'>I finally got the photos from our awesome trip to Italy up on our website.  Anyone who wants to look can &lt;a href="http://bit.ly/LW3eM"&gt;check em out here&lt;/a&gt;.  I would post some favorites, but they are kind of my favorite, since it was such an awesome time.  Ok, one favorite:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://kirkandjena.com/photos/main.php?g2_view=core.DownloadItem&amp;amp;g2_itemId=4260&amp;amp;g2_serialNumber=2"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 640px; height: 480px;" src="http://kirkandjena.com/photos/main.php?g2_view=core.DownloadItem&amp;amp;g2_itemId=4260&amp;amp;g2_serialNumber=2" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7984274643188879012?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7984274643188879012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7984274643188879012'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/04/new-photos-are-up.html' title='New Photos are Up'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5931363765405309819</id><published>2009-04-19T15:35:00.002-06:00</published><updated>2009-04-19T15:41:49.302-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Like OMG!  Google App Engine Supports Java!  SHUT UP!!</title><content type='html'>Ever since last week's announcement that Google App Engine would officially support Java, there have been no less than 2,002,555,1111 blog posts and articles written on the subject.  Let this one be the one that says&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;WHO CARES&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seriously.  Who cares?  Has ever an announcement caused so much excitement?  This is hardly the most exciting thing to happen in the world of software.  It's someone announcing that their platform that isn't THAT exciting to begin with supports a hacked version of your language...color me less than exciting.  It's neat.  It's neat like the Macbook Air is neat.  Nobody needs it, and certainly I'd think that nobody needs to drop everything to create a tutorial for how every single framework in the whole world interacts with Google App Engine. &lt;br /&gt;&lt;br /&gt;It just seems like there are way better things to talk about.  I guess it's shiny thing syndrome, but I just don't see the big deal.  Google would probably counter by saying 'hey look at all the people excited about it - there must be something there!'.  I say, once the shine comes off of it, a new toy will likely replace the excitement around this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5931363765405309819?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5931363765405309819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5931363765405309819'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/04/like-omg-google-app-engine-supports.html' title='Like OMG!  Google App Engine Supports Java!  SHUT UP!!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7868266652000388306</id><published>2009-04-15T07:46:00.002-06:00</published><updated>2009-04-15T07:51:09.078-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Tip: MySQL and Timestamps as Integers</title><content type='html'>So, say you managed a legacy project, and on that project, they chose to store timestamps for creation dates in the database.  This is quite normal.  Now pretend that the timestamp was stored as a TIMESTAMP.  Still quite simple.  You want to get something after a certain date, just add WHERE CREATED_ON &gt;= '2009-02-01' to get everything February and after.  Now imagine that somebody who wrote this application chose instead to store this data as an INTEGER. &lt;br /&gt;&lt;br /&gt;This becomes a little more annoying, but not undoable - I had to do a bit of digging in the mysql manual, but here's the query:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;select id, first_name, last_name, created_on,  as create_date from members where &lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;FROM_UNIXTIME( created_on ) &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&gt;= '2009-02-01';&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Hope this helps others out there who suffer from badly designed database maintenance syndrome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7868266652000388306?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7868266652000388306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7868266652000388306'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/04/tip-mysql-and-timestamps-as-integers.html' title='Tip: MySQL and Timestamps as Integers'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-546667655813765077</id><published>2009-04-03T06:24:00.002-06:00</published><updated>2009-04-03T06:30:49.699-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><title type='text'>New Homepage is Up</title><content type='html'>Check out the new and improved &lt;a href="http://kirkandjena.com/"&gt;kirkandjena.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SdYBLpWtdGI/AAAAAAAAAF0/yCFKWmWeYic/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 465px; height: 297px;" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SdYBLpWtdGI/AAAAAAAAAF0/yCFKWmWeYic/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5320441309376115810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's no longer one sentence and a link on a white background!  I promise that the site will grow and improve as time passes.  I have the basic template done, but there is definitely more to add, like bios, resumes, a feed of pictures from our &lt;a href="http://kirkandjena.com/photos"&gt;gallery site&lt;/a&gt;, etc.  I also want to add an 'apps' area that I can use to show off any sort of nerdiness I do in the evenings.  This is a start, and not a bad one - it only took me a couple hours last night to do it.  Yay for websites!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-546667655813765077?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/546667655813765077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/546667655813765077'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/04/new-homepage-is-up.html' title='New Homepage is Up'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yrO-Y2qwU_A/SdYBLpWtdGI/AAAAAAAAAF0/yCFKWmWeYic/s72-c/Picture+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5166770143283950121</id><published>2009-04-02T11:43:00.002-06:00</published><updated>2009-04-02T11:46:23.207-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beer'/><category scheme='http://www.blogger.com/atom/ns#' term='baseball'/><title type='text'>Now This is Good News</title><content type='html'>&lt;a href="http://voices.washingtonpost.com/dcsportsbog/2009/04/the_beer_at_nats_park_this_sea.html?wprss=dcsportsbog"&gt;Dan Steinberg has clued us in&lt;/a&gt; to an exciting development at Nationals Park this year.  No, the Nats will not be good at baseball, but we will be able to drink delicious beer while we watch mediocre baseball:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Bottles:&lt;/strong&gt; Budweiser, Bud Light, Miller Genuine Draft, Miller Lite, Coors Light, Bell's Oberon American Wheat Ale, Harpoon Summer Ale.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Draft:&lt;/strong&gt; Peroni, Dogfish Head 90 Minute IPA, Bell's Kalamazoo Stout, Stone Arrogant Bastard Ale, Southampton Triple Abby Style Ale, Harpoon UFO Hefeweizen, Williamsburg Tavern Brown Ale, Flying Dog Old Scratch Amber Lager.&lt;/p&gt;&lt;/blockquote&gt;Thank you Stan Kasten for putting a quality product in my plastic cup, if not on the diamond!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5166770143283950121?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5166770143283950121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5166770143283950121'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/04/now-this-is-good-news.html' title='Now This is Good News'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3723661022388025472</id><published>2009-04-01T11:46:00.003-06:00</published><updated>2009-04-01T12:00:25.048-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>What's That You're Listening To?</title><content type='html'>Before I get to the original point of my post, let me just say that I can't stand April Fools' Day.  It's a stupid day.  I spend my entire day wondering if things people say to me, or things I read are legitimate.  How much time is wasted having to interpret every statement?  A lot I think.  Multiply that by 300 million people in the U.S., and you have a lot of wasted hours, say nothing of those wacky Canadians!  We can't afford this sort of inefficiency with the world economy in such a state.&lt;br /&gt;&lt;br /&gt;Here are some things I am not joking about:&lt;br /&gt;&lt;br /&gt;I have been wishing and waiting for Postal Service to make another record, since Give Up is one of my favorite albums of all time.  I don't know if they are listening, but fortunately we have some other artists out there to fill the void.  Thanks to Pandora, I was able to find Owl City and The Blow.  Both seem to be awesome upbeat synth-filled goodness that makes me feel like I am listening to really good 80s music without the absurd lyrics. &lt;br /&gt;&lt;br /&gt;Other music I am very into right now:&lt;br /&gt;&lt;br /&gt;MGMT - Oracular Spectacular&lt;br /&gt;Anything by M83&lt;br /&gt;Kings of Leon - damn they rock it out for shizzle&lt;br /&gt;Sigur Ros - so weird, yet so money&lt;br /&gt;&lt;br /&gt;I have also pulled the Pulp Fiction Soundtrack out of the dustbin.  Not only does it contain many incredible songs - it also reminds me very vividly about some ridiculously fun times that I had my senior year in high school centered around that movie and the soundtrack.&lt;br /&gt;&lt;br /&gt;I wish there was more time in the day, so that I could actually listen to all the music in my collection.  In my limited library on my Macbook, I would have to listen for 28 days to get through it all!  This is less than half of what I have!  Makes me want to take a sabbatical, go sit on a beach with a giant pair of headphones and just close my eyes and listen...for 9 or 10 weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3723661022388025472?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3723661022388025472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3723661022388025472'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/04/whats-that-youre-listening-to.html' title='What&apos;s That You&apos;re Listening To?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7873628509617169473</id><published>2009-03-31T12:57:00.004-06:00</published><updated>2009-03-31T13:01:51.311-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Romans, Calendars, Java, and Bad Bugs</title><content type='html'>Well, I learned today that Java is not smart enough to figure out that if there aren't 31 days in a month, just to go to the last day.  Now I may be the last self-respecting Java developer on the planet to figure this out, but if not, here's a tip:&lt;br /&gt;&lt;br /&gt;1) use the roll() method to push an element of the date forward, without affecting the other days. &lt;br /&gt;2) Don't instantiate your GregorianCalendar and then just add a month, because if you move to April 31, it automatically becomes May 1.  Instead, you can also just create a new Calendar with the day set to 1, and then new month set correctly. &lt;br /&gt;&lt;br /&gt;Java, you vex me so.  What a terrible bug by me.  And without the benefits of unit tests, not something I ever would have found out until we hit a 31st day of a month, or until we reached January and went into February with it's 28 days.  Sigh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7873628509617169473?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7873628509617169473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7873628509617169473'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/romans-calendars-java-and-bad-bugs.html' title='Romans, Calendars, Java, and Bad Bugs'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-376036950411355198</id><published>2009-03-31T12:43:00.002-06:00</published><updated>2009-03-31T12:56:28.838-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='baseball'/><title type='text'>Been A While</title><content type='html'>Well, it's been a few days since I've written, so here goes:&lt;br /&gt;&lt;br /&gt;It's SPRING!  One of the best things about working in this old dump of a subleased office is the fact that back in the 40s and 50s, the people who built these things used windows that open.  So today, as I sit here, my yearly allergies kicking in, I eagerly await Opening Day, the removal of all warm-weather clothing from my closet, and the ability to go for nice runs in the mornings, and long walks in the evenings with Jena.  Other things of note that are good about Spring:  grilling, drinking beer outside, longer days, and &lt;span style="font-weight: bold;"&gt;wearing flip-flops&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Not much to note.  I had a pretty great weekend, including walks through Georgetown and Eastern Market/Capitol Hill.  I got some nerding in, furthering my beliefs that Grails is &lt;span style="font-weight: bold;"&gt;just too easy&lt;/span&gt;.  I feel like I am stealing something when it takes me 45 minutes to write a slick messaging tool using a nice jQuery thickbox and a slick ajax post.  It's good.  In a couple weeks we are heading to our nephew's birthday party.  That will be very exciting for us, as we wish we could see them a lot more often. &lt;br /&gt;&lt;br /&gt;I finished the second Baldacci book that I was reading, Divine Justice, which was good as usual, and have moved on to &lt;a href="http://www.google.com/url?sa=U&amp;amp;start=1&amp;amp;q=http://www.amazon.com/Next-Michael-Crichton/dp/0060872985&amp;amp;ei=bWbSSdbILaCclQe3_OiGBw&amp;amp;usg=AFQjCNFi_AAfxwqysiTQtxdKcLxGYaKxNw"&gt;&lt;span style="font-style: italic;"&gt;Next&lt;/span&gt;&lt;/a&gt;, by Michael Crichton.  I always enjoy his stuff - even if it is a little odd and overblown sometimes, the pages really turn. &lt;br /&gt;&lt;br /&gt;In a great piece of news, bad baseball player and all around jerk &lt;a href="http://sports.espn.go.com/mlb/spring2009/news/story?id=4029706"&gt;Gary Sheffield was waived&lt;/a&gt; by the Detroit Tigers today.  He can take his lack of production, bad baserunning, terrible attitude, and gimpy shoulders elsewhere.  Ahh, hopefully now that the Tigers aren't saddled with expectations, they can pull some 2006 magic out of their hats and give me something good to watch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-376036950411355198?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/376036950411355198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/376036950411355198'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/been-while.html' title='Been A While'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5486028822119713419</id><published>2009-03-20T14:31:00.000-06:00</published><updated>2009-03-20T14:32:17.811-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Struts 2 Error Reporting Tips</title><content type='html'>As &lt;a href="http://kirkgsworld.blogspot.com/2008/05/struts-2-error-handlinghow-do-i-put-it.html"&gt;I wrote before&lt;/a&gt;, Struts 2 isn't the best framework for error handling or notification.  I think for the most part the entire framework is an incredible improvement over Struts 1, which had so many silly moving parts that just made it a genuine pain in the ass to work with.  Struts 2 is simple, and I take well to the Action-As-Bean pattern used here.  Moreover, it's what we use, so I had to learn to deal with the oddness of it.   Since I wrote that post, I have come up with/implemented a couple handy tricks:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Display the Error Details on the Error Page&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Obviously I didn't invent this, but we weren't doing it yet, so here's what I did:&lt;br /&gt;&lt;br /&gt;You will likely create a global error mapping.  In the action that you map to, add this code that will trap the error details:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;Throwable error = (Throwable) request.getAttribute("javax.servlet.error.exception");&lt;br /&gt;&lt;br /&gt;request.setAttribute( "errorCause", error.getCause().toString() );&lt;br /&gt;request.setAttribute( "errorMessage", error.getMessage() );&lt;br /&gt;request.setAttribute(  "errorStackTrace", error.getStackTrace() );&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Now you can insert a little line into your error page that shows the error, instead of having struts swallow it up forever.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;%= if ( request.getAttribute( "errorMessage" ) != null { %&amp;gt;&lt;br /&gt;&lt;br /&gt;-- print out the data --&lt;br /&gt;&lt;br /&gt;&amp;lt;% } %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Debug Better &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you get the source code for Struts 2, you can add it to your Eclipse project, and insert a breakpoint in the following piece of code in com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept():&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;public String intercept(ActionInvocation invocation) throws Exception {&lt;br /&gt;    String result;&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;        result = invocation.invoke();&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;&lt;br /&gt;        /* BREAKPOINT HERE */&lt;br /&gt;&lt;br /&gt;        if (logEnabled) {&lt;br /&gt;            handleLogging(e);&lt;br /&gt;        }&lt;br /&gt;        List exceptionMappings = invocation.getProxy().getConfig().getExceptionMappings();&lt;br /&gt;        String mappedResult = this.findResultFromExceptions(exceptionMappings, e);&lt;br /&gt;        if (mappedResult != null) {&lt;br /&gt;            result = mappedResult;&lt;br /&gt;            publishException(invocation, new ExceptionHolder(e));&lt;br /&gt;        } else {&lt;br /&gt;            throw e;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return result;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;This way you can see if something weird happened inside struts that didn't get reported in the logs.  Boom, you can see if there is some mysterious internal error getting thrown, rather than trying to divine it using rain dances and crossed fingers.  These two things have really improved my experience with Struts.  If I were a better person, I would upgrade to see if it's fixed, and if not, I'd probably add some decent logging.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bonus Tip&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If your application starts up, but you are getting invalid results from your struts action, like the "no result defined for action" message, make sure your source control tool didn't merge incorrectly and add a double mapping for the action.  We ran across this recently, where an old mapping was included, and was picked up first.  Perhaps there should be a way to tell Struts2 to error out and fail if it finds the same mapping twice in a file?  Just something to watch for.&lt;br /&gt;&lt;br /&gt;Happy Strutting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5486028822119713419?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5486028822119713419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5486028822119713419'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/struts-2-error-reporting-tips.html' title='Struts 2 Error Reporting Tips'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-923881094456793864</id><published>2009-03-19T07:25:00.003-06:00</published><updated>2009-03-19T11:20:32.814-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='baseball'/><title type='text'>What's Up!</title><content type='html'>Some ramblings from my personal life and current affairs:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Books&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Been reading a lot again lately.  I went through a bit of a lull there after our trip to Aruba where I wasn't reading much at all, but now I am back on it.  This week I finished a David &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Baldacci&lt;/span&gt; book, &lt;a href="http://www.davidbaldacci.com/web/content/view/35/36/"&gt;&lt;span style="font-style: italic;"&gt;Stone Cold&lt;/span&gt;&lt;/a&gt;.  Those are always entertaining, if a bit light on substance.  I dove right into the next one in the series, &lt;a href="http://www.davidbaldacci.com/web/content/view/284/185/"&gt;&lt;span style="font-style: italic;"&gt;Divine Justice&lt;/span&gt;&lt;/a&gt;, which is as good as all the others so far, though it's mostly set outside of DC, which is a big part of the reason that I enjoy some of his other books.&lt;br /&gt;&lt;br /&gt;I also finished &lt;a href="http://www.amazon.com/Alive-Piers-Paul-Read/dp/0060778660/ref=ed_oe_p"&gt;&lt;span style="font-style: italic;"&gt;Alive&lt;/span&gt;&lt;/a&gt;, the story of the survivors of the Andes plane crash in the early 70s, where the survivors were able to last 10 weeks in the mountains by eating the dead passengers.  Wow.  If you ever think your life is tough, just think to yourself "Well this current work assignment sucks, and I hate traffic, but at least I didn't eat my cousin to stay alive today".  Just an amazing story of persistence and togetherness, but at the same time a fair account of personal weakness, and how people can behave (or not) in the face of hopelessness.  This book was written quite a while ago, and was made into a &lt;a href="http://www.imdb.com/title/tt0106246/"&gt;movie&lt;/a&gt; starring Ethan &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Hawke&lt;/span&gt;, but like most other adaptations, the movie doesn't capture the real spirit of the struggle like the book.&lt;br /&gt;&lt;br /&gt;My new metro book is &lt;a href="http://www.google.com/url?sa=U&amp;amp;start=3&amp;amp;q=http://www.amazon.com/Wealth-Poverty-Nations-Some-Rich/dp/0393318885&amp;amp;ei=vUnCSb-_LZj4MY3mhZMK&amp;amp;usg=AFQjCNH1mH8sXpG1VXlOs8wnvx72ZIDeUA"&gt;&lt;span style="font-style: italic;"&gt;The Wealth and Poverty of Nations&lt;/span&gt;&lt;/a&gt;, by David &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Landes&lt;/span&gt;.  I've had this book on my bookshelf for ten years, but just never got around to reading it.  It has been staring at me in its familiar position next to its unread compatriot, Guns, Germs, and Steel, calling out to be read, and I am finally obliging.  It is an interesting tale of geography, history, and anthropology, and how they combine to make some societies rich, and some poor.  I hope it's as good as it has started out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;AIG&lt;/span&gt; Bonuses&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lots of talk about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;AIG&lt;/span&gt; bonuses.  I would say that any sort of 90% tax is silly.  The government has bought up most of the company.  Now they are doing all they can to ensure that no competent people will go work there.  This means the taxpayers will never recoup their bonuses.  If some of the employees there will accept revised bonuses, then good, if not, let them go on their way, but let's not make working for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;AIG&lt;/span&gt; such a poisonous experience that the story will end badly.  It doesn't have to - there are still important and viable portions of the company.  Everyone just needs to chill out and let this play out without trying to tar and feather a bunch of people who in most cases had nothing to do with the irresponsible financial practices that have killed the company.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Where is Spring?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Where is it?  It's 50 and cloudy every day.  I am ready to go for a run outside and a bike ride, and for leaves on trees.  Come on Spring, get your ass in gear!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) World Baseball Classic&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Why is this played?  Does it matter?  Does anyone really care?  I guess it's marginally better than watching your players play in Spring Training, but isn't it basically like watching 23 AAA all star games?  I just don't feel it.  Side note: my new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;HD&lt;/span&gt; TV makes baseball look sweet, so &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;WBC&lt;/span&gt; has that going for it, at least.  I just think that all this is doing is penalizing the teams that have lots of good players who play in the classic (see the Tigers, whose 4-5-6 is playing for Venezuela).  Bah.  Bring on opening day.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) Travel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We haven't done any.  Boo.  We are off to Massachusetts next month for our nephew's 2&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;nd&lt;/span&gt; birthday, which we are definitely looking forward to!  We love our nephew (and Mindy and Jayson too)!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6) Rush Limbaugh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Keep in mind that I am not a 'registered' anything.  I vote on the issues, and that generally leaves me squarely in the middle.  That said, Rush Limbaugh is just terrible.  Is there anything he does that is constructive?  It really doesn't seem like it.  Seems like he's just a terrible windbag who wants to tear down, tear down, tear down everything that he doesn't think is okay.  Easy to snipe when you aren't actually responsible for anything.  He should really reconsider wanting to be the leader of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;RNC&lt;/span&gt;, because then he will be accountable, and that will be new for him.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7) NCAA Championships&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;God I love college basketball.  I love this tournament.  I love that Michigan finally made it back in the dance, and I love that Syracuse made a great run in the tournament (6 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;OTs&lt;/span&gt;!  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;WTF&lt;/span&gt;!?!) to nab a three seed in a relatively easy region.  All I was thinking was "well Syracuse hasn't been announced yet, and we know they are in - what if this ends up as Syracuse-Michigan in a 5-12 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;matchup&lt;/span&gt;?"  Could be tough on my marriage!  Fortunately nothing came of it.  Phew!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-923881094456793864?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/923881094456793864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/923881094456793864'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/whats-up.html' title='What&apos;s Up!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1923361472603123772</id><published>2009-03-10T20:20:00.004-06:00</published><updated>2009-03-10T20:28:38.943-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Consuming RSS Feeds with Groovy/Grails</title><content type='html'>Building off of my &lt;a href="http://kirkgsworld.blogspot.com/2009/02/reading-feeds-using-rome-api.html"&gt;recent post about RSS Feed parsing using the ROME Library&lt;/a&gt;, I had an idea for a fun application to build using Grails.  The first part of this application, which I'll share when I am done, is the part where we read the feed.  Now, the last time I did this in Java, it was pretty easy to do, but man, this is just a little bit better:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;    def readFeed( url )&lt;br /&gt;  {&lt;br /&gt;      def xmlFeed = new XmlParser().parse(url);&lt;br /&gt;&lt;br /&gt;      def feedList = []&lt;br /&gt;    &lt;br /&gt;      (0..&amp;lt; xmlFeed.channel.item.size()).each {&lt;br /&gt;&lt;br /&gt;         def item = xmlFeed.channel.item.get(it);&lt;br /&gt;         RSSFeed feed = new RSSFeed( item.title.text(), item.link.text(),&lt;br /&gt;             item.description.text(), item.pubDate.text() )&lt;br /&gt;         feedList &amp;lt;&amp;lt; feed&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      feedList&lt;br /&gt;  }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Yep, that's it.  One line to pull back the feeds.  The iterator, and one line to create my RSSFeed object.  Then add the feed to a list, and return the list to your controller.  In 25 minutes, I have a feed reader application that's basically functional, taking a feed as an input, and returning a page that displays the post title linked to the post, and the posts contents and date.  All of life should be this easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1923361472603123772?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1923361472603123772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1923361472603123772'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/consuming-rss-feeds-with-groovygrails.html' title='Consuming RSS Feeds with Groovy/Grails'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8377550108326612195</id><published>2009-03-09T11:02:00.004-06:00</published><updated>2009-03-09T11:15:48.128-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plug'/><title type='text'>Read These Now!</title><content type='html'>My friend Ramsey is a true renaissance man.  He is an extremely talented and creative software designer and developer at Blackboard.   In addition to having the best sense of humor I have ever seen out of a software engineer, he is also a fine writer - a &lt;span style="font-style: italic;"&gt;legitimate&lt;/span&gt; &lt;span style="font-style: italic;"&gt;writer&lt;/span&gt; who gets things published - not to be confused with this blog writer, who just spits out a bunch of junk on a blog periodically and hopes something sticks. &lt;br /&gt;&lt;br /&gt;Check out his stories here:&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://www.strangehorizons.com/2008/20080630/roadside-f.shtml"&gt;Jimmy's Roadside Cafe&lt;/a&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://weirdtales.net/wordpress/2009/01/09/creature/"&gt;Creature&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;They are both extremely entertaining and well-written.  If you enjoy those, check out Ramsey's blog, &lt;a href="http://doodleplex.com/glassmaze/"&gt;Glass Maze&lt;/a&gt;.  It's full of interesting posts and hilarious takes on everyday stuff.&lt;br /&gt;&lt;br /&gt;Congrats Ramsey!  Don't forget me when you are famous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8377550108326612195?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8377550108326612195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8377550108326612195'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/read-these-now.html' title='Read These Now!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1142762303537377960</id><published>2009-03-07T09:29:00.005-07:00</published><updated>2009-03-07T10:18:28.724-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Garbage Collection, Tomcat, Hibernate, and You</title><content type='html'>&lt;div style="text-align: center; font-weight: bold;"&gt;java.lang.OutOfMemoryError: PermGen space&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;If you are using Sun's Hotspot JVM, maybe you've seen this in your log file, and you don't know what to do.   Maybe this will help.&lt;br /&gt;&lt;br /&gt;Ever since we upgraded at work from Hibernate 2.1 to 3.2, we have been fighting memory management issues.  Some of those can probably be traced back to increased traffic, some probably to odd legacy code that can be refactored pretty easily, and much of it relates to Hibernate and cgLib.  There are endless blog posts about this, so if you want to read about the way cgLib, Hibernate, and the Perm region of the JVM heap interact, google away.&lt;br /&gt;&lt;br /&gt;To break it down, here's how to know you may run across a problem:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;java-home&gt;/bin/jps&lt;/java-home&gt;&lt;/blockquote&gt;This will give you a listing of running JVM instances on your machine.  Tomcat presents as:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;xxxx Bootstrap&lt;/blockquote&gt;this is the JVM pid that you can use to check out memory utilization.  Now run the garbage collection util to see what's going on in your heap:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;jstat -gcutil &lt;pid&gt;&lt;/pid&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;You will be presented with the following:&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;S0&lt;/td&gt;&lt;td&gt;S1&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;br /&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;YGC&lt;/td&gt;&lt;br /&gt;&lt;td&gt;YGCT&lt;/td&gt;&lt;td&gt;FGC&lt;/td&gt;&lt;td&gt;FGCT&lt;/td&gt;  &lt;br /&gt;&lt;td&gt;GCT&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;0.00&lt;/td&gt;&lt;td&gt;31.58&lt;/td&gt;&lt;td&gt;60.13&lt;/td&gt;&lt;br /&gt;&lt;td&gt;57.76&lt;/td&gt;&lt;td&gt;99.66&lt;/td&gt;&lt;td&gt;2647&lt;/td&gt;&lt;br /&gt;&lt;td&gt;5.192&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;2.114&lt;/td&gt;&lt;br /&gt;&lt;td&gt;7.306&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;br /&gt;The measures above give you space utilization in percentage of the regions of the JVM memory space.  For a detailed explanation of this, check out the &lt;a href="http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf"&gt;official Sun paper on the topic&lt;/a&gt;.  For our purposes, we will do a quick overview:&lt;br /&gt;&lt;br /&gt;S0 and S1 are both survivor spaces.&lt;br /&gt;E is Eden space.&lt;br /&gt;O is Old space.&lt;br /&gt;P is Perm space.&lt;br /&gt;&lt;br /&gt;When an object is created, it lives in Eden space.  If it makes it past a garbage collection while still containing an active reference to it, it will move on to Survivor space.  From there, if it's still actively referenced, it moves on to Old space.  Garbage Collections of Eden and Survivor spaces are not the big garbage collections - the are the Young Garbage Collections (YGC).  Once something gets into the Old space, it can only be removed by a Full Garbage Collection (FGC).  You can see from the above table that a YGC is not expensive - 2647 of them were performed in a total of 5.192 seconds, while just six full collections take 2.114 seconds.  Finally, there is the Perm space.  This is where the &lt;em&gt;JVM structures and class objects&lt;/em&gt; are put.  The classloader sticks stuff here to help you so it doesn't have to constantly load and reload these structures.  The problem is that if you have a lot of these things, it's going to just keep sticking things in there until it's full.&lt;br /&gt;&lt;br /&gt;There are a couple of ways to combat this issue:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Maybe you haven't increased the default size of the Perm space.  You can do that by adding this JVM flag to your startup script:  -XX:MaxPermSize=&lt;your&gt;m.  To give some perspective, the default is 32m.&lt;br /&gt;&lt;/your&gt;&lt;/li&gt;&lt;li&gt;Look at your classpath.  Are you loading a LOT of libraries in?  Do you need them all?  Perhaps you can remove some of those libraries.&lt;/li&gt;&lt;/ol&gt;If you still have problems with Perm space after making the above changes, try these JVM arguments and see if you have any more issues.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled&lt;/blockquote&gt;Whereas we were constantly hovering around 99.88% perm space utilization prior to these changes, now we are usually back down around 60%, so an extraordinary event in the system won't trigger an outofmemory situation.  Hope this helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1142762303537377960?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1142762303537377960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1142762303537377960'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/garbage-collection-tomcat-hibernate-and.html' title='Garbage Collection, Tomcat, Hibernate, and You'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3225474621562530242</id><published>2009-03-07T08:55:00.004-07:00</published><updated>2010-03-31T18:23:57.305-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Why Grails is Sweet</title><content type='html'>Grails is sweet because you do things that are relatively complex, like upload a photo, resize it, save it, and persist the metadata using this code in a controller class, and nothing more:&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;        def photo = new Photo(params)&lt;br /&gt;Member m = authenticatedMember()&lt;br /&gt;def myFile = request.getFile( "file" )&lt;br /&gt;def imageTool = new ImageTool()&lt;br /&gt;photo.path = "";&lt;br /&gt;photo.member = m&lt;br /&gt;&lt;br /&gt;if(myFile &amp;amp;&amp;amp; photo.save())&lt;br /&gt;{&lt;br /&gt;String imagepath = grailsApplication.config.imagePath +&lt;br /&gt;File.separatorChar + "${photo.id}.jpg"&lt;br /&gt;myFile.transferTo(new File(imagepath))&lt;br /&gt;&lt;br /&gt;imageTool.load(imagepath)&lt;br /&gt;imageTool.thumbnail(640)&lt;br /&gt;&lt;br /&gt;String fixedImagePath = grailsApplication.config.imagePath + File.separatorChar + "${photo.id}-fixed.jpg"&lt;br /&gt;imageTool.writeResult(fixedImagePath, "JPEG")&lt;br /&gt;imageTool.square()&lt;br /&gt;imageTool.swapSource()&lt;br /&gt;photo.path = fixedImagePath&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Oh by the way, when you define a domain class with a byte array to store a file, then generate the edit/create view, it automatically does all the multipart form submission stuff in the .gsp file.  It NEVER gets this easy with Java/JSP.  Hmm.  Awesome.  This is made possible by the innate goodness of grails and a plugin called &lt;a href="http://www.grails.org/ImageTools+plugin"&gt;ImageTools&lt;/a&gt;.  It makes me dread going back to work and using Java sometimes.  Sigh.  It's amazing how much you can get done in a short time with this framework, and the more I have a-ha moments with it, the more I think I won't be going back to just Java when I make the switch full time, especially in the knowledge that whether it's Groovy/Grails or JRuby/Rails, I can still fall back on familiar Java libraries.  Yessir, this is a good time to be a nerd...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3225474621562530242?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3225474621562530242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3225474621562530242'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/why-grails-is-sweet.html' title='Why Grails is Sweet'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7081502847529625548</id><published>2009-03-06T18:04:00.003-07:00</published><updated>2009-03-06T18:26:04.805-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>jQuery Goodness</title><content type='html'>&lt;p&gt;This week I did a lot of client-side development.  Usually, this would be reason to cry and/or drink heavily, but this week, it was one of the more pleasant parts of my week.  I thought that I'd go ahead and share a one of the goodies that I experienced.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Thickbox&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://jquery.com/demo/thickbox/"&gt;Thickbox&lt;/a&gt; is an awesome library that pops up a page that you defined as a dialog that can be modal if you specify that option.  It's pretty peppy, and looks sharp.  Thickbox uses decoration of links on a page (set up by specifying a class of 'thickbox').  Anchor tags are set up to register an onclick event that pops up a page that you specified, be it a static page, or the result of a server-side call.  Anything can be displayed in a thickbox.  It can be information, or a form that you submit back to the server.  It's been pretty simple for us, but I did run across an issue today.  I am loading some pre-rendered html into another div that displays as a floating popup on the page.  One of the links there needs to call an overlay that is loaded via thickbox.  The button was defined as an input, which should work, but all the documentation refers to anchor tags, so I figured that we could get around it by doing this:&lt;/p&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;function showOverlay {&lt;br /&gt;&lt;br /&gt;jQuery( '#floatingDiv' ).hide();&lt;br /&gt;jQuery( '#hiddenTbLink' ).click();&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;input type="button" id="id" onclick="javascript:showOverlay();" value="showIt"&amp;gt;&lt;br /&gt;&amp;lt;a id="hiddenTbLink" style="display: none;" class="thickbox" href="http://www.blogger.com/path/to/action"&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;This hides the floating div and invokes the click action on the anchor tag that contains the thickbox element.  This should work, right?  Wrong.  The html is dynamically inserted into the DOM after the document.ready code is called.  That is where you perform the thickbox initialize call.  So, what we had to do is add call to tb_init() in the code that loads the floating div, thus doing the jQuery DOM manipulation and allowing the thickbox-enabled link.  Much better now.  I sat back with glee, realizing that in a few hours, I had enabled this floating div and figured out how, from that floating div, I could make a call to load a beautiful thickbox element.  It was all too easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7081502847529625548?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7081502847529625548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7081502847529625548'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/jquery-goodness.html' title='jQuery Goodness'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-543242557309939252</id><published>2009-03-03T10:45:00.000-07:00</published><updated>2009-03-03T10:45:00.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><title type='text'>Are You Doing The Right Things?</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-style: italic;"&gt;Are you doing the right things with your time?  How would you know either way?!?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/images?q=tbn:594vyehfdLVV_M::wwww.vgdotnet.com/blog/shiny_clock.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 129px; height: 126px;" src="http://www.google.com/images?q=tbn:594vyehfdLVV_M::wwww.vgdotnet.com/blog/shiny_clock.png" alt="" border="0" /&gt;&lt;/a&gt;Let me preface this by saying that this will not be one of those posts where I tell you what the right things are.  I don't have any clue.  I am don't even know if I am doing the right things!  Much of this post is me trying to justify the way I spend my time, because if there is one thing I do know, it is that you get 24 hours in a day, and you have to spend it right to achieve true success and happiness.  &lt;/div&gt;&lt;p&gt;What does that mean?  To me, it could mean that I spend more time with my wife.  It could mean that I spend more time working on my guitar practice.  It could mean more time at the gym, or running, or cycling.  It could be more time spent on my entrepreneurial pastime.  It could be just more time relaxing, reading books and listening to music.  For some people, it could be working at their 'day job' for long hours, to be the absolute best they can be at their job.&lt;/p&gt;&lt;p&gt;In the end, what I don't want to do is regret the way I spend my time.  I am pretty happy guy. Things are good.  Great, really.  I feel like an awfully lucky guy.  I just don't want to look back and think that if I just done this, I could have done that, and so on.  I suppose some would say that you know whether or not you are happy, because at the moment when you are doing something, you woudln't want to be doing something else.  There must be something to the bliss of not having anything to do when you get home, but I remember in the years after college, just coming home and veg-ing out and feeling somewhat unfulfilled.  I think what I've figured out is that the 'grass is greener' theory definitely seems to apply.&lt;/p&gt;&lt;p&gt;The biggest things you have to make sure of, in my opinion, are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;You are always learning something, whether it be a barre chord on the guitar, a new programming language, or a new recipe&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You aren't doing things you hate to do just because "it seems like the right thing to do"&lt;/li&gt;&lt;li&gt;You aren't neglecting the really important things in life (family, health)&lt;/li&gt;&lt;li&gt;You are ALWAYS investing in yourself and your future&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Even if you STILL don't know what you want to do when you grow up, as long as you are moving in the right direction it's okay.  This can be achieved (in my experience) in three ways:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Set attainable goals and attack them&lt;/li&gt;&lt;li&gt;Check back on goals you have already set to measure progress and to decide if they are still applicable&lt;/li&gt;&lt;li&gt;Once you have attained a goal, see how it actually affects your overall plan&lt;/li&gt;&lt;/ol&gt;By taking these steps, you can know if you are getting closer to your destination in life, and more importantly if your destination is actually somewhere you want to get to.  I am still figuring it out, and if anyone knows of ways to keep all this mess straight and still sleep, I am all ears.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-543242557309939252?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/543242557309939252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/543242557309939252'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/03/are-you-doing-right-things.html' title='Are You Doing The Right Things?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1014292055164800333</id><published>2009-02-24T07:59:00.000-07:00</published><updated>2009-02-24T08:00:09.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nostalgia'/><category scheme='http://www.blogger.com/atom/ns#' term='baseball'/><title type='text'>Baseball is Here</title><content type='html'>&lt;p&gt;'Clack, clack, clack' go the metal spikes against the floor.  The doors open and the afternoon sun floods into the dark locker room.  Cold, late-winter air hits you in the face, but it smells good, like the thaw that signals the arrival of Spring.  Most pair up to toss the ball, picking up after months like no time has passed, while the first-timers nervously look for someone to join them.  'Snap!'  The sweet, crisp sound of balls arriving at their destination.  &lt;/p&gt;&lt;p&gt;Ahh, baseball is here.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1014292055164800333?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1014292055164800333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1014292055164800333'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/02/baseball-is-here.html' title='Baseball is Here'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8137246340892536443</id><published>2009-02-19T09:11:00.007-07:00</published><updated>2009-02-19T16:26:43.969-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Reading Feeds using the ROME API</title><content type='html'>&lt;p&gt;A recent task had me doing something pretty simple - reading some RSS feeds for display on pages inside our application.  I know that it's easy enough to just write some custom code that parses an RSS feed - after all it's just XML, right?  I didn't want to do that, so I did some digging, and found two real options - &lt;a href="https://rome.dev.java.net/"&gt;ROME&lt;/a&gt;, and &lt;a href="http://commons.apache.org/sandbox/feedparser/"&gt;Commons FeedParser.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It quickly became obvious that ROME was the correct choice, and that's when the fun started. ROME is a Sun project that seemed to provide the most flexibility as far as reading different syndication formats, and clarity of API docs.  Using &lt;a href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialFeedReader"&gt;this tutorial&lt;/a&gt; from the site, getting the feed and parsing it was really really easy.  Just pass a feed url to the feed reader, and get some content items back.  &lt;/p&gt;&lt;p&gt;Loop through them and display the correct content.  &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;URL feedUrl = new URL( feed );&lt;br /&gt;&lt;br /&gt;SyndFeedInput input = new SyndFeedInput();&lt;br /&gt;SyndFeed feed = input.build( new XmlReader( feedUrl ) ;&lt;br /&gt;&lt;br /&gt;List feedEntries = feed.getEntries();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;There are some subtleties, however, that seemed to merit a post, as I didn't really find any clear explanations for these things in one place.&lt;p&gt;&lt;strong&gt;Issue 1:  Content Encoding&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We are parsing a feed from a wordpress blog, and it seems that some posters always post content that has the weird characters that signify a content encoding issue.  The weird diamonds with question marks in them (or just empty boxes in Opera) that are inserted where there is a sort of 'half-space' on the actual blog.  I determined that the blog was using UTF-8 (this seems to be the default encoding for a WordPress instance.  After much searching, I came across &lt;a href="http://markmail.org/message/kccca4owqsarxsqs#query:+page:1+mid:f3yswizbn4qqtost+state:results"&gt;this post&lt;/a&gt;, which seemed to contain about a million suggestions for how to handle the error.  What worked for some didn't seem to work for others, and certainly didn't work for me! I tried to read the url as a stream, and to no avail.  &lt;/p&gt;&lt;p&gt;Instead, I settled on setting the character encoding type on the HttpServletResponse object, which seems to take care of things.  Seems a little weird to me, but that's okay as long as it works and I don't have to write custom parsers.  After updating things, here's how my code looked:&lt;br /&gt;&lt;/p&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt;  URL feedUrl = new URL( feed );&lt;br /&gt;  String respEncoding = "";&lt;br /&gt;  if ( encoding == null )&lt;br /&gt;  {&lt;br /&gt;    encoding = "UTF-8";&lt;br /&gt;    respEncoding = "UTF8";&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;    respEncoding = encoding.replaceAll( "-", "" );&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  XmlReader.setDefaultEncoding( "UTF-8" );   &lt;br /&gt;  &lt;br /&gt;  SyndFeedInput input = new SyndFeedInput();&lt;br /&gt;  SyndFeed feed = input.build( new XmlReader( feedUrl.openStream(), true ) ) ;&lt;br /&gt;&lt;br /&gt;  List feedEntries = feed.getEntries();&lt;br /&gt;        &lt;br /&gt;  response.setCharacterEncoding( respEncoding );&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Issue 2: Where's My Content?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The first blog I tested was easy to parse, once I got that list of feeds.  I just needed to to display the description field on the SyndFeedEntry object, and it gave me a nicely formatted (accounting for html inside the post) abridged posting.  Then I tried to display a blog that was hosted by the blogger platform (the very blog you are reading now).  Would you believe that the &lt;em&gt;description&lt;/em&gt; property was unset.  No content. Now I am left having to get the raw content  straight out of the raw content feed.  I didn't really want an if-else for this in the display, and the way the SyndEntry was made, it wasn't really super simple to subclass it, so I went ahead and created my own class that took that SyndEntryImpl object and decorated with a few simple convenience methods:&lt;/p&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&lt;br /&gt; /**&lt;br /&gt;  * Helper method to return the contents whether they come from the description field (ie wordpress is kind and does this) or raw content&lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; public String getAbridgedContents()  {&lt;br /&gt;   //first try the description&lt;br /&gt;   if ( myEntry.getDescription() != null &amp;amp;&amp;amp; myEntry.getDescription().getValue() != null )&lt;br /&gt;   {&lt;br /&gt;     return myEntry.getDescription().getValue();&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   //if that's not working, use the raw contents&lt;br /&gt;   StringBuilder sb = new StringBuilder();&lt;br /&gt;   SyndContent sc = null;&lt;br /&gt;  &lt;br /&gt;   for ( int i = 0; i &amp;lt; myEntry.getContents().size(); i++ )&lt;br /&gt;   {&lt;br /&gt;     sc = (SyndContent) myEntry.getContents().get( i );&lt;br /&gt;     sb.append( sc.getValue() );&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   String ret = sb.substring( 0, 255 ) + " [...]";&lt;br /&gt;  &lt;br /&gt;   return ret;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getDateString()&lt;br /&gt; {&lt;br /&gt;   SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, MMM d" );&lt;br /&gt;  &lt;br /&gt;   return dateFormat.format( myEntry.getPublishedDate() );&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getCatName()&lt;br /&gt; {&lt;br /&gt;   if ( myEntry.getCategories() != null &amp;amp;&amp;amp; myEntry.getCategories().size() &amp;gt; 0 )&lt;br /&gt;   {&lt;br /&gt;     SyndCategory sc = (SyndCategory) myEntry.getCategories().get( 0 );&lt;br /&gt;    &lt;br /&gt;     return sc.getName();&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;     return null;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getCatUri()&lt;br /&gt; {&lt;br /&gt;   if ( myEntry.getCategories() != null &amp;amp;&amp;amp; myEntry.getCategories().size() &amp;gt; 0 )&lt;br /&gt;   {&lt;br /&gt;     SyndCategory sc = (SyndCategory) myEntry.getCategories().get( 0 );&lt;br /&gt;    &lt;br /&gt;     return sc.getTaxonomyUri();&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;     return null;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Hopefully this will help people get their feedreader working quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8137246340892536443?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8137246340892536443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8137246340892536443'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/02/reading-feeds-using-rome-api.html' title='Reading Feeds using the ROME API'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-4780222639145053519</id><published>2009-02-12T16:10:00.003-07:00</published><updated>2009-02-12T16:11:36.728-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='baseball'/><title type='text'>Dear Winter</title><content type='html'>&lt;p&gt;Winter,&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I would like to invite you to go the hell away.  Pitchers and Catchers reported today.  We don't have any more use for you.  You can take your subzero wind chills and lack of snow and get the hell on.  Can't wait til opening day.  Spring - come on down!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Kirk&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-4780222639145053519?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4780222639145053519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4780222639145053519'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/02/dear-winter.html' title='Dear Winter'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8452577320127554498</id><published>2009-02-12T11:18:00.003-07:00</published><updated>2009-02-12T15:31:13.747-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Developers and Writers</title><content type='html'>&lt;p&gt;When I worked at Blackboard, one of the things that people frequently groused about (myself included) was the requirement that we write a certain amount of posts on the internal blog (we used Confluence by Atlassian, which had some blog/journaling-type functionality.  It was hard enough finishing the never-ending assignments that often ran concurrently in groups of five or six, so how could we possibly jump out of the IDE once or twice a day and write something about all this work?  Isn't that just a waste of time?!!?  &lt;/p&gt;&lt;p&gt;Looking back, the answer is unequivocally "No".  &lt;/p&gt;&lt;p&gt;Anyone, including the lowliest junior foot soldier developer, should be able to elucidate their work in plain language, so that someone who is not technical can read and understand it.  This is an important skill that has to be constantly developed.  It's another thing that must be treated as part of a complete developer arsenal, just like learning programming languages, libraries, important protocols, database servers, and operating systems.   Next time you are asked to draft a design document or blog about what you are working on, don't look at it as a black hole of timewaste.  Look at it as a way to get better at your job.  Any dummy can code - it's the people that can explain what and why they are doing it and make sense that are actually valuable.&lt;/p&gt;&lt;p&gt;Often writing something down and then reading it can help you realize that what you have done is a monstrocity, or unnecessary, or doesn't actually fulfill the requirement.  Even more often, if you don't see something after reading your own work, someone else who reads it might have a 'light bulb moment' themselves. Either way, you have a) learned something new, b) made your product better, c) gotten some valuable writing practice.  &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;If none of the above has inspired you, how about the fact that you get to do something other than completely nerding out for a little while?  Isn't that reason enough?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Go write, developers!  Life isn't all bits and bytes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8452577320127554498?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8452577320127554498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8452577320127554498'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/02/developers-and-writers.html' title='Developers and Writers'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-4832983272266984558</id><published>2009-02-11T14:09:00.009-07:00</published><updated>2009-02-12T07:23:20.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Fun and Games with Struts</title><content type='html'>&lt;p&gt;I had a requirement for a project at work to insert some preprocessing into our Struts actions that will check to see if something fancy has to happen to decorate the page differently based on a branded association.  I thought to myself, "hmm, that will be easy".  I was mostly right.  I have been working mostly with Struts 2 lately, which provides us with a handy dandy prepare() method to override, that is always called before the execute() method in a Struts 2 class that extends ActionSupport.  This is simple:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class AwesomeActionSupport implements Preparable&lt;br /&gt;{ &lt;br /&gt;  private Integer integerToSet;    &lt;br /&gt;  private Boolean someBool;&lt;br /&gt;&lt;br /&gt;  public void prepare() throws Exception    &lt;br /&gt;  {          &lt;br /&gt;    if( someBool )           &lt;br /&gt;    {                &lt;br /&gt;      integerToSet = new Integer( 1 );          &lt;br /&gt;    }           &lt;br /&gt;    else           &lt;br /&gt;    {&lt;br /&gt;      integerToSet = 1;          &lt;br /&gt;    }   &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String execute()   &lt;br /&gt;  {         &lt;br /&gt;    System.out.println( integerToSet );&lt;br /&gt;&lt;br /&gt;    return SUCCESS;   &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  //GETTERS/SETTERS FOR PRIVATE VARS ABOVE&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see it's quite simple when using Struts 2.  Sadly, most of the functionality in our application is still running Struts 1 for now.  This makes something easy much less simple.  There isn't really a built-in mechanism to make a pre-execution call.  Here's what I came up with:&lt;br /&gt;&lt;/p&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public abstract class AwesomeAction extends Action&lt;br /&gt;{&lt;br /&gt;  public ActionForward execute(ActionMapping mapping, ActionForm form,                               &lt;br /&gt;                               HttpServletRequest request, HttpServletResponse response) &lt;br /&gt;    throws Exception   &lt;br /&gt;  {    &lt;br /&gt;    //do prep work    &lt;br /&gt;    request.setAttribute( &amp;quot;whatever the action needs&amp;quot;, theValue );    &lt;br /&gt;    return perform( mapping, form, request, response );      &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**   &lt;br /&gt;    * A stub for performing the execute method, to be implemented by each    &lt;br /&gt;    * individual struts action, after the execute pre-processing is performed   &lt;br /&gt;    *    &lt;br /&gt;    * @param mapping   &lt;br /&gt;    * @param form   &lt;br /&gt;    * @param request   &lt;br /&gt;    * @param response   &lt;br /&gt;    * @return   &lt;br /&gt;    * @throws Exception   &lt;br /&gt;    */  &lt;br /&gt;  public abstract ActionForward perform( ActionMapping mapping, ActionForm form,                                         &lt;br /&gt;                                         HttpServletRequest request, HttpServletResponse response) &lt;br /&gt;    throws Exception;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;So now when you write your actual action class, instead of extending the Action class, you extend this action class that does the preprocessing, then delegates the real work to the perform method that you have to define.  Seems to work great, with the only caveat being you can't use a Dispatch action with multiple methods.  If you really want to do that, then upgrade your action/application to Struts 2!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-4832983272266984558?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4832983272266984558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4832983272266984558'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/02/fun-and-games-with-struts.html' title='Fun and Games with Struts'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3486635088304331410</id><published>2009-02-10T12:39:00.005-07:00</published><updated>2009-02-10T14:22:46.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>RUBA!</title><content type='html'>Just got back from a week in Aruba.  Man, what an awesome place.  The weather is virtually always perfect, the people are extremely friendly, and the food is delicious.  Jena and I were lucky enough to tag along with her parents, her sister and bro-law, their son William (who calls Aruba 'Ruba', hence the title of the post), and her aunt.  We had a great time.  I spent most of it doing a combination of&lt;br /&gt;&lt;br /&gt;1) sitting around doing nothing next to a pool&lt;br /&gt;2) chasing our crazy nephew around the pool&lt;br /&gt;3) floating in circles in the pool&lt;br /&gt;4) drinking a tasty frozen drink in or near the pool&lt;br /&gt;5) reading books next to a pool&lt;br /&gt;&lt;br /&gt;I also played the Wii for the first time.  Holy crap is that thing awesome.  I hate video game systems like XBox and PS - I think that they are the scourge of an entire generation - but the Wii, just for its bare simplicity, amazing gameplay, and interactive nature has really nailed it.  Amazing.  I am not very good at the Wii games, but it's a good way to knock out 15 minutes.  I think even Jena has agreed that we will get one sometime.&lt;br /&gt;&lt;br /&gt;We got to play with our awesome nephew William, and even got to babysit one night.  Note to babysitters everywhere, kids sleep much better when they are splashing about in pools for 8 hours before you get them.  The diaper changing wasn't the best part of the night, but it was really something to read to him and put him down.  He is a real joy to be around, and so smart.  Last time we saw him, around Thanksgiving, he was babbling in near English, and now he is talking and repeating everything and learning how to say everything.  Just amazing what a sponge he is!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images1f.snapfish.com/232323232%7Ffp8%3C3%3Enu%3D3235%3E583%3E749%3EWSNRCG%3D323%3A5795%3B%3A%3A43nu0mrj"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://images1f.snapfish.com/232323232%7Ffp8%3C3%3Enu%3D3235%3E583%3E749%3EWSNRCG%3D323%3A5795%3B%3A%3A43nu0mrj" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see, we had a really crappy view from our balcony =)&lt;br /&gt;&lt;br /&gt;We had a couple of pretty ridiculous meals.  One at El Gaucho, an Argentine steakhouse where they try to kill you by serving you insane quantities of meat.  We were able to share three entrees to feed four people to the point of absurdity.  It was delicious.  Friday the whole gang went to Madam Jinette's where everything is awesome.  I had a plate-sized serving of Wiener Schnitzel.  So very good.&lt;br /&gt;&lt;br /&gt;I also read some books.  I finished off the book on hyperpartisan politics that I started shortly before my trip (more on that in a future post), read a silly Vince Flynn novel, and finally read Jurassic Park (book way better than movie).  I am back on The Stuff of Thought, about humans interaction with language.  So fascinating, though a bit heavy.  I am also still reading the WW2 book about the Allied campaign in Italy.  This has been a delight to read, and were it a bit slimmer, I would have brought it to Aruba, but sized as it is, it's a nightstand-only affair.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3486635088304331410?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3486635088304331410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3486635088304331410'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/02/ruba.html' title='RUBA!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-181269174861843991</id><published>2009-01-27T10:53:00.003-07:00</published><updated>2009-01-27T11:27:17.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Latest Books</title><content type='html'>So I finally finished the book "This is Your Brain on Music", which turned out to be a pretty interesting read.  I described it somewhat earlier, but basically it was a book about why we love music, what about music makes our brain recognize, assemble, and appreciate it.  It is the kind of thing that I want to read again as I learn more about music and the technical aspects of it, but it was really pretty accessible to the lay reader as well.  I recommend it to anyone who just loves music but doesn't actually know why!&lt;br /&gt;&lt;br /&gt;Last week I also read &lt;a href="http://www.amazon.com/Road-Cormac-McCarthy/dp/0307265439"&gt;Cormac McCarthy's The Road&lt;/a&gt;, which was incredible.  The way it was written was just really impressive.  I didn't have any trouble with the writing and punctuation (lack of quotations) that could be annoying to some.  There was so much about this book that was so good, and left me wanting more.  I think the fact that we didn't really know too much about what caused this apocalyptic event, that we didn't know how old these people were, where they came from, where they were headed would sometimes be frustrating.  The way it was written and the fact that the reader can become so invested in the character can balance the frustration with appreciation.  It's been a while since I had eight pages left in a book and didn't want to read them because then I would be done.  I plan on devouring the remainder of this author's work.&lt;br /&gt;&lt;br /&gt;Another book I started recently (it's a big one and I am only 1/4 of the way through) is &lt;a href="http://www.amazon.com/Day-Battle-1943-1944-Liberation-Trilogy/dp/0805062890"&gt;The Day of Battle: The War in Sicily and Italy&lt;/a&gt;, by Rick Atkinson.  This gives a detailed history of the Allied campaign in Sicily and Italy, starting from preparation to make landfall in Sicily.  It's amazing how much stuff went wrong for the Allies - how many paratrooper snafus, how much of an issue logistics was, how much of a problem cooperation between England and the US was, and even how much of a problem inter-branch communication and cooperation was.  This is an interesting book 150 pages in - it's the kind of history book that reads unlike a history book, and I've enjoyed it thus far.&lt;br /&gt;&lt;br /&gt;Finally, my current subway reading is &lt;a href="http://www.google.com/url?sa=U&amp;amp;start=1&amp;amp;q=http://www.amazon.com/Second-Civil-War-Partisanship-Washington/dp/1594201390&amp;amp;ei=LVB_SejwFde4twey3IiRBQ&amp;amp;usg=AFQjCNG2FsG15DqC311ikKnQ2rtQGZ67CA"&gt;The Second Civil War&lt;/a&gt;, by Ronald Brownstein, which tells the story of extreme partisan politics in the United States - how it has evolved since the late 1800s, and how it affects the ability of the legislature to pass laws - what's good about it, what's bad, and (hopefully) what we can do to overcome extreme partisanship.  It's part history, part political science, and thus far an informative and easy read.  It's been enjoyable learning about the people behind the names on the Congressional Buildings down the street from me - Cannon, Rayburn, Dirksen, etc.  I'll write more on this one as time goes on, but it's a good follow-on to the book 'America's Three Regimes' that I &lt;a href="http://kirkgsworld.blogspot.com/2008/04/tigers-books-travel.html"&gt;read last year&lt;/a&gt;.  Hopefully the Obamanation of our government will render all this extreme partisanship moot, but I have my doubts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-181269174861843991?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/181269174861843991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/181269174861843991'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/latest-books.html' title='Latest Books'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1063956155826884315</id><published>2009-01-26T13:49:00.000-07:00</published><updated>2009-01-26T13:50:04.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Get Agile!</title><content type='html'>Well here at Sportsvite, we are working on getting agile.  We've had a new team member join us (&lt;a href="http://dc.sportsvite.com/players/jmoore"&gt;Jeff&lt;/a&gt;), and with him he brought a bunch of ideas about software development and process.  He is a pretty strong devotee to the Scrum process (to which I am quite open), to Spring (which I think is in many cases overrated, but maybe I am just being stupid), and to the New England Patriots, which I suppose we can forgive.&lt;br /&gt;&lt;br /&gt;As a small team that is spread out across multiple offices with different work schedules, we are truly hitting some edge cases when it comes to Scrum/Agile implementation.  As we navigate the process, we can talk more about how it's going, but here are the issues that I see up front:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Multiple Responsibilities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have one platform, but many streams of work.  How can we reconcile sprints to the timelines that exist based on external client demands?  While the core product timeline may say that we plan on delivering some software on March 20, but a client says March 6, how do we address this - theoretically we will have a bunch of half-done stuff going out live.  Normally, this can be addressed by using source control branches, etc, but what if there are platform dependencies?  Just a matter of careful planning, but there is the definite potential for trouble here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Verification&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On a small team without dedicated QA, how can you really verify that things work?  So part of this problem is not having a dedicated quality team, but you can obviously make do.  The issue here is that in a perfect world you have QA folks working in lockstep with the developers and UI designers writing test cases and readying for the verification step - in our case if the developers have to do this, they aren't developing nearly as much, and then they have to stop dead in their tracks to test, rather than getting folks testing while the developer can finish up more tasks.  Not a shortcoming of agile, just another hurdle in general.&lt;br /&gt;&lt;br /&gt;The idea that we came up with is a two week sprint of work, with a one week verification sprint.  This sort of violates the spirit, to me, as a sprint should theoretically result in 'finished' work, but it's an adaptation that seemed to be the best compromise available in our situation (comments and suggestions always welcome)!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Heavy UI Requirements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Part of the big idea with agile is to coordinate effort and get everyone on the same page that things are ready to deploy in a timely and high-quality fashion.  Here, and at many places where you develop a world-facing site, you have a heavy reliance on UI designers.  Here we get templates and we apply them once the server side work is done, turning HTML into JSP.  This is okay, but now we want to make it all cohesive.  How can we do this, when the UI needs to be done ahead of the developers?  We can have the UI team working ahead of the engineers, then catch up with them towards the end of the development sprint in order to do any cleanup and browser testing fixes.  This is okay, but one of the best benefits I see in this is that the sprint planning session should take place before the UI work starts, so we aren't hurrying through last minute requirements on the UI, and I am not sure if this is going to be the case if the UI folks are already making templates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Geographical Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have developers in Washington, and non-technical staff and UI designers in New York city.  Traditional scrum is very hands on and paper/white board based.  We obviously can't all be in the same room, can't all physically watch people manipulate the task list, and whatnot, but we do have technology to do it.  We just need a way to manage the 'state' of our project.  To that end we can use tools, but we haven't found one that is all the way there and reasonably priced.  We are using &lt;a href="http://scrumy.com"&gt;Scrumy&lt;/a&gt; for now to see how it goes - it's pretty nice, but there are definitely shortcomings. &lt;br /&gt;&lt;br /&gt;I am hoping that people out there who are agile pros have run across things like this.  Obviously the positives outweigh the negatives.  We will be able to plan out our work better, get a better idea of how long things take, to prioritize more effectively, and hopefully to deliver better software on tighter timelines.  We just can't do the vanilla agile implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1063956155826884315?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1063956155826884315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1063956155826884315'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/get-agile.html' title='Get Agile!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-4713650044743311020</id><published>2009-01-23T08:17:00.002-07:00</published><updated>2009-01-23T08:28:22.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><title type='text'>Interesting Entrepreneurial Readings</title><content type='html'>Read a couple of interesting posts over the last couple of days.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://caseysoftware.com/blog/clarifying-idea"&gt;Keith Casey on 'Clarifying that Idea'&lt;/a&gt; - so true.  If you can't explain it to yourself on a piece of paper, then how in the HELL are you going to sell it, or get someone else to invest in it.  I think that this sort of activity forces you to&lt;br /&gt;&lt;br /&gt;A) be real about your idea - will it work, now that you have restated it in a more concrete fashion? B) think about what you are saying, thus spawning more creativity - ou can't just have an idea and then dive in, because then what you are implementing is as half-baked as the idea itself - &lt;a href="http://en.wikipedia.org/wiki/Garbage_In,_Garbage_Out"&gt;Garbage In, Garbage Out&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jessicamah.com/blog/?p=641"&gt;Jessica Mah on why entrepreneurs fail&lt;/a&gt; - they fail because:&lt;br /&gt;&lt;br /&gt;1) They have lots of ideas, but no implementation&lt;br /&gt;2) They have lots of ideas, but half-assed implementations&lt;br /&gt;3) They have lots of ideas, lots of implementations, but no focus&lt;br /&gt;&lt;br /&gt;Personally, I would say that 1-3 are all ahead of the game.  How many 'entrepreneurs' are sitting around at home thinking up ways to get rich, to stop working for 'the man', and don't think of anything at all.  I guess they are #0, and we all know whey they fail =).&lt;br /&gt;When I actually have ideas, I certainly see myself falling under #2/#3, my problem is that I get bored easily, and want to create things, so I have four projects at home of stuff I thought would be good - this is why you need a well rounded team.  Someone has to NOT CARE about technology, and just want to build products and make money.  Without that guy, all you are doing is building cool stuff that never sees the light of day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-4713650044743311020?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4713650044743311020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/4713650044743311020'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/interesting-entrepreneurial-readings.html' title='Interesting Entrepreneurial Readings'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8949504045294473084</id><published>2009-01-22T11:12:00.003-07:00</published><updated>2009-01-22T12:59:57.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Get Inaugural!</title><content type='html'>Well, January 20th has come and gone, and thankfully everything was, while exciting and wild, still peaceful - a success.  Our home, Washington, DC, served as a wonderful host to hundreds of thousands of people.  People who came here to celebrate a new hope, a new purpose, and a new commitment to making our nation a better place to live, and a better place for our children to grow up.  It would appear that those people served as good guests as well. &lt;br /&gt;&lt;br /&gt;Jena and I wandered down towards the Capitol around 11:15 on Inauguration Day to see if we could at least hear what was going on, but things were blocked off pretty good, so we went back home and watched in our living room, where the wind chill wasn't a factor.  I know that not everyone was wowed by our new President's speech, but I was. &lt;br /&gt;&lt;br /&gt;He has made all the campaign speeches.  He already has everyone excited.  This inaugural speech was about telling people it was time.  Time to start fulfilling our promise.  Time to remind everyone that this land is OUR land.  That the government's purpose is to allow everyone the &lt;span style="font-style: italic;"&gt;pursuit&lt;/span&gt; of happiness, and not to guarantee it.  That much is up to all of us.  It's time for each of us to do our part in remaking the American dream.  I hope that all the talk and the excitement doesn't fade, like so many children's toys that fall from favor days or weeks after they are given to them.&lt;br /&gt;&lt;br /&gt;Real, tangible action will do so much to keep the momentum.  The new &lt;a href="http://whitehouse.gov"&gt;whitehouse.gov&lt;/a&gt; site was a great start - it's not perfect, but the fact is, it's symbolic of the new administration - here's what we are doing, come and see.  This says to me "this administration will not do something that we can't share, because if we can't share it, it's not something we should be doing."  Obviously this doesn't apply to clandestine services, but most of what we do as a government should be distilled in a manner that allows the average interested American to understand what, how and why it's happening. &lt;br /&gt;&lt;br /&gt;I will be interested to see how the &lt;a href="http://whitehouse.gov/agenda"&gt;agenda&lt;/a&gt; is reconciled on the site itself - so, here was the administration's agenda, and here's what really happened, here's links to votes on topics, here's discussion on this issue, etc.  There are so many possibilities.  Let's see what becomes reality.  I for one am certainly optimistic - change is always good when things are going wrong.  Different is better, at least at first, and now we just have to work together to keep it going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8949504045294473084?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8949504045294473084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8949504045294473084'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/get-inaugural.html' title='Get Inaugural!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1433298342398549873</id><published>2009-01-21T13:50:00.001-07:00</published><updated>2009-01-21T13:51:47.711-07:00</updated><title type='text'>Sick + Birthday + Busy Releasing Software = Bad Blogger</title><content type='html'>Apologies to my legion of faithful readers.  I have been a terrible blogger - be on the lookout for some good stuff in the next few days!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1433298342398549873?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1433298342398549873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1433298342398549873'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/sick-birthday-busy-releasing-software.html' title='Sick + Birthday + Busy Releasing Software = Bad Blogger'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-827595325054959351</id><published>2009-01-09T13:24:00.007-07:00</published><updated>2009-01-11T07:15:15.269-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><title type='text'>Field Guide to Setting Up Your Home Webserver</title><content type='html'>Well, it's taken a while, but I finally have &lt;a href="http://kirkandjena.com/"&gt;http://kirkandjena.com&lt;/a&gt; up and serving pages from my server at home.  This has been much more difficult than it should have been and the saga features four different operating systems, two &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DNS&lt;/span&gt; servers, multiple calls to my cable &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Internet&lt;/span&gt; provider, and more than a few headaches.  I think that there is very little thorough documentation out there about setting up a website from your house, so let me take a stab at it.&lt;br /&gt;&lt;br /&gt;First the background:&lt;br /&gt;&lt;br /&gt;I have a Dell SC430, an old piece of crap small business server that is pretty stripped down.  I had &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;OpenSUSE&lt;/span&gt; 10.2 installed on it initially, which at first was fine - it seemed to agree with my system in a pretty plug-and-play fashion.  I was pleased enough with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;UI&lt;/span&gt;, and it performed great considering it really wasn't a very high-horsepower setup, but &lt;a href="http://kirkgsworld.blogspot.com/2008/05/why-opensuse-is-no-longer-installed-on.html"&gt;then bad stuff happened&lt;/a&gt;, and I moved onto &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Ubuntu&lt;/span&gt; 8.04.  Now, I have already described &lt;a href="http://kirkgsworld.blogspot.com/2008/05/hi-ubuntu.html"&gt;my admiration&lt;/a&gt; for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Ubuntu&lt;/span&gt; 8.0.4.  It seems to come with most everything that you need on your server.  My biggest problem with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Ubuntu&lt;/span&gt; wasn't really a problem with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Ubuntu&lt;/span&gt; I guess - the resolution on my 22-in monitor wouldn't be recognized, no matter what I tried.  Apparently, this has to do with the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;bobo&lt;/span&gt; graphics card (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Radeon&lt;/span&gt; ES1000) that is delivered with the Dell SC430.  Anyway, long story short, the screen was awful to work with, and I had heard great things about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;OpenSUSE&lt;/span&gt; 11.0.&lt;br /&gt;&lt;br /&gt;I gave it a shot.  The screen resolution was recognized right away.  That was good - it was very fast, and had a great look to it.  The rub was, every time I tried to setup the network, I would lose my network connection altogether.  Even when I hit finish after making no changes, it would hose my connection completely, and I would have to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;uninstall&lt;/span&gt; and reinstall my network driver.  Not that great.  The package manager is much better on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;SUSE&lt;/span&gt; 11 though.  So, I had an epiphany.  My loyal readers will remember that &lt;a href="http://kirkgsworld.blogspot.com/2008/11/rcn-redux.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;RCN&lt;/span&gt; screwed me out of running a media center PC&lt;/a&gt; at home, because they are bad, bad corporate citizens.  I thought, why don't I make this server just a server that I only connect to using ssh, and use the idle media center as my computer at my desk.  Eureka!  I downloaded &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Ubuntu&lt;/span&gt; Server Edition 8.10, since &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Ubuntu&lt;/span&gt; did what I wanted it to.  Within mere minutes, I had a server installation loaded up, no problem.&lt;br /&gt;&lt;br /&gt;Now that I have woven this tale of woe, it's time to actually talk about what I meant to talk about:  how to actually set yourself up to have a domain name and a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;webserver&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1)&lt;/span&gt; Get your domain name.  I use &lt;a href="http://www.godaddy.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;godaddy&lt;/span&gt;.com&lt;/a&gt;.  It's a terrible website, but it is pretty cheap and simple enough.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2)&lt;/span&gt; Get a static &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;IP&lt;/span&gt; - this is more or less expensive based on whether or not you have an evil &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;ISP&lt;/span&gt;.  Despite &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;RCN's&lt;/span&gt; lame decision to force cable boxes on the masses, they have REALLY cheap business &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;internet&lt;/span&gt; and static &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;IP&lt;/span&gt; costs.  I pity the fool who uses Verizon &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;DSL&lt;/span&gt;.  It was MUCH more expensive through them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3)&lt;/span&gt; Set up your router - the steps I am describing are for a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;netgear&lt;/span&gt; wireless router.  I assume it's pretty much the same no matter what router you have as long as it's not a complete piece of junk, and was built recently:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;a)&lt;/span&gt; Set a static IP address for your server - this can be achieved by mapping an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;IP&lt;/span&gt; address to your server's mac address.  This means that every time your server receives an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;IP&lt;/span&gt; address, it can be one of your choosing.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;b)&lt;/span&gt; Setup port forwarding - now that you have it established that your server is listening on port xxx.xxx.xxx.xxx, you can setup port forwarding.  The obvious port would be 80, the default http port.  You can point 80 over so that all http requests to your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;ip&lt;/span&gt; address are routed to the web server on the server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 4)&lt;/span&gt; Set up your entry in a Domain Name Server (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;DNS&lt;/span&gt;).  You need to tell the Internet that your domain name is associated to your statically assigned &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;IP&lt;/span&gt; address.  This is accomplished by adding an entry to a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;DNS&lt;/span&gt; somewhere.  There are a bunch that you have have to pay for, but thankfully, there are a few that are free, and seem to work pretty well.  I personally used &lt;a href="http://everydns.net/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;everydns&lt;/span&gt;.net&lt;/a&gt;.  It's simple to say "associate this name with this &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;IP&lt;/span&gt; address".  Then go back to your hosting account, and set the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;nameservers&lt;/span&gt; on the domain name to point to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;nameservers&lt;/span&gt; you just setup.  Now the web knows that 195.12.4.1 points to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;myawesomesite&lt;/span&gt;.com.  This takes a while to propagate across the web, so give it time.  Once it gets to your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;ISP&lt;/span&gt; though, you will be able to type your domain name in and have it resolve to your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_38"&gt;IP&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This is the setup that takes place outside of your server.  Now you can move on to the good bits, setting up your content, your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_39"&gt;webserver&lt;/span&gt;, and any operating-system level configuration required to serve pages to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_40"&gt;internet&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 1)&lt;/span&gt; If you don't have it already, &lt;a href="http://httpd.apache.org/"&gt;get &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_41"&gt;apache&lt;/span&gt;&lt;/a&gt;.  There are about a billion tutorials on installing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_42"&gt;apache&lt;/span&gt;, so I won't bother you with the details there.  Once you have it installed and running, you should be able to type http://localhost and see the stock &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_43"&gt;apache&lt;/span&gt; page that says you have it installed.  Now you are ready to do your thing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 2) &lt;/span&gt;Decide how you want to host your content.  Do you want to host just one directory worth of stuff, or do you want to have a slightly more complicated setup.  I want to use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_44"&gt;kirkandjena&lt;/span&gt;.com for more than just one directory.  I would like to have a homepage that can link to as many things as can think of to host.  Here's how I did that:&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;a)&lt;/span&gt; set up my web root at /my/path - all you have to do is have an index.html, or index.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_45"&gt;php&lt;/span&gt; - whatever start page is defined in your &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_46"&gt;apache&lt;/span&gt; configuration - just search for '&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_47"&gt;DirectoryIndex&lt;/span&gt;'.  Add your homepage there.&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;b)&lt;/span&gt; setup as many directories of other content that you want.  These directories will be referred to by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_48"&gt;subdirectories&lt;/span&gt;.  kirkandjena.com/photos is an example of this.  These will host the content of your 'applications'.&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;c)&lt;/span&gt; now setup your virtual host.  There are quite a few examples on how to do this on the web.  The most clear documentation I have found is &lt;a href="http://www.unix-girl.com/geeknotes/apache_virtual_host_conf.html"&gt;here&lt;/a&gt;.  The idea is that you want to tell &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_49"&gt;apache&lt;/span&gt; that if it gets a request with this path and this URL, on this port, here is what you want it to do.  In this case, I may want to host multiple sites, but currently just &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_50"&gt;kirkandjena&lt;/span&gt;.com.  So I define one virtual host, saying if you get this request, here's the pages you should serve:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;style type="text/css"&gt;&lt;br /&gt;  .code { border: 1px solid #ccc; list-style-type: decimal-leading-zero; padding: 5px; margin: 0; }&lt;br /&gt;  .code code { display: block; padding: 3px; margin-bottom: 0; }&lt;br /&gt;  .code li { background: #ddd; border: 1px solid #ccc; margin: 0 0 2px 2.2em; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;/code&gt;&lt;ol class="code"&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_51"&gt;lt&lt;/span&gt;;Directory /photo/app/directory&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li class="indent0"&gt;&lt;code&gt;Options &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_52"&gt;FollowSymLinks&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li class="indent0"&gt;&lt;code&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_53"&gt;AllowOverride&lt;/span&gt; Limit Options &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_54"&gt;FileInfo&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_55"&gt;lt&lt;/span&gt;;/Directory&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_56"&gt;lt&lt;/span&gt;;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_57"&gt;VirtualHost&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_58"&gt;kirkandjena&lt;/span&gt;.com&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li class="indent0"&gt;&lt;code&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_59"&gt;DocumentRoot&lt;/span&gt; /my/content/path&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li class="indent0"&gt;&lt;code&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_60"&gt;ServerName&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_61"&gt;kirkandjena&lt;/span&gt;.com&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li class="indent0"&gt;&lt;code&gt;Alias /photos "/photo/app/directory"&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_62"&gt;lt&lt;/span&gt;;directory "/photo/app/directory"&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;Options Indexes&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_63"&gt;AllowOverride&lt;/span&gt; None&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;Order allow,deny&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;Allow from all&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_64"&gt;lt&lt;/span&gt;;/directory&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;&amp;amp;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_65"&gt;lt&lt;/span&gt;;/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_66"&gt;VirtualHost&lt;/span&gt;&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Step 3) Setup your /etc/host file.  This file will tell your machine that when things get requested on certain &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_67"&gt;IPs&lt;/span&gt;, do this:&lt;br /&gt;&lt;br /&gt;127.0.0.1       &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_68"&gt;localhost&lt;/span&gt;&lt;br /&gt;127.0.1.1       &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_69"&gt;ubuntu&lt;/span&gt;-server&lt;br /&gt;xxx.xxx.xxx.xxx     &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_70"&gt;kirkandjena&lt;/span&gt;.com&lt;br /&gt;&lt;br /&gt;The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_71"&gt;IP&lt;/span&gt; address for your site comes from the settings above (whatever &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_72"&gt;IP&lt;/span&gt; address you assigned to your server).  Restart &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_73"&gt;apache&lt;/span&gt; for good measure after updating this file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So that's it - now restart &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_74"&gt;apache&lt;/span&gt;, and if your directories are in the right place, you should be all set to start serving your pages to the world.  Hope this helps, and feel free to chime in with some pointers or corrections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-827595325054959351?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/827595325054959351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/827595325054959351'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/field-guide-to-setting-up-your-home.html' title='Field Guide to Setting Up Your Home Webserver'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3378535656441295267</id><published>2009-01-09T09:52:00.003-07:00</published><updated>2009-01-12T09:13:09.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Shameless Plug for a Guitar Hero</title><content type='html'>Like I said the other day, I have been taking guitar lessons for a little over a year now.  It's been a lot of fun.  It's a great escape from all the other stuff I do from day-to-day (you can only program and read and watch sports so often).  I feel like it opens up the creative part of my brain, and as someone who loves to listen to music, it's just kind of fun to actually MAKE some once in a while. &lt;br /&gt;&lt;br /&gt;Now I am not necessarily predisposed to being a good musician, so the fact that I have made any progress is a true testament to my awesome guitar teacher, &lt;a href="http://dcguitar.com"&gt;Dan Cohn&lt;/a&gt;.  I strongly recommend that anyone in the DC area who is interested in giving guitar a try, be it electric, acoustic, classical or not, to check him out!  He makes lessons fun, and every week you learn something new.  His website is full of testimonials from real guitarists talking about he has taken them to the next level, but he's every bit as good about getting you started.  The best thing he did was ask for a CD of music you like, so that he can teach you in a way that will get you playing those songs.&lt;br /&gt;&lt;br /&gt;Go take lessons today!&lt;br /&gt;&lt;br /&gt;Disclaimer: I didn't get any free lessons or anything to post this - just wanted to note that Dan's awesome.  Part of my 2009 resolutions are about recognition of things that are excellent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3378535656441295267?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3378535656441295267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3378535656441295267'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/shameless-plug-for-guitar-hero.html' title='Shameless Plug for a Guitar Hero'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-635674099949714497</id><published>2009-01-07T09:26:00.004-07:00</published><updated>2009-01-08T11:49:37.708-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Ode To jQuery</title><content type='html'>As someone who uses a large quantity of code written by others, I run across some pretty good stuff, some pretty weird stuff, and some pretty bad stuff, but only once in a while do I use a library and think to myself, "wow, this is pretty sweet", because after all, how sweet and awesome can a software library be.  It's a software library, after all, not a shiny red car.  jQuery is the shiny red car of software libraries.  It's pretty awesome.  Here's why:&lt;br /&gt;&lt;br /&gt;1) It takes something that's painful and makes it &lt;span style="font-style: italic;"&gt;close&lt;/span&gt; to fun.&lt;br /&gt;&lt;br /&gt;2) I can write things in succinct fashion rather than endless document.this.that.this.theotherthing notation, and define custom behavior for basically anything on the page.&lt;br /&gt;&lt;br /&gt;3) I can find a seemingly endless quantity of plugins to do almost anything I need to do.  Need a better tooltip?  Use jTip!   Need a really sweet overlay?  Use thickbox!   Need a star rating system to help your users become more interactive?  We got that.&lt;br /&gt;&lt;br /&gt;4) Everyone else is using it and making it more and more awesome all the time.  Those people are all documenting their work pretty well for the most part, and cataloging it at one central, easy to use and search site.&lt;br /&gt;&lt;br /&gt;5) It makes things that once required a fair amount of hand-written javascript into little snippets of easily replicated goodness:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;   var postTarget = "/my/awesome/path;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  jQuery.post(postTarget,&lt;br /&gt;      { var1: 'holla!' },&lt;br /&gt;        function(data)&lt;br /&gt;        {&lt;br /&gt;          handleResponse(data);&lt;br /&gt;        });&lt;br /&gt;      &lt;br /&gt;  jQuery("#ajax_loader").show();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;That little goodie does an AJAX post, then shows a little spinning wheel of wholesomeness, letting our friend the user know that we are working on their behalf.  Handle response can do whatever we want, like hiding or showing something, or inserting something new and benevolent into the DOM, using the awesome show() or hide() method, or the html( yourstringhere) method.  So good. &lt;br /&gt;&lt;br /&gt;Libraries like this are important, because as anyone who works with Javascript much knows, writing code can quickly be about the JavaScript, and not about what you were trying to accomplish.  When your focus is on the use case, and not the implementation, you can do a much better job, so jQuery, we salute you.  You are the shiny red car of javascript development.  Nerds everywhere are better for having worked with you.&lt;br /&gt;&lt;br /&gt;Postscript:  hilariously, my boss just wrote &lt;a href="http://sacrificingsleep.com/2009/01/01/why-is-jquery-so-awesome.html"&gt;almost this exact post&lt;/a&gt;, albeit more polished.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-635674099949714497?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/635674099949714497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/635674099949714497'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/ode-to-jquery.html' title='Ode To jQuery'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5949187553582300308</id><published>2009-01-06T14:00:00.006-07:00</published><updated>2009-01-07T15:17:48.971-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Finish It.</title><content type='html'>I was recently talking to a friend and former colleague about work feedback, and the most important piece of advice I could think of was to &lt;span style="font-weight: bold;"&gt;be a finisher&lt;/span&gt;.  It's easy to start things, and also really easy to get things to a certain point.  This is why R&amp;amp;D-type work is kind of fun - you figure what's possible and give it a boost and then start something else, but at some point there is a finish line, and to be effective you have to cross it.  In the case of R&amp;amp;D, perhaps to finish you have to write a feasibility study, or present findings  on the topic - without that, you just have a half-finished something that nobody really knows how to use.&lt;br /&gt;&lt;br /&gt;The world of software is littered with half-finished things.  Programs that were the result of a good idea or a real business need, but that end up languishing in the sad limbo of incompleteness.  Incompleteness has many forms.  As it relates to software, it could be in any state (not fully coded, not tested, not documented, not turned over, not marketed) that means that it can't be used to its full potential.  I am no stranger to unfinished stuff.  Somewhere out there on the web, there is a Subversion repository with a bunch of code, mostly written by me, that does a little bit of stuff, but not nearly enough to be a product.  It's unfinished, and essentially useless, and represents a bunch of wasted time.  When I left Blackboard, I was struggling to hand over four separate unfinished projects to different members of the development team.  Each could have been useful had I finished them, but when explaining them half-finished people really didn't get it or see what its potential really was.&lt;br /&gt;&lt;br /&gt;We are only given 168 hours per week on this planet, of which we have to sleep for almost one third.  That leaves us with 110-120 hours.  Now you take away mundane stuff like commuting, eating, getting dressed, etc, and you are down to about 80 hours or so.  You have 80 hours every week to finish things.  It's not a lot of time, and you have to use it pretty wisely if you are going to be even remotely effective.&lt;br /&gt;&lt;br /&gt;This seems like it's pretty tough from some folks standpoint, but compare it to something like a an auto mechanic.  I was rear-ended two days before Christmas, and while fortunately everyone involved was unhurt, my car's rear-end took a bit of a beating.  I dropped the car off at the body shop today to be repaired.  Imagine that I was called by the shop, notifiying me that the car is finished, then going to the body shop only to find that you only have half a bumper.  Would that inspire you to recommend that shop to someone you knew who needed auto repair?  That auto shop would go out of business because nobody would hire them to fix a car.  Similarly, if you as a developer can't demonstrate a finished product to their manager, or to a prospective employer, why should he or she give you a raise, or believe that you are capable of doing anything good for them in the future?&lt;br /&gt;&lt;br /&gt;Finishing is also important to your confidence as a developer.  If you have taken something from start to finish, you know that you can do that.  That's no small feat.  Like I said, there are many unfinished works out there.  That's a lot of stuff that hasn't been done.  You will learn all the things there to learn in the home stretch - things you would never learn unless you tread in that area.  You learn about how to verify the quality of something, about how to ensure that a user can use what you have built, how to document what you have built so that you can explain it to someone who uses it, or better yet, how it can explain itself.  You may even learn how to 'sell' it - to convince others that it is worth using, and to get them to adopt it.  These are things you can never learn in full by going half way, or even three quarters.&lt;br /&gt;&lt;br /&gt;Working at a small company has taught me to finish.  I am certainly no expert, but I have become much better at it, because if I don't finish, nobody else is going to finish it for me, and we can't afford not to finish things with such a small team.  2009 is a year where I hope to do a lot more finishing at work and on my personal endeavors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5949187553582300308?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5949187553582300308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5949187553582300308'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/finish-it.html' title='Finish It.'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5490132525637950585</id><published>2009-01-06T08:10:00.004-07:00</published><updated>2009-01-06T08:20:56.951-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>When Bad Error Messages Attack!</title><content type='html'>When considering how you should display error messages to your users, try to shy away from error messages like this:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;There was an error connecting to the database.  Please try playing the game again later, &lt;span style="font-weight: bold;"&gt;or right now&lt;/span&gt;.&lt;/blockquote&gt;Not the best, most informative message, but hey, at least we get a choice, right? &lt;br /&gt;&lt;br /&gt;Quality error messages (or lack thereof) seem to really separate polished applications from those that are a bit hackish, when you using various sites on the web.  It's the kind of thing that's a real pain in the ass to fix after the fact, so start out with good, informative messages, and a good framework to handle logging and error notification.  This means "don't pipe your errors to System.out".  When you do that, you end up with 64GB catalina.out files that aren't rotated.  While disk space is cheap, it's not &lt;span style="font-style: italic;"&gt;THAT&lt;/span&gt; cheap.&lt;br /&gt;&lt;br /&gt;* These pieces of advice are not meant in any way to convey the illusion that the author of this blog has never made any of these mistakes (except the wack error message).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5490132525637950585?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5490132525637950585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5490132525637950585'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/when-bad-error-messages-attack.html' title='When Bad Error Messages Attack!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-9140373845491851127</id><published>2009-01-02T05:45:00.004-07:00</published><updated>2009-01-02T09:34:47.326-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Goodbye 2008</title><content type='html'>Welcome to a new year.  This post will be the obligatory "look back, look forward" post that all self-respecting bloggers seem to make.  Since I aspire to be self-respecting (at least I can respect myself if nobody else will), here goes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;2008&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2008 was a pretty awesome year, as far as years go.  Let's recap the highlights:&lt;br /&gt;&lt;br /&gt;1) I got married!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ericdenman.com/pics/083/09-06-KirkWedding/p103.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 304px; height: 457px;" src="http://www.ericdenman.com/pics/083/09-06-KirkWedding/p103.jpg" alt="" border="0" /&gt;&lt;/a&gt;  After six long years of wondering if I could sucker Jena into spending the rest of her life with me, she finally caved, and we had a beautiful (if somewhat Hannah soaked) ceremony, and a fantastic reception with our family and best friends there.  It was a great, great day, and as a bonus, almost four months later, Jena is still sticking with me!  I not only gained a wife, but a large new family, all of whom had already treated me like family.  I am happy and honored to be official. &lt;br /&gt;&lt;br /&gt;2) We went to Italy for almost three weeks to celebrate our wedding!  We started in Roma, taking in as many historical sights and as many gelatos as possible for three days.  We saw the Vatican, walked through the city, checking out such tourist standbys as the Spanish Steps, Trevi Fountain, the Colosseum, and the other 2000 year old stuff that Rome offers.  We then hopped a ferry to Sardinia where we spent a week enjoying the relaxing coast, and eating delicious Sarda fare.  Then it was back to the mainland for a week in Tuscany, exploring more history, eating, drinking Chianti, and taking hot air balloon rides.  Fantastic trip.&lt;br /&gt;&lt;br /&gt;3) I got a new job at Sportsvite back in March, and have been flooding my brain with new stuff ever since.  I think this is the year I sort of 'turned the corner' in my career.  I was always pretty good at what I did, but I think this year, and the switch to a new job has really sealed it for me as far as a higher-level understanding of all the moving parts.  Like I talked about in &lt;a href="http://kirkgsworld.blogspot.com/2008/11/reasons-why-developer-life-at-startup.html"&gt;this post&lt;/a&gt;, it's great to work as a developer at a startup, because you really become a solid generalist.  There aren't enough people around to just focus on one area.  You have to touch everything, and this requires some level of understanding. &lt;br /&gt;&lt;br /&gt;4) I got a lot better at the guitar.  I have been taking lessons solid for about a year now, and I have really come a long way.  I am not going on tour anytime soon, but I am certainly much less incompetent on the guitar, and can pick up and play most simple songs.  If my stupid fingers would cooperate with barre chords more, I could play a lot more.  Guitar is something I have always wanted to play, and my wonderful wife got me one for Christmas a couple of years ago.  It took me a while to realize I'd need lessons, but once I finally got started, the progress has been really encouraging. &lt;br /&gt;&lt;br /&gt;5) I blogged a fair amount...and it sucked for the most part, I think.  The bright side is that in the haystack, there were some decent needles.  May 2009 be better on that front.&lt;br /&gt;&lt;br /&gt;Happy New Year - 2009 is coming next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-9140373845491851127?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/9140373845491851127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/9140373845491851127'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2009/01/goodbye-2008.html' title='Goodbye 2008'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8357486602727542587</id><published>2008-12-24T08:26:00.004-07:00</published><updated>2008-12-24T09:00:17.484-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Why I Keep this Blog Thing Up</title><content type='html'>I often ask myself why I do this blogging thing.  I thought some more about it after reading my colleague &lt;a href="http://www.blog.littyhoops.com/2008/12/18/writer-author-blogger/"&gt;Brian's post&lt;/a&gt; about his blog writing.  Asides from keeping the 17-25 people who end up here every day up on all the banal elements of my life, I have kind of figured out why I started doing this and kept doing it.  It's the fact that I can CREATE and PARTICIPATE by using this blog, even if the product isn't always the finest work.&lt;br /&gt;&lt;br /&gt;There are a few things that I love in this world.  I love my wife.  I love my family.   I love baseball.  I love music.  I love reading.  The only thing I can really participate in anymore out of those is my marriage, and my family life.  I can't really play baseball anymore thanks to an arm injury that has left my shoulder brittle and prone to reinjury, despite the surgery I had to get just to make it functional.  All I can do is watch, remember, and enjoy the strategy of the game.  For a short time I coached little league, but my current commitments leave me without the time to continue with that.  I love listening to music.  I love all sorts of music, but can play virtually none of it.  I have picked up the guitar, but I am certainly not very good at it yet.  All I can do is passively enjoy, and fumble through a few chords.  I read.  A lot.  Reading is one of my passions.  I read and read and read, and wonder how it is that there are people out there whose brain is able to generate the creative juices required to weave interesting tales together.  People like &lt;a href="http://doodleplex.com/glassmaze/"&gt;my friend Ramsey&lt;/a&gt;, who are brilliant engineers by day, and extremely gifted writers by night.  All I am good at is devouring the content.&lt;br /&gt;&lt;br /&gt;All of these things are passive.  Listening, reading, watching.  I am passive.  This blog is the only thing that I &lt;span style="font-style: italic;"&gt;create&lt;/span&gt; most days that isn't just paid work.  So, despite the uneven quality of the output, it's my stab at escaping passivity.  I would like to say that it's cathartic, and sometimes it is.  Sometimes it's just to talk about what I do, without having to directly bore someone to death face-to-face.  Sometimes it's because I think it will help someone else.  My most popular post is this &lt;a href="http://kirkgsworld.blogspot.com/2008/09/funky-eclipse-error.html"&gt;Eclipse error post&lt;/a&gt;.  It's kind of sad, because I've written all this stuff about my father, and about my work, and my ambitions, and a post about troubleshooting an IDE error is the number one post, followed closely by my gripes about my cable company.  I hope to find a way in 2009 to post interesting things that are also popular.  To that end, please feel free to comment anytime you wish, so that I may improve my content for those of you who out of guilt or necessity read this regularly.&lt;br /&gt;&lt;br /&gt;Oh, and HAPPY HOLIDAYS!  Radio silence will commence, as we are off to Indiana (grandparents house is an internet free zone), and your regularly scheduled swill will resume on Monday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8357486602727542587?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8357486602727542587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8357486602727542587'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/why-i-keep-this-blog-thing-up.html' title='Why I Keep this Blog Thing Up'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2892829010813610660</id><published>2008-12-22T11:00:00.003-07:00</published><updated>2008-12-22T11:13:42.720-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>The Ghost of Startup Past</title><content type='html'>Well, as of last week, I have reached the formal dissolution of my very first startup.  We met and signed some paperwork that says we all agree that we no longer exist, and to reallocate our shared resources.  I found it so fitting that the end of this startup was so well organized.  I think that this startup was interesting because we had all the organizational stuff down pat, operating agreements, etc.  What we didn't have was the compelling product strategy and drive.  So often, reading blogs of other startup folks, it's the exact opposite.  This time around, I plan to spend 99% of my time on WHAT MATTERS.  I must admit it felt good to be legit, and being incorporated and all that jazz gave me a false sense of accomplishment.  I am now a year or two older (wiser too, hopefully?), and I am much more concerned with brass tacks.&lt;br /&gt;&lt;br /&gt;The other big problem I faced last time personally was the unrelenting desire to build cool stuff.  To build stuff from scratch, and to not rely on conventions or libraries.  I think I have grown over the past couple of years as a developer, to the point where I am much more confident in my ability to get things done.  I know I can build things if I need to.  Therefore, the choice &lt;span style="font-weight: bold; font-style: italic;"&gt;not&lt;/span&gt; to write cool software things is much easier to make.  Now I want to &lt;span style="font-weight: bold; font-style: italic;"&gt;build a product&lt;/span&gt;.  If this means that I take something that's already built, and add value to it by focusing on &lt;span style="font-weight: bold;"&gt;FUNCTIONALITY&lt;/span&gt;.  I want to create value for the user, and not create nerd brownie points for myself.  Sourceforge is littered with projects that were the result of geeks trying to put a feather in their cap and some new acronyms on their resume.  These projects are out on Sourceforge now because they couldn't sell them, in many cases.&lt;br /&gt;&lt;br /&gt;To that end, I vow to not be 'cool' technically.  Rather, I plan to be "functionally benevolent".  I will ask people what they want, and build it as simply as possible.  There are some wonderful building blocks out there, and I am going to use them.  Let's hope that this all leads to some success in the new year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2892829010813610660?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2892829010813610660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2892829010813610660'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/ghost-of-startup-past.html' title='The Ghost of Startup Past'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-718252537348616796</id><published>2008-12-22T05:55:00.002-07:00</published><updated>2008-12-22T06:00:17.825-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sports'/><title type='text'>Dear Ryan,</title><content type='html'>Attn: Ryan Grant, RB, Green Bay Packers&lt;br /&gt;Re: Winning me my money&lt;br /&gt;&lt;br /&gt;I am not sure if you read my blog, but if you do, I wanted you to know that I would love it if you would score 11 points tonight against Chicago.  My pathetic fantasy hopes have come down to this.  I am losing my third place game 68-58.  If I would have started your peer, Mr. Portis, I would have already won my $150 back, but I didn't, so I need you to help.  I will offer you my undying gratitude in return, and if you send me an address, I will send you a gift card to Olive Garden for $11.  If you don't score at least 11 tonight, I will put a hex on you that the most esteemed faith healer won't be able to cure.  The best course of action would be to take your first run from scrimmage the distance, thus winning for me and making it less stressful for both of us.  I hope you do the right thing.&lt;br /&gt;Sincerely,&lt;br /&gt;Kirk Gray&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-718252537348616796?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/718252537348616796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/718252537348616796'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/dear-ryan.html' title='Dear Ryan,'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7623631204472981806</id><published>2008-12-18T13:01:00.002-07:00</published><updated>2008-12-18T13:07:31.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ramblings'/><title type='text'>Rhee!</title><content type='html'>Has anyone every gotten more press for doing less than Chancellor Rhee of the DC Schools?  Don't get me wrong - I think she is doing things that are incredibly necessary for this broken school system we have here.  Her argument for pay-for-performance for teachers is definitely reasonable - if you don't think you can do your job, then you probably don't deserve tenure anyway.  I realize that education isn't that simple, but at some point someone has to draw a line and say "we have to start to fix this, and hope that the parents get on the bus sooner or later". &lt;br /&gt;&lt;br /&gt;I am listening to the podcast of Rhee on Diane Rehm.  I really want to hear about Rhee, but goodness would Rehm please, please, please speed it up?  Anyone else hear the similarity between Rehm and this:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6rO2HZKyazw&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/6rO2HZKyazw&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Just sayin...she gets good guests, but her show could be about 20 minutes shorter if she would just spit it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7623631204472981806?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7623631204472981806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7623631204472981806'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/rhee.html' title='Rhee!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-5407024134207879080</id><published>2008-12-18T07:14:00.002-07:00</published><updated>2008-12-18T07:32:51.130-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>What's Up, December!</title><content type='html'>Well for anyone who's interested, here's the latest happenings. &lt;br /&gt;&lt;br /&gt;I am in the last stages of getting our wedding photos online.  I have setup Gallery2 on the server at home.  It's a great PHP app that allows you to host your photos, that my buddy Nick put me on to.  I hope everyone will enjoy it.  I have the domain name for our server, and I think I have resolved the DNS server stuff (more on how to do all this in a separate post, since it simply does not seem like there is one place to get all the information you need to do all this on your own, and I had a lot of trouble cobbling it together from the disparate sources.  I hope it will help others who find themselves in my situation.  At any rate, the wedding pictures are awesome.  If anyone has any sort of professional photography needs, then by all means, check out Thomas Graves.  He is personable, talented, and on the day of the event, extremely unobtrusive, while capturing all the special moments.  If anyone wants to see a preview, check out &lt;a href="http://thomasgraves.com/jk0906/"&gt;this site&lt;/a&gt;.  Thomas put together a little sampler before we got all the photos.&lt;br /&gt;&lt;br /&gt;We also have all of our honeymoon pictures up on Snapfish, so feel free to &lt;a href="http://www1.snapfish.com/thumbnailshare/AlbumID=244268956/a=3351517_3351517/t_=3351517"&gt;take a look&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I just finished &lt;a href="http://www.amazon.com/Professor-Madman-Insanity-English-Dictionary/dp/006099486X"&gt;The Professor and the Madman&lt;/a&gt;, which turned out to be a fantastic story.  I mentioned it before, but the story is about the creation of the venerable Oxford English Dictionary, and one of its most prolific contributors, Dr. William C. Minor.  For anyone not familiar with the OED, it was an incredible undertaking that required decades of work before it was all released.  A dictionary is an interesting thing, because it's obviously never finished, as new words pop up every day.  Minor's incredible contributions to the dictionary (tens of thousands of definitions and supporting quotations), are no small feat for anyone, but are more amazing when you consider that he was a lunatic, who murdered someone because of his paranoid delusions, and was doing his word from an insane asylum.  The story takes the reader through a quick history of dictionaries, the OED's beginnings, the life of the OED's leader, James Murray, and the life of William Minor.  It's a pretty short, quick read, and I would recommend it to anyone who is interested in words or just interesting historical stories in general.&lt;br /&gt;&lt;br /&gt;I am now back on This is Your Brain on Music, which I started and shelved a while ago, and have also made it about a quarter of the way through &lt;a href="http://www.amazon.com/Leonardo-Vinci-Flights-Mind-Biography/dp/0670033456"&gt;Flights of the Mind&lt;/a&gt;, a biography of Leonardo Da Vinci.  So far I have only made it through his apprenticeship, but it's definitely interesting, if for no other reason, because we were just in Florence for our honeymoon, and can picture the scenes described in the book, along with the works of art that I just saw in the Uffizi Gallery.  What makes these renaissance thinkers so amazing is the fact that with minimal real academic training, they produced incredible output, be it art, science, or literature.  These people are simply brilliant, and their achievements just seem to dwarf anything that is taking place now.&lt;br /&gt;&lt;br /&gt;Christmas is fast approaching, and we will be heading to Indiana to visit my Grandparents.  I know they are excited, and I am excited too, to spend my first Christmas with my beautiful wife.  What else...We are also getting the house painted finally - Jena had the kitchen redone some time ago, but we never ever got the patch work and painting done, so now's the time.  The first estimate comes today - hopefully it won't be ridiculous.  I have no concept of how much house painting costs.&lt;br /&gt;&lt;br /&gt;Work is busy.  I have moved on to new projects, and no longer have to dwell on the evil LAMP site install.  It's back to Sportsvite core stuff, which is much more fun.  Currently, I am finishing the latest round of updates to our Powerade/CBS Sports partner site.  I have been able to use some interesting libraries in this endeavor.  I have also been toying with content by using some of the Web APIs out there, like YouTube and Flickr's.  The world of content that is consumable is fascinating to me.  The interwoven world of the web allows everyone to focus on what they are best at, and to supplement their offerings with other people's core competencies.  Incredible.  I think things will really get rolling when our fourth engineer joins the team in the new year.  There are so many cool things coming down the pike.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-5407024134207879080?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5407024134207879080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/5407024134207879080'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/whats-up-december.html' title='What&apos;s Up, December!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6918714390827071313</id><published>2008-12-18T07:12:00.001-07:00</published><updated>2008-12-18T07:14:13.817-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>Radio-Free Amtrak</title><content type='html'>Why is it that regional train service doesn't include internet service?  Is there any legitimate excuse for this?  In an age when there are AIRLINES (not an industry that screams 'Customer Service!') that provide wireless internet service while you fly, where you can go to McDonalds in some places and hop online, you can't take a train (a very business function), and get online. &lt;br /&gt;&lt;br /&gt;I can take the $20 bus to New York city, and guess what?  I can get wireless internet!  They have plugs on the trains, so you charge your computer, but you can't get on the web.  Boo.&lt;br /&gt;&lt;br /&gt;That said, it's way better than flying.  I get to the train station at 6:15 for the 6:30 train, and bam, get a coffee and get on the train.  No arriving 2 hours early and going through security.  Despite this, I sit here thinking about how much it sucks not to have wireless.  I need to go back and re-read A Complaint Free World.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6918714390827071313?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6918714390827071313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6918714390827071313'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/radio-free-amtrak.html' title='Radio-Free Amtrak'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2382659873404791673</id><published>2008-12-12T13:57:00.003-07:00</published><updated>2008-12-12T14:01:48.116-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><title type='text'>This Just In:</title><content type='html'>From the "don't do this on your site" file:&lt;br /&gt;&lt;br /&gt;If you are going to have a form that requires a captcha to submit, and you choose to display virtually illegible captchas (see below), then don't zap the form contents into the ether when your user inevitably gets the captcha wrong.  (Talking to you, &lt;a href="http://mybloglog.com/"&gt;mybloglog&lt;/a&gt;).  I wrote this nice long post to support to let them know there was an issue I didn't really care about, but thought they might, and now it's just lost in the webs.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SULRCU0SCfI/AAAAAAAAAFA/EsGU_W3HncM/s1600-h/illegible-captcha.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 49px;" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SULRCU0SCfI/AAAAAAAAAFA/EsGU_W3HncM/s200/illegible-captcha.png" alt="" id="BLOGGER_PHOTO_ID_5279011551109581298" border="0" /&gt;&lt;/a&gt;Boo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2382659873404791673?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2382659873404791673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2382659873404791673'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/this-just-in.html' title='This Just In:'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yrO-Y2qwU_A/SULRCU0SCfI/AAAAAAAAAFA/EsGU_W3HncM/s72-c/illegible-captcha.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2169253510509515384</id><published>2008-12-12T12:42:00.002-07:00</published><updated>2008-12-12T12:50:27.251-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Tricks I Should Have Been Using a Long Time Ago</title><content type='html'>As I mentioned when I first got my Macbook, I think that &lt;a href="http://kirkgsworld.blogspot.com/2008/04/macbookprosweetsauceawesomecomputercom.html"&gt;sudo sucks&lt;/a&gt;.  What I failed to do was make my life any easier by developing some shortcuts.&lt;br /&gt;&lt;br /&gt;I just finally got around to adding a bunch of aliases to my /etc/profile file:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;alias tomcatDebug='sudo /tomcat-dir/bin/catalina.sh jpda start'&lt;br /&gt;alias tomcatRun='sudo /tomcat-dir/bin/catalina.sh run'&lt;br /&gt;alias tomcatStart='sudo /tomcat-dir/bin/catalina.sh start'&lt;br /&gt;alias tomcat='sudo /tomcat-dir/bin/catalina.sh'&lt;br /&gt;alias apacheStop='sudo /apache-dir/bin/apachectl stop'&lt;br /&gt;alias apacheStart='sudo /apache-dir/bin/apachectl start'&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;I am going to add about a million of these, because I constantly do way too much switching directories and typing.  Any self-respecting nerd probably has stuff like this, but for the rest of us dummies, hopefully this will help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2169253510509515384?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2169253510509515384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2169253510509515384'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/mac-tricks-i-should-have-been-using.html' title='Mac Tricks I Should Have Been Using a Long Time Ago'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-127075130539415052</id><published>2008-12-12T12:26:00.002-07:00</published><updated>2008-12-12T12:30:21.551-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='odd'/><title type='text'>Wow</title><content type='html'>I was reading the Philly newspaper that Jena brought back from her trip last weekend, and in the classifieds, I ran across a bizarre ad that basically said "Fart a lot?  Get paid for it".&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;I thought it couldn't be real.  I was wrong:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SUK7nIcUowI/AAAAAAAAAE4/9VJLGIn4hL4/s1600-h/odd.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 206px; height: 206px;" src="http://1.bp.blogspot.com/_yrO-Y2qwU_A/SUK7nIcUowI/AAAAAAAAAE4/9VJLGIn4hL4/s320/odd.png" alt="" id="BLOGGER_PHOTO_ID_5278987994187211522" border="0" /&gt;&lt;/a&gt;So strange.  We live in a strange world.&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/3444412265952661654-127075130539415052?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/127075130539415052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/127075130539415052'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/wow.html' title='Wow'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_yrO-Y2qwU_A/SUK7nIcUowI/AAAAAAAAAE4/9VJLGIn4hL4/s72-c/odd.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3381404125653519521</id><published>2008-12-12T09:23:00.002-07:00</published><updated>2008-12-12T09:33:19.274-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><title type='text'>Come on, UAW</title><content type='html'>UAW should file paperwork to change their name to &lt;span style="font-weight: bold;"&gt;Unemployed&lt;/span&gt; Auto Workers, because that's where this is headed.  What this move says to me is that they don't have a lot of faith in the Big 3 to avoid bankruptcy, whether or not they get the bailout, so they might as well milk the money cow until it happens.  Otherwise, how you can justify a decision to save the entire industry.  I am sad for Michigan right now.  It has been in the grips of greed and incompetence now for too long, and I can only hope that the bottom is near. &lt;br /&gt;&lt;br /&gt;With news of a potential White House bailout being floated about, I frankly hope that Washington doesn't blink - anyone who is criticizing Congress for asking questions is kidding themselves.  Just because Congress isn't perfect doesn't mean that these questions don't need to be asked.  Would we all rather just dump taxpayer money into a broken company just to keep it afloat and broken for a few more months??&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3381404125653519521?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3381404125653519521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3381404125653519521'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/come-on-uaw.html' title='Come on, UAW'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2223050048846254087</id><published>2008-12-11T14:50:00.004-07:00</published><updated>2008-12-11T15:02:54.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='metro'/><category scheme='http://www.blogger.com/atom/ns#' term='dc'/><title type='text'>When will WMATA get one of these?</title><content type='html'>Was reading Scripting News, by Dave Winer on Google Reader and came across &lt;a href="http://www.scripting.com/stories/2008/12/08/isYourSubwaySystemAPlatfor.html"&gt;this post &lt;/a&gt;that talked about the BART exposing a web API.  I immediately wondered if our wonderful friends at WMATA had something like this.  I discovered a &lt;a href="http://twitter.com/wmata"&gt;twitter account&lt;/a&gt; apparently updated by the good people at Metrorail.  Note that every single entry is 'double-tweeted'.  If they can't get simple things like this right, my confidence in their ability to push out a public API wanes quickly.  I found this site called &lt;a href="http://meenster.com/"&gt;meenster&lt;/a&gt;, which got rave reviews &lt;a href="http://dc.metblogs.com/2007/07/23/meenster-a-metro-site-that-rocks/"&gt;here&lt;/a&gt;, but it doesn't seem to show me very much.  I don't know if it is broken temporarily or just completely defunct, but this is what I see for bustling Metro Center:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SUGNY9Al3dI/AAAAAAAAAEw/v4qFYwq6zWU/s1600-h/meenster-fail.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 248px; height: 127px;" src="http://4.bp.blogspot.com/_yrO-Y2qwU_A/SUGNY9Al3dI/AAAAAAAAAEw/v4qFYwq6zWU/s320/meenster-fail.png" alt="" id="BLOGGER_PHOTO_ID_5278655698088353234" border="0" /&gt;&lt;/a&gt;Not terribly confidence-inspiring news there.  Ah well, I guess it was extremely wishful thinking there.  Back to your regularly scheduled programming.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2223050048846254087?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2223050048846254087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2223050048846254087'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/when-will-wmata-get-one-of-these.html' title='When will WMATA get one of these?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_yrO-Y2qwU_A/SUGNY9Al3dI/AAAAAAAAAEw/v4qFYwq6zWU/s72-c/meenster-fail.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8939356099288045629</id><published>2008-12-11T13:25:00.003-07:00</published><updated>2008-12-11T14:20:46.071-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jmu'/><title type='text'>Go Dukes</title><content type='html'>When I got to college in the fall of 1995, I was pretty excited to be there.  There was tons of stuff to do, new people to meet, college athletics to watch, and lots of free beer.  James Madison at the time was a medium-sized state school, with about 9,000 undergrads.  There were two buildings across the interstate, but most of the campus was located on the east side of I-81.  I was assigned to Eagle Hall (tallest building in Harrisonburg, checking in at EIGHT stories), on the sixth floor or a building whose elevator was not the most reliable.&lt;br /&gt;&lt;br /&gt;The only good thing about this building, and being on this floor, was the skybox view of the football field.  Bridgeforth Stadium has come a long way.  Thirteen years ago, it was a very basic stadium, with standard metal bleachers on either side, and was open at both ends.  It was crappy astroturf.  On gamedays, you would inevitably find it half full.  We didn't have to go to the games, because we could sit in our rooms and watch Mike Cawley sling it all over the field, to other future NFL also-rans like Macey Brooks and Ed Perry.  It was a fun brand of football to watch, though somewhat lacking in defensive intensity - there were many scores like 42-35.  This is okay, because when you don't know the name of ANYONE playing in the game (not a lot of national notoriety for teams like New Hampshire or Richmond), you just want to see the scoreboard light up.    They made the playoffs that year, if I remember it right, but they played on the road and lost in the first round.  That was the last year that they were good for some time.  My first year was also the second-to-last year of Lefty Driesell's time at Madison.  The basketball team took a nosedive as well, after his departure to Georgia State.&lt;br /&gt;&lt;br /&gt;Needless to say, my (more than four) years at Madison didn't make me a diehard JMU fan.  I have pretty much stuck to my guns as a Michigan Wolverine fan, as my father raised me.  They played games that mattered, were on TV regularly, and I could share the fun with my father.  Even James Madison's National Championship football team in 2004 couldn't sway my allegiance.&lt;br /&gt;&lt;br /&gt;Flash forward to last weekend.  I am watching important football late in the season, but it ain't Michigan - oh no.  They are 3-9, playing in the toilet bowl.  This was James Madison in the playoffs yet again.  It's a pretty big school - with a sprawling campus on both sides of I-81.  There are 18,000 full time students now.  A football powerhouse, they have been ranked #1 in 1-AA since upending the three-time defending champion Appalachian St team.  I watched them last weekend, and came away not thinking "wow they are good for a 1-AA team", but rather, "wow, they are good".  Also, I am pretty certain that if Michigan had Rodney Landers, who is a complete freak, that they would have gone 8-4 at worst this season.  The guy is nasty.  Make that Nasty with a capital N.  Just watch #7 in these clips.  Silly.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jvVxdj5n-QE&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/jvVxdj5n-QE&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Tomorrow night, the Dukes will play in front of a packed house, in front of an increasingly cool and growing stadium, next to a giant parking deck that didn't used to be there, against Montana.  On ESPN2.  And they are going to win.  And then they are going back to the championship.  And I sure hope they win that one too.  Anyway, the point of this post was that it's nice to actually be interested in your alma mater's sporting fortunes.  Go Dukes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8939356099288045629?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8939356099288045629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8939356099288045629'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/go-dukes.html' title='Go Dukes'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3743353774728618238</id><published>2008-12-10T07:34:00.004-07:00</published><updated>2008-12-11T10:55:14.409-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='media'/><title type='text'>Recession + Information = Comeback</title><content type='html'>Media is all different now.  As this week's bankruptcy filing by Chicago Tribune illustrates, nothing is sacred in media any more.  Almost all print media is laying off employees, and only those who were extremely forward thinking about the web and its potential will survive intact and profitable.  "News" is still available in newspapers, and on the tradition news sites online, like cnn.com and msnbc.com.  There is some analysis in the papers as well, in the form of editorials and columns, but, the vast majority is local news or newswire stuff.  For better or worse, it seems like the real brunt of the "thought-work" has shifted onto the web.  Obviously, since the barriers to entry on the web are low-to-nonexistent, so the existence of authoritative sources of news and analysis on the web are not a product of a name brand, but of the amount of followers the given site has.  This is dangerous, but the good definitely outweighs the bad.&lt;br /&gt;&lt;br /&gt;In the face of this, the way we react as a nation to the current state of the economy is quite interesting.  The last time we were in a situation this dire (by most accounts the Great Depression), the knowledge and understanding about the technical minutiae of the crisis was concentrated in the brains of a very small group of people like Keynes, Schumpeter, Robbins and Hayek.  Now, the science of Economics is much more mainstream, and there are far more people out there who understand (at least at some level) what is going on in the economy, what it means, and what to do about it (to a somewhat lesser extent).  There are amazing modeling tools that make the what-if part of economics and econometrics so much more productive.  Even more fascinating is that these economists are&lt;span style="font-style: italic;"&gt; talking to us directly&lt;/span&gt; about what is going on, and what it all means.  You can read near-daily blog posts from some of the great economic minds of our time about the current events, putting all the economic theory into context. &lt;br /&gt;&lt;br /&gt;When I was taking these economics classes during my time at James Madison University, it was pretty rare to get economic theory and context in the same class (thank you &lt;a href="http://www.heritage.org/about/staff/davidkreutzer.cfm"&gt;Dr. Kreutzer&lt;/a&gt; for being one of the good ones who made a real effort to do this).  Gregory Mankiw wrote the book I used for microeconomic theory.  Now I can read &lt;a href="http://gregmankiw.blogspot.com/"&gt;his blog&lt;/a&gt; every day.  You get real-time comment about such nebulous topics as bailouts, credit markets, unemployment, and whatever else you want.  All this from brilliant folks who just want to share.  Incredible. &lt;br /&gt;&lt;br /&gt;I think that this information availability, and the wisdom of crowds will speed up the business cycles in our country.  We have already seen the cycles speed increase on the way up - now we are seeing a blitzkrieg-style downturn.  I believe that we will see a similarly quick end to this crisis.  (I hope).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3743353774728618238?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3743353774728618238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3743353774728618238'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/recession-information-comeback.html' title='Recession + Information = Comeback'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-850441139673242808</id><published>2008-12-09T16:11:00.006-07:00</published><updated>2008-12-10T07:05:09.574-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The Part Where The Java Developer Uses PHP</title><content type='html'>Any illusions I may have had about my PHP prowess were all but shattered over the past couple of days.  What initially seemed like a fantastically successful migration disintegrated into a day of vigorous LAMP-stration, as I struggled through what seemed like a virtually impossible issue.  Most everything was working - all read operations were just fine.  Many inserts and updates were working as well.  After about half an hour of poking around, I realized that the problem was that we weren't able to submit any form that included text with a single quote in it.  Shouldn't be a problem right?  I know the issue!  Let's fix it.  Not so fast my friend...&lt;br /&gt;&lt;br /&gt;Here is the tale of my woe:&lt;br /&gt;&lt;br /&gt;1) My first thought was "Google, single quotes php mysql".  That's exactly what I did, and immediately found a reference to 'magic_quotes'.  After reading the &lt;a href="http://us2.php.net/magic_quotes"&gt;php help&lt;/a&gt;, I was pretty sure this was it.  A thing that is built in to php to save the unsafe programmers from the evils of sql injections, by escaping special characters that are submitted as part of a form.  That certainly includes single quotes.  A-ha!  This'll be quick.  I verified that on the old server, and locally, this option was being used.  I did this by running php -i, to get the php info.  Here's what I saw on both of those servers:&lt;br /&gt;&lt;br /&gt;magic_quotes_gpc =&gt; On =&gt; On&lt;br /&gt;&lt;br /&gt;So I assumed that when I ran php -i on the new server, I would see&lt;br /&gt;&lt;br /&gt;magic_quotes_gpc =&gt; Off =&gt; Off&lt;br /&gt;&lt;br /&gt;Imagine my surprise when I ran php -i | grep magic, and saw&lt;br /&gt;&lt;br /&gt;magic_quotes_gpc =&gt; On =&gt; On&lt;br /&gt;&lt;br /&gt;How could that be?  This was a definite crossroads in my debugging process, and I chose the wrong road.  I could have verified that this was actually the case, but instead what I did was this:&lt;br /&gt;&lt;br /&gt;2) Figure out how to escape strings in php prior to inserting into the database.  Of course this application isn't using prepared statements - that would be too simple.  Despite the availability of this option, no dice.  That would solve everything, because the strings would be escaped as part of the persistence logic.  Wrong.  I played around with mysql_real_escape_string, which would work, but since this codebase has no persistence layer, I would to make a change to every single php file that posts to the database, and that just isn't practical for a product that we hope not to touch too much.  So...the next option is to override the query() function in mysqli, to do some logic to escape the characters that need escaping.  I started trying to do this, and wasn't getting anywhere, because it was pretty difficult to debug through this issue on the production to make sure that the new query logic was even being called.  This was made especially difficult because of the sheer amount of cruft in the php_error_log.&lt;br /&gt;&lt;br /&gt;Aside: Broken Windows&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows"&gt;Broken Windows theory&lt;/a&gt; is something that I heard a lot about during my time at Blackboard.  The idea is that if you clean up the trash on a sidewalk, people are much less likely to litter.  If you paint over all the graffiti, people won't tag on that wall.  It was discussion in Freakonomics, and it a central theme in New York City's recovery from their crime epidemic of the 70s and 80s.  At Blackboard, we had gotten pretty lax about what ended up in the log files.  This sucks for a number of reasons.  Under heavy use, this fills up the log files pretty quickly, using up disk space and cpu cycles to write the files.  Under any usage level, it certainly makes it harder to see what the problems are in your software.  The log is a place for things that you want to be there, like errors, warnings, and informational statements that you want there.  It's not a good place for "Made it here at line 262", and "id coming in is: 12".  That doesn't help anyone, and hasn't helped anyone since the person who put it in the log in the first place.  My old manager was very astute in pointing this out, and making sure we did somethin about it.  We made it a point at Blackboard to edit any code that did unnecessary print statements, and it really made a difference.  Furthermore, nobody wanted to be the one who left gratuitous logging in the code.&lt;br /&gt;&lt;br /&gt;Back to the story.&lt;br /&gt;&lt;br /&gt;Once I decided that it couldn't be a php code thing, and definitely wasn't a mysql thing, I moved on to sheer despair and anger.  This is probably not the best way to go about things, but it's where I was at.  A walk to the coffee store with my boss led me to re-examine the php.ini file.  See, I had compiled and tried to install php to include some packages that weren't installed initially, and it was a bad bad idea.  Now, on this machine there are two versions of php.  One is running on apache for the site - it's php 5.1.6.  The php I installed was 5.2.6.  Now I check and see what the options are for php again.  Same thing.  No way, I think.  I finally did what I should have done a while ago and read the php.ini file.  Guess what:&lt;br /&gt;&lt;br /&gt;magic_quotes_gpc =&gt; Off =&gt; Off&lt;br /&gt;&lt;br /&gt;How about that.  I fixed that, and the problem is now solved.  Voila.&lt;br /&gt;&lt;br /&gt;The Moral of the Story&lt;br /&gt;&lt;br /&gt;When I was doing interviews at Blackboard, I usually asked the candidates a few standard java questions to make sure they had a basic level of competency.  Then I dove into problem solving techniques.  So many people simply failed to even start any sort of critical thinking.  I think that next time I am interviewing, I am going to use a version of this issue as my problem solving question.&lt;br /&gt;&lt;br /&gt;Lessons learned - don't install php when it's already there as part of the OS.  If you do, make sure that you are using the right version of php.  Once you've done that, verify that what is in php -i is actually correct, by looking at php.ini.  Biggest lesson learned - if your gut tells you something and you just know it's right, stick with it and follow up on it.  It's usually the right path.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-850441139673242808?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/850441139673242808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/850441139673242808'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/part-where-java-developer-uses-php.html' title='The Part Where The Java Developer Uses PHP'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2398447355487584260</id><published>2008-12-06T19:26:00.004-07:00</published><updated>2008-12-06T20:06:07.704-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='sports'/><title type='text'>What a Day.</title><content type='html'>Well today was one of those days where you just rock it out.  I woke up early today and started getting ready for Part 1 of the day - Migration. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Migration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'll probably do another post about this, but I had to migrate that PHP app I've mentioned a few times to a new server that we control.  This is a good thing, and theoretically will be the end of my work with the application for all intents and purposes.  It's one of those things that's been hanging over me for a while, and crap like that stresses me out.  Happy it's done, and happy that it went pretty well, really, considering the hoops that required jumping through.  Ahh.  After that, I did some nerding out with the YouTube API as well.  So cool, all the things you can do with that GData API set.  Just wow.  I'll probably eventually write about that too.  Once I was done geeking, I moved on to Part 2 - Walking.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Walking&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It isn't the walking that is so interesting.  All I did was throw on the hoodie, walk over to Eastern Market to hit the bank, while listening to some awesome tunes on the Nano.  This always puts me in a good mood, and since the migration had gone so well and only really took about an hour, I was on cloud nine.  Getting to Eastern Market just made it better.  There were wreaths, trees, and assorted holiday cheer on display.  I got done at the bank, came back to the market, and went ahead and bought some delicious cinnamon sugar pecans from the Sweet Nuthouse.  If you haven't ever had these (or the almonds), then you haven't lived a complete life.  So delicious.  I then bought a copy of Street Sense (favorite charitable organization in DC), and then donated to the Salvation Army bell ringers.  Bless em for being out in the crappy cold.  Then I headed back home, fighting the urge to tear into the pecans, and ready to start the third part of my day - Sports.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Sports&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Today was a good sports day, albeit poorly scheduled.  At 3:30, both Michigan and James Madison were on.  I told Jena that I am not sure why these people don't consult me before scheduling these games.  She just shook her head.  Anyway, Michigan's hoopsters were taking on Duke at home in a rematch of the tournament loss from a couple weeks ago, and James Madison went up against Villanova in a football Quarterfinal.  I had the basketball game on TV, and the football game on the computer (at least RCN has ESPN360, which I have to admit is pretty incredible).  Michigan played an awesome game against a superior Duke squad, and pulled out another huge win over a #4 team.  It was great to watch the team play as a team, and to watch John Beilein's vision coming to fruition earlier than I expected.  Meanwhile, JMU jumped out to a 14-0 lead and looked like they were going to romp, but Nova came back and made it a tough game, taking the lead with 6 minutes to go.  Not to be denied, the mighty Dukes marched down the field for the winning score, then sealed the deal with an interception in the final minute.  Awesome.  They will meet the Montana Grizzlies in the semifinals next week.  GO DUKES!!  With my fill of sports for the day, it was time for part four - Christmas shopping.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Christmas Shopping&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I love Christmas shopping.  I like to fight the crowds, wandering aimlessly from store to store.  Buying things online just isn't the same.  I love to go out and 'finish', only to go out again and buy more the next day.  While I can appreciate the naysayers' lament of the materialist nature of Christmas, I don't care.  I like to buy gifts for people.  I like to wrap the gifts, and then I like to give them gifts.  Especially Jena.  My dad was big on Christmas as well.  He used to just continue to buy gifts until the stores ran out, right up until Christmas Eve.  The gifts were always exciting, but I think the excitement was more a function of just being part of something that someone was so excited about.&lt;br /&gt;&lt;br /&gt;Now I am chilling on the couch.  Relaxin.  Feeling good.  I have had a crappy, busy couple of weeks, but yesterday and today were good days.  Some days you just have good days, and since Jena's out of town, I figured I'd tell someone about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2398447355487584260?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2398447355487584260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2398447355487584260'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/what-day.html' title='What a Day.'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2236119241245136859</id><published>2008-12-03T12:06:00.004-07:00</published><updated>2008-12-03T12:40:16.568-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Remove/Update Firefox 'about:config' Preferences (Mac OSX)</title><content type='html'>So I recently set a preference in my Firefox configuration on 3.0.  I entered a string instead of an integer.  Now, one would think that you could just switch this preference to an integer, or failing that, delete it.  (At least for user-defined preferences).  This, my friends was not the case.  In case anyone else has this problem, let me help, because all the search results I ran across were wrong, wrong, wrong.&lt;br /&gt;&lt;br /&gt;To set a pref:&lt;br /&gt;&lt;br /&gt;type about:config in the address bar, add one. &lt;br /&gt;&lt;br /&gt;Now, to find it:&lt;br /&gt;&lt;br /&gt;/Users/&lt;you&gt;/Library/Application Support/Firefox/Profiles/&lt;some-random-string&gt;.default&lt;br /&gt;&lt;br /&gt;You will see a prefs.js file.  This is the one.  Now, make sure firefox is closed, and edit/remove the setting you used.  When you restart, this setting will have taken effect.  Hopefully this will help some other poor soul fight the good fight without wasting 45 minutes like I just did.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2236119241245136859?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2236119241245136859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2236119241245136859'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/12/removeupdate-firefox-aboutconfig.html' title='Remove/Update Firefox &apos;about:config&apos; Preferences (Mac OSX)'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2779293865059758035</id><published>2008-11-21T10:48:00.003-07:00</published><updated>2008-11-21T11:05:31.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social web'/><title type='text'>Information Overload, or Why Technology Doesn't Necessarily Increase Productivity</title><content type='html'>So I am sitting here trying to program.  I have a lot to do.  I am disrupted by:&lt;br /&gt;&lt;br /&gt;Adium, connected to three different Instant Messaging Services&lt;br /&gt;Campfire, connecting my decentralized team via chat&lt;br /&gt;Thunderbird, email, duh&lt;br /&gt;Colloquy, in irc chatting with ex-colleagues/good friends&lt;br /&gt;Tweetdeck - following all this Twitter nonsense&lt;br /&gt;Google Reader - Created as a Fluid app on my mac, to keep up on blog subscriptions&lt;br /&gt;&lt;br /&gt;All of these wonderful things are 'technology's fault', and while so much of this stuff makes our job easier, and while they can definitely make us more productive, there is definitely a counterbalancing effect.&lt;br /&gt;&lt;br /&gt;Also interesting is the personal tipping points that occur in the Facebookosphere, where disparate groups of friends seem to 'tip' at different times.  Now for me, it's the high school alumni.  Strange how it spreads so quickly.  I wonder what happens when you run out of groups?  It seems that life and new friendships can't possibly keep pace with Facebook.  So interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2779293865059758035?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2779293865059758035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2779293865059758035'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/information-overload-or-why-technology.html' title='Information Overload, or Why Technology Doesn&apos;t Necessarily Increase Productivity'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3828875457025272108</id><published>2008-11-20T20:26:00.003-07:00</published><updated>2008-11-20T20:56:00.844-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geekery'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>PandaStream, or Why The Internets Are So Cool</title><content type='html'>Tonight, as if I didn't do enough nerdy stuff during the day at my job, I decided I was going to try out &lt;a href="http://pandastream.com"&gt;PandaStream&lt;/a&gt;.  As I noted, we had a bit of trouble with our video provider, and my colleague &lt;a href="http://ossolab.com/"&gt;Bob&lt;/a&gt;, had stumbled across this open source video package.  We can own the entire process, without having to requisition the machinery to support video upload, encoding, and content serving.  This is a good thing, as long as it works.  Well, I can say it works.  Before I go on to describe how it all comes together, let me just describe the surreal realizations I came to...&lt;br /&gt;&lt;br /&gt;I am sitting on my couch, wirelessly connected to the internet, creating an application instance in the cloud on Amazon EC2, then deploying a git project to the server running Ruby/Merb, configured to interface with Amazon S3 and Amazon SimpleDB.  In 2 hrs, on my couch, I am able to set all this up, using the great set of instructions &lt;a href="http://www.pandastream.com/docs/getting_started"&gt;here&lt;/a&gt;.  5 years ago, wireless internet was just getting solid.  5 years ago, I am pretty sure that if Merb had actually been invented, that very few people outside of its creator knew what the hell it was, and Ruby was still a pretty obscure scripting language invented by a Japanese guy.  Amazon's web service offerings in cloud computing were but a twinkle in Werner Vogels' eye.  Open source applications were gaining steam, but certainly not as trusted or ubiquitous as they are today.  I think that this is all pretty remarkable, and it's a testament to many creative and brilliant folks that I am able to sit around on my couch and do these amazing things and have them feel pretty routine.  Thanks, smart and creative people.  Us mere mortals are in your debt.&lt;br /&gt;&lt;br /&gt;So anyway, I had an EC2 account already setup, and bringing S3 and SimpleDB online were a snap (once I realized I needed SimpleDB).  Getting the security certs and stuff took about 5 minutes to resolve, thanks to Amazon's great &lt;a href="http://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/"&gt;AWS Documentation&lt;/a&gt;.  I kicked off the panda instance without issue, hopped into the instance via ssh, and jumped into the merb console.  This didn't go smoothly as I was presented with a security error that just said I couldn't be authenticated using my credentials.  To test my credentials, I grabbed a &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=816&amp;amp;categoryID=188"&gt;java library for AWS.&lt;/a&gt;  I used this library to test my creds with S3, and it worked.  Only then did I go and look closer at the error and realize it was related to simpleDB, which I didn't have an account for.  Creating that made it work much better.  Once I was able to hop into the merb console, there were about 10 commands to run to set up, add security, and configure some default video encoding.  This took maybe 5 minutes.  From there, I logged into the instance and uploaded a video.  Then I took some embed code and stuck it in a test html file.  &lt;span style="font-weight: bold;"&gt;It just worked.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anyone with any experience with pandastream, we are really curious to see if this is production tested, or if anyone knows anything about it that would make us NOT want to use it. &lt;br /&gt;&lt;br /&gt;Next episode, integration via REST APIs.  Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3828875457025272108?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3828875457025272108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3828875457025272108'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/pandastream-or-why-internets-are-so.html' title='PandaStream, or Why The Internets Are So Cool'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8702753436074395510</id><published>2008-11-20T08:08:00.002-07:00</published><updated>2008-11-20T08:33:24.972-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vitriol'/><title type='text'>RCN Redux</title><content type='html'>Well after all my rants, I would think that I should share the conclusion of my epic cable saga.  I went to the office to grab a DVR cable box, conceding defeat.  If it weren't college basketball season, my reaction might have been different, although I must admit RCN internet is great and I only pay $40 for biz-class internet with a static IP, so it's kinda hard to give up.  Anyway, now that I am done with my grudging compliments for RCN, the story.&lt;br /&gt;&lt;br /&gt; The lady was actually pretty nice, and quick, and I drove home with my cable box, figuring it wouldn't take that long.  Starting at 5:15, I should have this thing up and running by 6pm so I can tape the Syracuse-Richmond game for Jena, right?&lt;br /&gt;&lt;br /&gt;Wrong.&lt;br /&gt;&lt;br /&gt;I follow the instructions, then call the 'automated activation line', where I am told that an activation signal has been sent successfully!  Yay.  Now they say "wait an hour", like it's a laxative or something.  How can this take an hour?  After about 40 minutes of zero activity, I call back (now 5 min til gametime), and they tell me because it hasn't been an hour, I have to call back.  Of course.&lt;br /&gt;&lt;br /&gt;I go to pick Jena up and return to find that still nothing has happened.  I call back and get a live person who now agrees to send a "manual activation signal", which of course works.  But I find that the actual digital cable features won't load for 2 hours.  I have no idea what happened, but it used to be that you plug in your cable box and it just worked, digital, DVR, or basic analog.  Why is this so hard?&lt;br /&gt;&lt;br /&gt;Anyway, now I have digital cable, with a slow cable box, an ugly guide, and DVR with a smaller hard drive, for $15 more a month.  Whoopee.  I hate you RCN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8702753436074395510?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8702753436074395510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8702753436074395510'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/rcn-redux.html' title='RCN Redux'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-6260104870464960694</id><published>2008-11-18T09:00:00.002-07:00</published><updated>2008-11-18T09:11:52.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Be The Pest!</title><content type='html'>Everybody needs 'the Pest'.  You know who they are - that person who asks the important questions, even if they are unpopular.  Strive to be the Pest sometimes.  Encourage others to be Pests too.  Be the voice of reason, and demand explanations.  Delivering cogent explanations makes everyone better at what they are doing.  If you can't explain it well, then you can't do it well.  I wish I could have had more pain-in-the-ass Pests in all my previous jobs.  They make you better, even if you don't really like them/want to give them credit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-6260104870464960694?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6260104870464960694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/6260104870464960694'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/be-pest.html' title='Be The Pest!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-473887898384476303</id><published>2008-11-17T14:20:00.002-07:00</published><updated>2008-11-17T14:42:17.387-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vitriol'/><title type='text'>Update On How Much RCN Sucks</title><content type='html'>Well I called RCN, and got right through to a person (who, of course, doesn't know anything). &lt;br /&gt;&lt;br /&gt;Allow me to summarize the interaction:&lt;br /&gt;&lt;br /&gt;ME: "My cable is out and has been since Thursday"&lt;br /&gt;RCN: "Oh, that's because I see you don't have a cable box"&lt;br /&gt;ME: "But I got notice saying that was happening in October and didn't say I needed a box"&lt;br /&gt;RCN: "No it happened on the 13th, and you need a cable box"&lt;br /&gt;ME: "OK, I just talked to someone last weekend from RCN, and they said I didn't need a cable box, which is why I didn't get one."&lt;br /&gt;RCN: "How many TVs do you have?"&lt;br /&gt;ME: "Two."&lt;br /&gt;RCN: "OK, my calculations are that you need two cable boxes."&lt;br /&gt;ME: "OK, we've established that I need cable boxes.  I have a media center PC.  Will this still work?"&lt;br /&gt;RCN: "No, you need cable boxes"&lt;br /&gt;ME: "I understand that I need a cable box.  Can I just run the signal through the box to my PC, and use the PC as a DVR still?"&lt;br /&gt;RCN: "You need a cable box"&lt;br /&gt;ME:  "I know I need a f$%^#$ng cable box.  Do you have any documentation that you can send me about using a cable box with a media center PC?"&lt;br /&gt;RCN: "I don't understand what you are asking me"&lt;br /&gt;ME: "Of course you don't - you are just technical support.  I need documentation about using a cable box with a media center PC."&lt;br /&gt;RCN: "I have my notes right here.  They say that you need two cable boxes."&lt;br /&gt;ME: &lt;span style="font-weight: bold;"&gt;Click&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that was infuriating enough.  But then I checked the webs to see what I could do to supplement the stupidity that I experienced on the phone.  Here's what I found:&lt;br /&gt;&lt;blockquote&gt;The switch from analog to digital affects only over-the-air reception of TV. &lt;span style="font-weight: bold;"&gt;Unless you have a cable carrier that is taking advantage of the situation to screw its customers&lt;/span&gt;, and although there are a few of those Comcast is not one of them, the transition to digital in February will have absolutely zero effect on cable subscribers. Your current setup will work as fine after February as it does now, and you don't need to buy or change anything.&lt;/blockquote&gt;Wow - it just so happens that RCN is one of those carriers - they have encrypted all their stations, so you need a box - now you can't use the media center that you built, because only OEM computers are allowed to be built with cableCARD-compatible interfaces.  How about that!?!?  So now I am stuck with a media center PC that is unusable.  Thanks RCN. You bastards.  You just overtook Verizon, #1 with a bullet on the list of EVIL COMPANIES.  I hate you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-473887898384476303?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/473887898384476303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/473887898384476303'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/update-on-how-much-rcn-sucks.html' title='Update On How Much RCN Sucks'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-336860202126016885</id><published>2008-11-17T10:22:00.002-07:00</published><updated>2008-11-17T14:19:43.118-07:00</updated><title type='text'>The Importance of 'The Why'</title><content type='html'>Why are you doing what you are doing?&lt;br /&gt;&lt;br /&gt;Why would someone need this?&lt;br /&gt;&lt;br /&gt;What's the goal?&lt;br /&gt;&lt;br /&gt;These questions are way more important than "What", or "How".  Those are easy in most cases.  Why is a much more important question.  Why are we doing this?  Does it solve some problem that people are seeking a solution to? &lt;br /&gt;&lt;br /&gt;Note - "because it looks cool", or "because I think this would be better" aren't good enough.&lt;br /&gt;&lt;br /&gt;When you are building something, it's your responsibility to answer "Why" way before you start doing the what.  Sometimes the why is simple:&lt;br /&gt;&lt;br /&gt;"We are building a house.  Why?  Because someone needs a place to live."&lt;br /&gt;&lt;br /&gt;Other times it's not so simple.  That doesn't mean you shouldn't talk about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-336860202126016885?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/336860202126016885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/336860202126016885'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/importance-of-why.html' title='The Importance of &apos;The Why&apos;'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-2368466639264331716</id><published>2008-11-17T08:53:00.003-07:00</published><updated>2008-11-17T09:52:30.453-07:00</updated><title type='text'>Weekend Update</title><content type='html'>Well, it's Monday again.  As Washington mourns another dull Redskins loss, featuring lots of really bad offensive line play, we dive headlong into new week, fresh with promise. &lt;br /&gt;&lt;br /&gt;There are a few things I'd like to get off my chest before starting the week.&lt;br /&gt;&lt;br /&gt;First:  RCN &lt;span style="font-weight: bold;"&gt;sucks&lt;/span&gt;.  We live in a complex that has only RCN wiring run in, so we can't switch to Comcast, and our lovely condo board won't allow DirecTV.  Isn't it great how the draconian fools have rendered the benefits of cable competition moot?  Usually this wouldn't be a huge deal, but since our cable has been out for four days now, it's kind of annoying.  As if it would be reassuring for them to say it, calling the help line tells me that, "Hey it's okay - we know that DC cable is out.  We are working on it."  My internet works, so it's not an issue with the wiring.  What the hell could take four days.  Tonight Jena wants to watch the Bills, tomorrow Syracuse is on ESPN in their season debut, and Thursday, Michigan plays UCLA - none of it is on broadcast television. &lt;span style="font-weight: bold;"&gt; I need cable this week, you a**@#%$s.&lt;/span&gt;  The response to my email for support:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Thank you for contacting RCN. A member of our support staff will initiate contact within 48 hours.&lt;br /&gt;&lt;br /&gt;Thank you,&lt;br /&gt;Customer Support Staff&lt;/blockquote&gt;I suppose that isn't that ridiculous considering the phone wait times hover around 26 hours.  Damn you, RCN.  Damn you.&lt;br /&gt;&lt;br /&gt;Second:  I hope something happens quickly with the American car maker bailout.  After the election ended, I was looking forward to a more balanced news array on NPR, but GM has rapidly taken the spot of Obama, and Ford has replaced McCain as the new Morning Edition Monopolizers. &lt;br /&gt;&lt;br /&gt;I am of the opinion that something needs to happen, but it simply can't involve giving the companies some money so they can just keep on paying it to 'skilled' workers who collect exorbitant wages for doing things that peers in other industries and areas who aren't unionized do (just as wellm if not better) for much less.  This is the one good chance for these companies to break down, swallow their pride, and buck the union influence that is sapping their profits, and causing their costs to be simply unsustainable.  My argument to any union supporters:  Would you rather have lower paying jobs or no jobs?  That's what's facing you here - accept reality and think constructively.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-2368466639264331716?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2368466639264331716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/2368466639264331716'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/weekend-update.html' title='Weekend Update'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-1420967505458305196</id><published>2008-11-13T14:12:00.002-07:00</published><updated>2008-11-13T14:17:16.158-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Help Wanted.</title><content type='html'>I am looking for some good fiction books.  Anyone actually read this blog and have a good one to suggest?  I have been all history, true stories, business, general non-fiction lately, and need a lighter read.  Drop a comment if you have any suggestions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-1420967505458305196?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1420967505458305196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/1420967505458305196'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/help-wanted.html' title='Help Wanted.'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-7200967248127550307</id><published>2008-11-12T09:23:00.004-07:00</published><updated>2008-11-12T13:00:53.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>'Third Party Dependencies', or 'Have an Backup Plan'</title><content type='html'>The interconnectedness of the web is a fantastic thing.  There are tons of libraries, expertise, content sources, services, etc out there that make it possible for companies to focus on their core competency.  If you are a social networking site, do you really want to build a video player, for example?  Maybe, but only if that video player is part of the strategy that is your core competency, or that gives you some sort of competitive advantage.  If Previously, you would have to serve your own photos, but maybe now you can use a service like &lt;a href="http://www.photobucket.com"&gt;Photobucket&lt;/a&gt;, or &lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt;.  Let the photo storage be their problem - let them handle the disk space requirements and the server load of serving endless quantities of images, right?  Right?&lt;br /&gt;&lt;br /&gt;Well the answer in my view is &lt;span style="font-weight: bold;"&gt;maybe&lt;/span&gt;.  Let's face it.  Sites like photobucket aren't going anywhere, but their terms of service might.  What they are allowed to do with your content might change, and the conditions of your agreement just might become unfavorable, and there is nothing you can do about it, because now you have given all your content to them, and you don't really have any of it.  This could be a bad thing, right?  Especially if you aren't able to at least get a copy of it back from them without going through some manual pain.&lt;br /&gt;&lt;br /&gt;Many companies simply &lt;span style="font-weight: bold;"&gt;won't make it&lt;/span&gt;.  You probably don't want to dive into partnerships or use services like this from companies that you aren't sure are established, because chances are, you will have to start over sometime, and it will probably be really inconvenient.  Then your stuff might just be gone, stuck on a server somewhere that gets sold at auction.  Prognosis: NOT SWEET.&lt;br /&gt;&lt;br /&gt;My suggestions on picking a partner (based on some recent experience) would be this:&lt;br /&gt;&lt;br /&gt;1) Find a partner who can solve the business need, first of all.&lt;br /&gt;2) Find a partner that isn't going anywhere (requires crystal ball in some cases)&lt;br /&gt;3) Find a partner that will let you get your 'stuff' back&lt;br /&gt;&lt;br /&gt;Once you have chosen a partner, come up with a backup strategy.  You are sending content to them, but can you periodically backup this content to a disk that you own and control?  At least this way you have the files if something goes wrong, and you can then bulk load them into another tool if need be.  Then you are limited to the code changes you have to make to do the API communication, and this should be relatively limited.  Rarely do people get things like this right on the first try, and frequently they are lucky, because they never figure that out - sometimes you just try something and it happens to work, but many times it doesn't.  If it doesn't, remember the 'fool me once, fool me twice' adage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-7200967248127550307?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7200967248127550307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/7200967248127550307'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/third-party-dependencies-or-have-backup.html' title='&apos;Third Party Dependencies&apos;, or &apos;Have an Backup Plan&apos;'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-3251952475693668162</id><published>2008-11-11T09:24:00.004-07:00</published><updated>2008-11-11T14:27:15.190-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><title type='text'>So...Is It a Good Time to Start a Business, Or Not?</title><content type='html'>Coasting through the blogosphere, you can find a lot of opinions from venture capitalists, developers, entrepreneurs, and columnists about whether or not this is a good time to start a business.&lt;br /&gt;&lt;br /&gt;Some reading I've been doing:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Yes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hedgehoglab.com/about/blog/2008/11/10/ditch-your-job-and-start-a-business-now/"&gt;Do it...now&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.alleyinsider.com/2008/12/startup-advice-how-to-make-the-collapse-work-for-you"&gt;Don't Panic, Profit&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.feld.com/blog/archives/2008/10/ok_entrepreneur.html"&gt;OK, Entrepreneur&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.thedeal.com/techconfidential/vc-ratings/greycroft-partners/vc-dean-alan-patricof-warns-ag.php"&gt;Seize the Day&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.usatoday.com/money/smallbusiness/columnist/abrams/2008-10-17-start-a-business_N.htm"&gt;It's A Good Time To Start a Business&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.businessangelblog.com/2008/is-now-a-good-time-to-start-a-business/"&gt;Is It a Good Time?  Yes!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Maybe-So&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.techcrunch.com/2008/10/08/angel-investor-ron-conway-adresses-his-portfolio-companies-over-financial-meltdown/"&gt;Angel Investor Ron Conway&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;I looked for about half an hour, which I am sure is not a thorough scan, but I couldn't really find anyone telling me I should not start a business right now.&lt;br /&gt;&lt;br /&gt;This is good news to me.&lt;br /&gt;&lt;br /&gt;I think that the overwhelming sentiment is that it is a fine time to build a business, but a really bad time to raise capital.  Credit crunch and all.  And it's a bad time to have a business plan that doesn't project any sort of cashflow for a while.  These are probably good things.  Slowdowns in the economy are often title as 'corrections'.  Stock prices get 'corrected' which is a nice word for common sense-based pricing of assets based on legitimate valuations and bringing PE ratios back in line with reality.  Basically, if Google is really only worth $350 a share, but is trading at $450, a correction will see it trading at $350 when it's through.  Similarly, corrections weed out companies that have no business existing.  If you have an idea that is 'sexy web 2.0' but can't tell someone with a straight face how you are going to deposit checks in the bank, or at least generate something that you can monetize (i.e. user data), then you aren't getting any help.  During 'bubbles', this might not be the case.&lt;br /&gt;&lt;br /&gt;There are the obvious things that you can do in this economy - build things to help people save money/time.  Categories I can think of:&lt;br /&gt;&lt;br /&gt;1) job seeker resources&lt;br /&gt;2) ideas to make shin&lt;br /&gt;3) crowdsourcing facilitation - help businesses harness the collective intelligence to improve your situation&lt;br /&gt;4) job retraining&lt;br /&gt;5) price-finder type things&lt;br /&gt;6) college-related stuff (lots of people go back to school in a downturn)&lt;br /&gt;&lt;br /&gt;There are always opportunities for good ideas developed by hard workers who have strong networks, and obviously, not all ideas require funding at first - some never do.  The key is not to have an idea that will get you cash-flow positive in the first week, but to have an idea that is well thought out and planned so that you have a way to get cash at some point.  I think that the idea I am working on now definitely falls under that category, so I am feeling decent about things as of now.&lt;br /&gt;&lt;br /&gt;I can't honestly imagine what people did before the Internet.  The enabling technologies like blogs, social networking sites, and remote work tools have made everyone powerful.  We are all starting about 7 notches higher than you would even fifteen years ago.  You just have to act now.  Before you had to act, but first you had to build your network in person, gather data in person, and work with each other in person.  Now you can work with anyone anywhere, using knowledge you have gathered from folks all over the world, using your web of contacts that you have built both in person and electronically through the years.  Wow - it's definitely a good time to start a business.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-3251952475693668162?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3251952475693668162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/3251952475693668162'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/sois-it-good-time-to-start-business-or.html' title='So...Is It a Good Time to Start a Business, Or Not?'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8641277264658521791</id><published>2008-11-10T12:15:00.005-07:00</published><updated>2008-11-10T15:18:05.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Updates!  Books!  Travel!</title><content type='html'>So, here's the latest:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Things I Am Reading:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just finished up &lt;a href="http://www.amazon.com/April-1865-Month-Saved-America/dp/0060187239"&gt;&lt;span style="font-style: italic;"&gt;April, 1865&lt;/span&gt;&lt;/a&gt;, by Jay Winik.  I am pretty sure there is no upper bound to the amount of books I can read about the Civil War or Abraham Lincoln's presidency.  It seems that each book touches on something new, or captures something slightly different from other book.  This book was certainly more focused on Southern leaders like Jefferson Davis and Robert E. Lee.  As someone who grew up in Northern Virginia, driving on Jefferson Davis Hwy, playing against RE Lee and Jeb Stuart high schools, or the Rebels of Fairfax, then going to James Madison, where it would seem that everything was named after a confederate cavalry leader, it was interesting to finally get some of the backstories.  Winik is a great writer who mixes just enough military strategy with the right amount of human interest to keep the story moving along at quite a nice clip.&lt;br /&gt;&lt;br /&gt;I am almost done with &lt;a href="http://www.amazon.com/Into-Wild-Jon-Krakauer/dp/0307387178/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1226348085&amp;amp;sr=8-1"&gt;&lt;span style="font-style: italic;"&gt;Into The Wild&lt;/span&gt;&lt;/a&gt;, by Jon Krakauer.  It's the basis of the recent movie of the same name.  This kid graduates college, goes off the grid, travels to Alaska on an extreme nature soul-searching trip that would frighten any Eagle scout, and eventually dies because he wasn't well-prepared enough.  By all accounts, this wasn't some knuckehead or aimless drifter, but someone who really went out of his way to seek his identity.  I find this book pretty interesting - not just because I grew up in the same area as the main character, or because his travels were so interesting, and not because it's sad that he died.  It's the just audacity of dropping out of society.  I could never imagine it.  First off, I am no Davy Crockett, so I'd last roughly 15 min in the wilds of Alaska.  Second of all, there are just so many people in my life who I couldn't just leave.  I think about moving and even the thought of leaving the area is somewhat distressing to me, much less just disappearing from everyone's life wholesale.  What he did is impressive, but not admirable, because I can't really call living such an empty life that you can leave it an admirable trait.  Either way, it's an interesting read, and Krakauer is just an enjoyable author.&lt;br /&gt;&lt;br /&gt;Recently I started &lt;a href="http://www.amazon.com/Stuff-Thought-Language-Window-Nature/dp/0670063274"&gt;&lt;span style="font-style: italic;"&gt;The Stuff of Thought&lt;/span&gt;&lt;/a&gt;, by Steven Pinker.  This is an interesting book so far - all about language semantics.  It's fascinating when you think about language.  There are people out there who are COMPLETE idiots by any standard - people who you meet and think to yourself "wow, that guy is lucky he knows how to get out of bed and get dressed in the morning", but that person has likely achieved a level of mastery of the English language.  When you read a sentence and realize that based on context, there can be as many as four meanings, it becomes pretty amazing that the human mind can wrap itself around language.  So much nuance is captured in language, making it all the more fascinating that otherwise simple folks can speak it without too much trouble.  The other reason I like this book is that there is an entire chapter on verbs.  I think that's fascinating.  My mom cites thinking like this as evidence that I am becoming more and more like my dad every day.  I take that as a compliment.&lt;br /&gt;&lt;br /&gt;In the queue:&lt;br /&gt;&lt;br /&gt;Alive&lt;br /&gt;The Professor and the Madman&lt;br /&gt;&lt;br /&gt;Man I wish there was a way to just read professionally.  Not critically, like an editor, but just to read and soak in knowledge and to live the stories.  That would be a good job...not that writing software isn't fantastic and all =)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Places I am Going&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It looks like we are officially heading to Indiana for Christmas.  It's good because my grandparents love seeing family, and have actually been alone for a couple recent holidays.  Also good because theoretically we'll finally have our wedding photos by then.  They'll also get to see Jena, which is good, since the last couple trips out there, she couldn't make it, which really disappoints them.  A LOT.  My grandparents have caught the contagious disease that has been spreading through everyone in my life ever since Jena and I met - I call it "IlikeJenabetterthanKirkeventhoughIknewhimfirst-itis".  Sigh.&lt;br /&gt;&lt;br /&gt;In February we go to Aruba, which is awesome, especially since we have long since paid for both airline tickets and lodging.  Seemingly free vacations are very good things, especially to places with awesome beaches and casinos.  Yep.&lt;br /&gt;&lt;br /&gt;Oh, and we just put in our ticket requests for the Vancouver 2010 Winter Olympics.  We find out in December what tickets we get - it would be an AWESOME trip, so fingers are crossed...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Things that are Awesome&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1) The battery on my new phone.  It lasts for days.  My old phone never really did that.  And for the last year or so, it was more like hours.  It was the 'plugin-hybrid' of cellphones.&lt;br /&gt;2) Michigan's 29-6 victory over Minnesota this weekend - with a walk-on backup QB who had otherwise been terrible, and a bunch of underclassmen on offense, they put up 445 yards, while their beleaguered defense managed to hold the Gophers to 188 yards and two field goals, after getting freaking torched for the past few games...good times.&lt;br /&gt;3) Married Life - people keep asking me "how's married life", and I can always answer without pause "awesome".  That's a good thing.&lt;br /&gt;4) Seasons.  The trees are beautiful, and I love the smell of Fall.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Things that are less than Awesome&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1) Antiquated offices with not-so-nimble heat/ac systems that can't keep up with rapidly changing DC-autumn weather.  It was roughly 724 degrees in my office Friday.&lt;br /&gt;2) Darkness at 4:45 PM.  Bleh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8641277264658521791?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8641277264658521791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8641277264658521791'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/updates-books-travel.html' title='Updates!  Books!  Travel!'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-3444412265952661654.post-8475032907891385665</id><published>2008-11-07T07:27:00.003-07:00</published><updated>2008-11-07T09:29:50.423-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entrepreneurship'/><category scheme='http://www.blogger.com/atom/ns#' term='startup'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Starting Over...</title><content type='html'>So like I &lt;a href="http://kirkgsworld.blogspot.com/2008/10/when-failure-attacks-startup-edition.html"&gt;mentioned&lt;/a&gt;, I have been involved in trying to start my own business. &lt;br /&gt;&lt;br /&gt;I am ready to get back in the game.  Round one was a definite loss, but not a knockout.  Let's get started again, but this time, let's do it right.  I am a developer.  This time I am going to be working with one person, also a developer.  Developers are good at tech startups, because they know how to build things.  They are also bad at tech startups because all they want to do is build things.  I have a degree in business, so I would like to claim that I transcend this problem, but I don't.  I am a way better carpenter than I am an architect.  When presented with a plan, I can execute.  That's not good enough for what I am trying to do.&lt;br /&gt;&lt;br /&gt;Now it's time to learn how to be the architect, and not just the architect of a software program.  An architect of a business, start to finish.  In my last venture, I made the mistake of not being involved enough in the early-stage business decisions.  That's my fault.  I didn't really take part in the research of competitors, in the development of our core premise.  I didn't really do my due diligence in figuring out WHO were going to sell to, HOW we were going to get in those ears, WHAT problems we were going to concentrate on solving, WHEN we were going to deliver real demonstrable milestones.  You can build the coolest crap in the world, and if you can't sell it, it's worth nothing.  It's a bunch of 0s and 1s on a disk somewhere. &lt;br /&gt;&lt;br /&gt;I am tired of creating 0s and 1s without a home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3444412265952661654-8475032907891385665?l=kirkgsworld.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8475032907891385665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3444412265952661654/posts/default/8475032907891385665'/><link rel='alternate' type='text/html' href='http://kirkgsworld.blogspot.com/2008/11/starting-over.html' title='Starting Over...'/><author><name>Kirk Gray</name><uri>http://www.blogger.com/profile/06988215275755218167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://img510.imageshack.us/img510/1079/kgchicagobeanlr0.jpg'/></author></entry></feed>
