<?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-3203340561656331707</id><updated>2012-02-16T05:29:17.425-05:00</updated><category term='xml'/><category term='computer science'/><category term='technology'/><category term='me'/><category term='TV'/><category term='research'/><category term='admin'/><category term='java'/><category term='adventures'/><category term='mule'/><category term='gadgets'/><category term='comics'/><category term='random'/><category term='maven'/><category term='music'/><category term='projects'/><category term='open source'/><category term='blog'/><category term='gaming'/><category term='life'/><category term='software development'/><category term='firefox'/><category term='troubleshooting'/><category term='gmaven'/><category term='emotions'/><category term='agile'/><category term='groovy'/><category term='software'/><category term='food'/><category term='userscripts'/><category term='religion'/><category term='microsoft'/><category term='windows'/><category term='project management'/><category term='testing'/><category term='wave'/><title type='text'>Witty Keegan</title><subtitle type='html'>A collection of my thoughts, learnings, and experiences</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default?start-index=101&amp;max-results=100'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>103</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4047443158832815417</id><published>2012-01-07T18:57:00.000-05:00</published><updated>2012-01-08T13:49:55.043-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='gmaven'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>GMaven 1.4 Released today!</title><content type='html'>As many of you already know, I've joined the GMaven team and have been working with Jason to push a new release out.  We're pleased to announce that the long overdue 1.4 release has been released today.  You'll find the artifacts in their &lt;a href="https://nexus.codehaus.org/content/repositories/releases/org/codehaus/gmaven/gmaven-plugin/"&gt;usual place&lt;/a&gt;. The release announcement can be seen &lt;a href="http://markmail.org/thread/jkngm3r5mdkvs5vp"&gt;here&lt;/a&gt;.  I didn't have it set up when I sent the announcement, but starting now everything is also available &lt;a href="http://gmaven.2316925.n4.nabble.com/"&gt;through Nabbble&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm still thinking about what 2.0 should look like, and I'm not sure if 2.0 or 1.5 will be released next.  The latter is looking more likely as I think it will take some time to do a major rewrite and there are some issues that don't look too terribly difficult to get resolved that I'd like to make available to the community as soon as I can.  I do promise whatever and whenever the next release is, that I won't let things get as behind as they did between 1.3 and 1.4 and as long as Groovy and Maven continue to be relevant in the industry (something I don't see changing any time soon), you can count on your friends at GMaven to provide the tools you need to do your job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4047443158832815417?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4047443158832815417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2012/01/gmaven-14-released-today.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4047443158832815417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4047443158832815417'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2012/01/gmaven-14-released-today.html' title='GMaven 1.4 Released today!'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6181645021314686185</id><published>2011-12-28T22:56:00.002-05:00</published><updated>2012-01-05T13:51:28.710-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Running Lego Mindstorms RIS 2.0 on newer windows</title><content type='html'>&lt;span class="highlight"&gt;While getting my old &lt;a href="http://www.lego.com/"&gt;Lego&lt;/a&gt; &lt;a href="http://mindstorms.lego.com/"&gt;Mindstorms&lt;/a&gt; (an &lt;a href="http://en.wikipedia.org/wiki/Lego_Mindstorms#RCX"&gt;RCX&lt;/a&gt; 2.0 setup) set up for my little brother to play with, I learned some thigns about using it with newer versions of Windows (Windows 7 in my case).&amp;nbsp; I found out &lt;a href="http://old.nabble.com/Asking-for-RIS-2.0-patch-under-Windows-XP-td18298813.html"&gt;here&lt;/a&gt; that there is a patch needed for the USB IR tower, which resolves the problem of the system locking up when the tower is plugged in.&amp;nbsp; You can download it here: &lt;/span&gt;&lt;span class="highlight"&gt;&lt;a href="http://cache.lego.com/downloads/education/tower164.zip"&gt;http://cache.lego.com/downloads/education/tower164.zip&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;After installing this, things will run fine, unless you decide to use the official program and launch it more than once..&amp;nbsp; At which point you will see a message like &lt;i&gt;"A critical error has occurred. You may be running out of &lt;span class="highlight"&gt;memory&lt;/span&gt;, or you may need&lt;/i&gt;&lt;i&gt;to &lt;span class="highlight"&gt;reinstall&lt;/span&gt; Robotics Invention System &lt;span class="highlight"&gt;2&lt;/span&gt;.&lt;span class="highlight"&gt;0."&lt;/span&gt;&lt;/i&gt;&lt;span class="highlight"&gt;&amp;nbsp; The solution to this is a bit more messy.&amp;nbsp; There is a file left behind here&lt;/span&gt;&lt;br /&gt;Vista/Win7: &lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;C:\Users\&lt;user&gt;\AppData\Local\Temp\Ris 2.0.mov.#res&lt;/user&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;XP: &lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;C:\Documents andSettings\&lt;user&gt;\Application Data\Temp\Ris 2.0.mov.#res&lt;/user&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;This file must be deleted each time before the program is launched.&amp;nbsp; What I did was create a batch script to do this, and a Visual Basic script to launch the batch script (so it could happen without launching a command prompt window).&lt;br /&gt;You'll find both scripts here: &lt;a href="https://gist.github.com/1531705"&gt;https://gist.github.com/1531705&lt;/a&gt;&lt;br /&gt;I recommend replacing all shortcuts to theLaunchRis2.exe with a shortcut to the Visual Basic script.&amp;nbsp; Note that the VB script assumes you will put put the batch script in &lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;%PROGRAMFILES(X86)%\LEGO MINDSTORMS\launchRis.bat&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: inherit;"&gt; (or &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;%PROGRAMFILES%\LEGO MINDSTORMS\launchRis.bat&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; on a 32 bit system), bu&lt;/span&gt;t you can easily edit the script to change the location.&lt;br /&gt;Of course, this second problem is irrelevant if you decide to write the programs youself (I preferred this over the graphical tool Lego provided).&amp;nbsp; There are several &lt;a href="http://en.wikipedia.org/wiki/Lego_mindstorms#Programming_languages_2"&gt;languages&lt;/a&gt; available.&lt;br /&gt;Let me know if you have suggestions for improvement or run into any issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6181645021314686185?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6181645021314686185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2011/12/running-lego-mindstorms-ris-20-on-newer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6181645021314686185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6181645021314686185'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2011/12/running-lego-mindstorms-ris-20-on-newer.html' title='Running Lego Mindstorms RIS 2.0 on newer windows'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3868385915353011207</id><published>2011-09-02T16:45:00.000-04:00</published><updated>2012-01-05T13:53:33.729-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='gmaven'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Introducing GMavenPlus</title><content type='html'>&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qNlSrYsejP8/TmB5v0RulYI/AAAAAAAACq8/ymXYiQvTQtw/s1600/GMavenPlus.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/-qNlSrYsejP8/TmB5v0RulYI/AAAAAAAACq8/ymXYiQvTQtw/s320/GMavenPlus.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;As some of you already know, I'm now fairly far along in the process of rewriting the &lt;a href="http://docs.codehaus.org/display/GMAVEN/Home"&gt;GMaven&lt;/a&gt; plugin (which I've dubbed GMavenPlus for lack of a better name).&amp;nbsp; My intent was to allow the user more control over the configuration (something which I'm still improving on), to simplify the plugin to make future maintenance easier, and to try to breathe new life into an abandoned project.&amp;nbsp; This last reason was a pretty big motivator for me.&amp;nbsp; Their wiki page &lt;a href="http://docs.codehaus.org/display/GMAVEN/Home"&gt;currently reads&lt;/a&gt; "&lt;i&gt;This project is no longer under active development, although it is still in wide use.&lt;/i&gt;".&amp;nbsp; No project's page should ever say that, especially one as important as Maven support for a language (and a &lt;a href="http://groovy.codehaus.org/"&gt;language&lt;/a&gt; I consider pretty important in the Java community at that, it's surprising the Groovy guys haven't addressed this).&amp;nbsp; Another fairly big motivator was that one of the biggest complaints people have about GMaven (other than it's not being updated) was that some people (I was never one of them) have had issues with Java stubs being incorrectly generated.&amp;nbsp; This actually &lt;a href="http://groovy.329449.n5.nabble.com/Groovy-s-stub-generator-clearly-broken-td2267109.html"&gt;isn't GMaven's fault&lt;/a&gt;.&amp;nbsp; There are issues with Groovy's &lt;a href="http://svn.codehaus.org/groovy/trunk/groovy/groovy-core/src/main/org/codehaus/groovy/"&gt;tooling&lt;/a&gt;.&amp;nbsp; So I felt it was important to expose the &lt;a href="http://www.javalobby.org/java/forums/t102917.html"&gt;GroovyDoc&lt;/a&gt; tool as an alternative, since that's why most folks need the stubs anyway.&lt;br /&gt;&lt;br /&gt;I also had this idea that perhaps the Maven project using the plugin should control the version of Groovy used for compiling, etc, and not the plugin itself (in this way, it'd be similar to how the &lt;a href="http://groovy.codehaus.org/The+groovyc+Ant+Task"&gt;groovyc&lt;/a&gt; Ant task works).&amp;nbsp; This is a cool idea, but I don't yet know if it's a bad idea.&amp;nbsp; Neither &lt;a href="http://scala-tools.org/mvnsites/maven-scala-plugin/"&gt;Scala's Maven plugin&lt;/a&gt; or &lt;a href="https://github.com/talios/clojure-maven-plugin"&gt;Clojure's Maven plugin&lt;/a&gt; currently work this way.&amp;nbsp; The next best alternative to this idea I think would be Jason Dillon's &lt;a href="http://groovy.329449.n5.nabble.com/Seriously-contemplating-removing-multipul-runtime-versions-for-gmaven-td390106.html#none"&gt;idea&lt;/a&gt; (he is the author of the original GMaven).&lt;br /&gt;&lt;br /&gt;I've still got a ways to go before this is ready to see production (I pretty much hacked this together as fast as humanly possible just to see if my idea could work), so I'd be grateful for any suggestions/criticisms/etc you might have.&amp;nbsp; I'm new to writing Maven plugins (and using git :)&amp;nbsp; ) and have very little interest in compilers, so this whole thing has been a pretty foreign but interesting experience.&lt;br /&gt;Please check it out and help me by providing feedback or contributing to the wiki: &lt;a href="http://github.com/keeganwitt/GMavenPlus"&gt;http://github.com/keeganwitt/GMavenPlus&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Oh, and for those wondering: I am trying to get &lt;a href="https://twitter.com/#%21/jasondillon"&gt;Jason Dillon&lt;/a&gt;'s opinion on this idea.&amp;nbsp; But I haven't really heard anything one way or another on this as of yet.&amp;nbsp; He's a busy guy and doesn't really want to work on GMaven anymore.&amp;nbsp; Which is cool, as long as somebody is&lt;br /&gt;And while I would like to get this added to (or at least linked on) &lt;a href="http://codehaus.org/"&gt;CodeHaus&lt;/a&gt; I haven't been in contact with them about doing this yet (I wanted to be a little more sure this is actually usable first).&amp;nbsp; I'll probably drop a note on the &lt;a href="http://groovy.329449.n5.nabble.com/groovy-dev-f372993.html"&gt;dev list&lt;/a&gt; first to see what kind of resistance I'll get there :P first.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Update: I'm discussing this with Jason and the Codehaus guys now:&amp;nbsp;&lt;a href="http://groovy.329449.n5.nabble.com/GMaven-Rewrite-td4785090.html"&gt;http://groovy.329449.n5.nabble.com/GMaven-Rewrite-td4785090.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3868385915353011207?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3868385915353011207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2011/09/introducing-gmavenplus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3868385915353011207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3868385915353011207'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2011/09/introducing-gmavenplus.html' title='Introducing GMavenPlus'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qNlSrYsejP8/TmB5v0RulYI/AAAAAAAACq8/ymXYiQvTQtw/s72-c/GMavenPlus.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5306846150255237785</id><published>2011-09-01T12:58:00.000-04:00</published><updated>2012-01-05T13:53:25.246-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>A userscript for Viewvc</title><content type='html'>I've posted a &lt;a href="http://userscripts.org/scripts/show/111957"&gt;userscript&lt;/a&gt; I've written as a workaround for a &lt;a href="http://viewvc.tigris.org/issues/show_bug.cgi?id=470"&gt;request&lt;/a&gt;&amp;nbsp;for ViewVC that hasn't been done yet (despite the fact a patch has already been submitted). &amp;nbsp;The missing feature is a link to the log view for directories.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5306846150255237785?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5306846150255237785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2011/09/userscript-for-viewvc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5306846150255237785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5306846150255237785'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2011/09/userscript-for-viewvc.html' title='A userscript for Viewvc'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4743820923254884330</id><published>2011-09-01T12:27:00.000-04:00</published><updated>2012-01-05T13:53:16.473-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>A few Autohotkey scripts</title><content type='html'>I decided to post the source for a few &lt;a href="http://www.autohotkey.com/"&gt;Autohotkey&lt;/a&gt; scripts a couple of days ago:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1178587"&gt;GW Tonic Bot&lt;/a&gt; : This one is a bot to drink tonics for you in Guild Wars to help you get your &lt;a href="http://wiki.guildwars.com/wiki/Party_animal"&gt;Party Animal&lt;/a&gt; title. It maps back and forth between your Guild Hall and drinks 2 tonics (yes, 2 tonics because of a bug in GW) each time it stops.&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1186592"&gt;GW Drunkard Bot&lt;/a&gt; : This one was meant to drink alcohol at specific intervals to achieve optimal points towards your &lt;a href="http://wiki.guildwars.com/wiki/Drunkard"&gt;Drunkard&lt;/a&gt; title. &amp;nbsp;This was made obsolete by the &lt;a href="http://wiki.guildwars.com/wiki/Feedback:Game_updates/20110303"&gt;March 3, 2011&lt;/a&gt; update. &amp;nbsp;You can now click them (or have an autoclicker click them) as fast as you want.&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1178585"&gt;Generic Autoclicker&lt;/a&gt; : This one can be for any kind of automated clicking, it just clicks (or double clicks) where you tell it to at an interval you specify.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Note that&amp;nbsp;I haven't tested them in&amp;nbsp;&lt;a href="http://www.ironahk.net/"&gt;IronAHK&lt;/a&gt;, only Autohotkey on Windows. &amp;nbsp;Also note that it's also &lt;a href="http://www.autohotkey.com/docs/Scripts.htm#ahk2exe"&gt;easy&lt;/a&gt; to convert these to an .exe file if you don't want to install Autohotkey. &amp;nbsp;And if a non-techie is reading this, I'm happy to provide that for you. &amp;nbsp;Just leave a comment below.&lt;br /&gt;&lt;br /&gt;Also feel free to comment (or fork) either of these scripts if you have improvements. &amp;nbsp;Some people have found that the delay between mappings in the tonic bot is not long enough for slower internet connections and so you have to tell it to drink more tonics than you'd think (since some clicks will be wasted).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4743820923254884330?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4743820923254884330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2011/09/couple-of-autohotkey-scripts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4743820923254884330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4743820923254884330'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2011/09/couple-of-autohotkey-scripts.html' title='A few Autohotkey scripts'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1495182545029607572</id><published>2011-08-01T01:40:00.002-04:00</published><updated>2012-01-10T18:43:29.161-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Musical Amateurism</title><content type='html'>Warning: the following is at rant on the state of pop music that shamelessly derides the music industry. &amp;nbsp;Reader&amp;nbsp;discretion&amp;nbsp;is advised.&lt;br /&gt;&lt;br /&gt;I've been thinking about music and musical instruments lately. &amp;nbsp;And it occurred to me how odd our current musical experience is. &amp;nbsp;One of the oldest recorded songs in history dates back to about 1400BCE, but it's likely unrecorded music existed long before that. &amp;nbsp;My point being that music has always been a very pervasive element in our cultures. &amp;nbsp;It was&amp;nbsp;performed&amp;nbsp;by average Joes for average Joes, where many (if not all) of the listeners actively took part in the experience. &amp;nbsp;But this is not reflected in our current musical culture. &amp;nbsp;We now only passively engage with the music with our&amp;nbsp;stereos, ipods, etc. &amp;nbsp;And it is largely no longer done by amateurs. &amp;nbsp;Teams of&amp;nbsp;professionals&amp;nbsp;(of whom the actual artist is often only a small part, as in the case of pop singles). &amp;nbsp;And the industry that has been built to protect this corporatizing (like the &lt;a href="http://www.riaa.com/"&gt;RIAA&lt;/a&gt;) and wanting money practically every time someone sings one of their songs is also downright odd, when viewed in the context of most of our musical history. &amp;nbsp;How can you copyright something so quintessential to the human&amp;nbsp;experience? &amp;nbsp;(By the way, the RIAA has yet to share a single penny of the settlements they've won with the artists they're supposedly protecting, I refuse to buy an&amp;nbsp;album &lt;a href="http://www.riaaradar.com/"&gt;released&lt;/a&gt; by the RIAA).&lt;br /&gt;&lt;br /&gt;I think this decline in musical amateurism started with the end of the &lt;a href="http://en.wikipedia.org/wiki/Baroque_music"&gt;Baroque&lt;/a&gt; period of music, when music began being performed by people whose profession was music and the instruments of choice became more complex (for example, the decline of the recorder). &amp;nbsp;This was partly because of the growing world economy that made more leisure time possible. &amp;nbsp;Whereas in the past, as my Western Civ professor put it, "Most of your ancestors were hungry most of the time." &amp;nbsp;Aristocracies were falling, and more power (politically and economically) was making its way into the hands of the common man. &amp;nbsp;But even in this period of history, folk music was still alive and well. &amp;nbsp;And although amateur musicians were no longer the sole source of&amp;nbsp;music, they were still a significant source of it. &amp;nbsp; This continued for some time, with professional music comprising a larger and larger percentage of the music consumed by the population. &amp;nbsp;Things changed again, and rather dramatically, with the advent of recorded music. &amp;nbsp;In the past, it was still very typical for a household to have a means of producing their own music. &amp;nbsp;A woman was considered more&amp;nbsp;marriageable&amp;nbsp;if she were able to provide this service for her home. &amp;nbsp;The piano was the most popular choice for this, in my opinion because it arguably has a greater capacity to make a single musician a one man band than any other instrument. &amp;nbsp;There were other factors as well. &amp;nbsp;The depression hit, which drove down piano sales considerably, and recorded musical devices became more and more inexpensive. &amp;nbsp;When these devices became relatively mainstream, it gave households the ability to have music without the need of any musical talent or the cost of maintaining a musical instrument (pianos generally need tuned about twice a year). &amp;nbsp;This process, as most of you already know has been&amp;nbsp;accelerated&amp;nbsp;many times in recent history, with the advent of radio, CDs, portable players, and the MP3.&lt;br /&gt;&lt;br /&gt;While I do still spurn what the pop single culture has become, with its uncreative and sometimes downright&amp;nbsp;unpleasant&amp;nbsp;lyrics, its increasingly heavy use of autotuners, and seeming desire to sell sex rather than musical talent, I do still enjoy the occasional good beat. &amp;nbsp;What I'm really coming to sense as far as what's been lost over time is musical amateurism. &amp;nbsp;These days, with the world as your critic, you can't even watch a Youtube video of a little kid plucking out their first tune without reading a comment below of "this kid sukx". &amp;nbsp;Folk is essentially dead (at least in America). &amp;nbsp;The closest thing you can get to this amateurism (aside from high school recitals) is Indie. &amp;nbsp;And several of these bands are just corporate wannabes. &amp;nbsp;And because of this, it seems to be hard to find bands willing to break the mold being created by the professionals (you might find some on &lt;a href="http://www.jamendo.com/"&gt;Jamendo&lt;/a&gt;). &amp;nbsp;This lapse in creativity and morality is disturbing. &amp;nbsp;But so is how passive we've become in our interactions. &amp;nbsp;This goes for all our interactions like texting your mom instead of talking face to face, but also for our music. &amp;nbsp;Unless you count what&amp;nbsp;establishments largely built on lecherous recreation, like clubbing joints, our interaction with music and musically with each other is largely minimal. &amp;nbsp;I'm not saying that I'd like all such establishments shut down and the music industry to die. &amp;nbsp;Maybe it still has a place in our society,&amp;nbsp;I don't know. &amp;nbsp;But I would like to see people become more involved in the musical process and increasing the level of creativity in the music listened to by the general populace. &amp;nbsp;But If singing about getting &lt;a href="http://grooveshark.com/#/s/E+t+Ft+Kanye+West/3A6DnH"&gt;probed by aliens&lt;/a&gt; or getting excited by &lt;a href="http://grooveshark.com/#/s/S+and+m/3lm05k"&gt;chains and whips&lt;/a&gt;&amp;nbsp;represents the pinnacle of creativity in popular music then&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://images.cheezburger.com/completestore/2010/10/14/6f38488c-e82f-4de8-afc4-fcebc5f710ab.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="223" src="http://images.cheezburger.com/completestore/2010/10/14/6f38488c-e82f-4de8-afc4-fcebc5f710ab.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Why not mess around with music in your home? &amp;nbsp;Get a cheap keyboard (&lt;a href="http://www.amazon.com/Casio-LK94TV-61-Lighted-Keyboard-Output/dp/B000BI5HUO"&gt;$50&lt;/a&gt;), guitar (&lt;a href="http://www.amazon.com/Lauren-LA30-30-Student-Guitar/dp/B0002WSKA8"&gt;$40&lt;/a&gt;), recorder (&lt;a href="http://www.amazon.com/Yamaha-YRS-24B-YRS24B-Soprano-Recorder/dp/B00004UE29"&gt;$4&lt;/a&gt;), tin whistle (&lt;a href="http://www.amazon.com/Clarke-Celtic-Tin-Whistle-D/dp/B0002I8Y6W"&gt;$10&lt;/a&gt;), fife (&lt;a href="http://www.amazon.com/dp/B0002F5F9O"&gt;$5&lt;/a&gt;), or whatever floats your boat and create something! &amp;nbsp;It can't be any worst than the wares the music industry is currently offering!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1495182545029607572?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1495182545029607572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2011/08/musical-amateurism.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1495182545029607572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1495182545029607572'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2011/08/musical-amateurism.html' title='Musical Amateurism'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-419093966146929486</id><published>2011-08-01T00:15:00.001-04:00</published><updated>2012-01-05T13:51:52.026-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Tea is tea</title><content type='html'>So, it turns out the dude at Teavana was right: all teas (e.g. black, white, green, oolong, etc) are all prepared (check out the &lt;a href="http://en.wikipedia.org/wiki/Tea_processing"&gt;cool chart&lt;/a&gt;) from the same plant (&lt;a href="http://en.wikipedia.org/wiki/Camellia_sinensis"&gt;Camellia Sinensis&lt;/a&gt;).  Naturally, this excludes Rooibus and herbal teas. &amp;nbsp;But this surprised me.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://mlkshk.com/r/2HUV" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://mlkshk.com/r/2HUV" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Speaking of tea, I've always found this story interesting about how tea came to be. &amp;nbsp;The Bodhidharma was meditating soon after arriving in China for 9 years. &amp;nbsp;At some point during this time, he dozed off for just a second. &amp;nbsp;He was so frustrated at having broken his concentration that he cut off his eyelids so that he'd never be distracted again by sleep. &amp;nbsp;Guan Yin (Buddhist&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;bodhisattva&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;of compassion) caused the eyelids to grow into tea plants, used by Buddhist&amp;nbsp;practitioners&amp;nbsp;to this day to prevent sleep from interrupting their&amp;nbsp;meditations. &amp;nbsp;The Japanese character for tea leaf is the same as that for eyelid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-419093966146929486?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/419093966146929486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2011/08/tea-is-tea.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/419093966146929486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/419093966146929486'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2011/08/tea-is-tea.html' title='Tea is tea'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7367390604784740712</id><published>2010-12-17T14:16:00.010-05:00</published><updated>2010-12-17T16:37:11.396-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven 3 &amp; profiles.xml</title><content type='html'>There are some pretty cool things in Maven 3 (although mixins and &lt;a href="http://jira.codehaus.org/browse/MNG-1977"&gt;global dependency exclusions&lt;/a&gt; have been tabled until 3.1). Matt Raible talks about some of them &lt;a href="http://raibledesigns.com/rd/entry/what_s_new_in_maven"&gt;here&lt;/a&gt;. Significant points include dramatically increased performance (50% to 400% faster), unspecified plugin versions will pull the latest version and not snapshot versions (though it's best to be explicit about plugin versions), also Sonatype has developed &lt;a href="http://shell.sonatype.org/"&gt;Maven Shell&lt;/a&gt; and &lt;a href="http://polyglot.sonatype.org/"&gt;polyglot Maven&lt;/a&gt; to work with Maven 3.&lt;br /&gt;&lt;br /&gt;There are, however, some &lt;a href="https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html"&gt;compatibility&lt;/a&gt; concerns when moving from Maven 2.x. And not all plugins &lt;a href="https://cwiki.apache.org/MAVEN/maven-3x-plugin-compatibility-matrix.html"&gt;yet work&lt;/a&gt;. (Most notably they're refactoring the &lt;a href="http://maven.apache.org/plugins/maven-site-plugin/"&gt;Site Plugin&lt;/a&gt; so it's not completely working yet). But the Maven team intends the new release to be usable as a drop-in replacement for Maven 2 (though this won't be the case for Maven 3.1).&lt;br /&gt;&lt;br /&gt;Most changes for compatibility seemed pretty trivial. The biggest thing I see preventing Maven 3 from being a drop-in replacement for Maven 2 was their decision to remove support for profiles.xml. This was documented in &lt;a href="http://jira.codehaus.org/browse/MNG-4060"&gt;MNG-4060&lt;/a&gt;, though not much discussed there. A few people have complained about this already &lt;a href="http://maven.40175.n5.nabble.com/maven-3-profiles-xml-replacement-td3259750.html"&gt;here&lt;/a&gt; and it was discussed a little &lt;a href="http://markmail.org/message/6qqccwkrry5up2un"&gt;here&lt;/a&gt;. I haven't seen much justification for this, other than it's supposed to be difficult to test. Though I'm not sure why it'd be much harder to test than the use of profiles in the pom.xml. But the Maven team seems for whatever reason fairly committed to this idea, despite one of their committers (&lt;a href="http://blogs.codehaus.org/people/mkleint/"&gt;Milos Kleint&lt;/a&gt;) &lt;a href="http://jira.codehaus.org/browse/MNG-4060?focusedCommentId=199715&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_199715"&gt;disagreeing&lt;/a&gt; with their position.&lt;br /&gt;&lt;br /&gt;People use profiles for a variety of things. Where I work, they are commonly used for environment settings. For example, which version of a particular web service or database to use in prod, qa, etc. But also for which version of that service or database to use for a particular developer's sandbox (another common difference between developers is their log level). These typically use Maven filtering in conjunction with external profiles to accomplish this. These profile properties are also kept in our SCM so if something used by all developer's sandbox, it is easily changeable and transparent to all developers on the project. It is currently impossible to run Maven 3 in this way.&lt;br /&gt;&lt;br /&gt;We are not entirely without options when it comes to addressing this, but none of the solutions in my opinion is as nice as the stable, built-in profiles.xml feature. Recently, I've &lt;a href="http://stackoverflow.com/questions/4197687/use-maven-profiles-for-developer-sandbox-settings"&gt;asked&lt;/a&gt; if there is some other mechanism I should be using to accomplish this. To date, I've not seen anyone fully explore this issue that I think is important for Maven 3 going forward. So that's what I did here. If you'd like any of the sample projects I created for this exploration, just drop me a line. Maybe I'll put them up on GitHub or something at some point. So without further ado, here are the options I've found and their pros &amp;amp; cons.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;1. Fork Maven and put the feature back in&lt;/b&gt;&lt;/div&gt;Maybe it's my cynical nature, but this was actually the first thing that came to my mind. But I don't know that very many people would feel comfortable running a patched version of Maven. Plus, I'd want to keep forking them to keep getting all the other goodies they add, which makes a lot of work for me. Then I thought of submitting a patch to Maven for this. But when I found out the decision was pretty deliberate and not simply a lack of resources, I backed off that idea.&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;It's the way Maven should be&lt;/td&gt;    &lt;td width="50%"&gt;A lot of work&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;/td&gt;    &lt;td width="50%"&gt;Who's brave enough to use it?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;2. Stick with Maven 2&lt;/b&gt;&lt;/div&gt;Hey, there's nothing wrong with being old fashioned. There's strong logic to the "If it ain't broke, don't fix it" argument. Many people are even still happily on the 2.0.x branch rather than the 2.2.x branch.&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;The least work of any other solution&lt;/td&gt;    &lt;td width="50%"&gt;No Maven 3 goodies&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;3. Place all profiles properties in the POM&lt;/b&gt;&lt;/div&gt;POMs in Maven 3 still use a &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;. There for you could put everything inside it like&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false" title="pom.xml"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0"&lt;br /&gt;         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.foo&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;pomProfileTest&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;!-- these are defaults, they can be overridden with a settings.xml --&amp;gt;&lt;br /&gt;    &amp;lt;javaVersion&amp;gt;1.5&amp;lt;/javaVersion&amp;gt;&lt;br /&gt;    &amp;lt;junitVersion&amp;gt;4.8.2&amp;lt;/junitVersion&amp;gt;&lt;br /&gt;    &amp;lt;sourceEncoding&amp;gt;UTF-8&amp;lt;/sourceEncoding&amp;gt;&lt;br /&gt;    &amp;lt;resourceEncoding&amp;gt;UTF-8&amp;lt;/resourceEncoding&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;dev&amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;prop1&amp;gt;null&amp;lt;/prop1&amp;gt;&lt;br /&gt;    &amp;lt;prop2&amp;gt;null&amp;lt;/prop2&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;profiles&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;developer1&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;prop1&amp;gt;prop1Value&amp;lt;/prop1&amp;gt;&lt;br /&gt;        &amp;lt;prop2&amp;gt;prop2Value&amp;lt;/prop2&amp;gt;&lt;br /&gt;      &amp;lt;/properties&amp;gt;&lt;br /&gt;    &amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;developer2&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;prop1&amp;gt;anotherProp1Value&amp;lt;/prop1&amp;gt;&lt;br /&gt;        &amp;lt;prop2&amp;gt;anotherProp2Value&amp;lt;/prop2&amp;gt;&lt;br /&gt;      &amp;lt;/properties&amp;gt;&lt;br /&gt;    &amp;lt;/profile&amp;gt;&lt;br /&gt;  &amp;lt;/profiles&amp;gt;&lt;br /&gt;&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;This could then be invoked in the standard way:&lt;br /&gt;&lt;i&gt;mvn -P developer1 &amp;lt;goal&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Simple to implement: scripts can continue to invoke Maven in the current way&lt;/td&gt;    &lt;td width="50%"&gt;Clutters POM, particularly troublesome when the POM is also deployed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Also works with Maven 2&lt;/td&gt;    &lt;td width="50%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;b&gt;Variations&lt;/b&gt;&lt;br /&gt;&lt;i&gt;1. Multiple pom.xml files could be checked into the project to cut down on the clutter inside the main pom.xml.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;4. Place all an environment's (or developer's) settings in a single settings.xml&lt;/b&gt;&lt;/div&gt;This seems to be Maven's official &lt;a href="https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html#Maven3.xCompatibilityNotes-profiles.xml"&gt;answer&lt;/a&gt; on the subject. For things that are common across many projects, this might be a decent solution. But for the many project specific settings (e.g. a db.url property), you'd have to make sure they are named uniquely across all projects so as not to conflict with each other. This makes for a real maintenance problem.&lt;br /&gt;As one commenter in the mailing list noted, some developers have a fear of changing their settings.xml (even if they should be comfortable with this) and would prefer to simply change a few properties. But this should make us pause to make sure there's nothing we're using profiles.xml for when we should actually be using settings.xml.&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Maven's official solution&lt;/td&gt;    &lt;td width="50%"&gt;Uniquely named properties causes maintenance issues&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Also works with Maven 2&lt;/td&gt;    &lt;td width="50%"&gt;Changes not normally visible to all developers&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;5. Use separate settings.xml files&lt;/b&gt;&lt;/div&gt;You can specify a different user settings file with&lt;br /&gt;&lt;i&gt;mvn -s path/someSettingsFile.xml &amp;lt;goal&amp;gt;&lt;/i&gt;&lt;br /&gt;and create a file like&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false;" title="developer1.xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;settings xmlns=&amp;quot;http://maven.apache.org/SETTINGS/1.0.0&amp;quot;&lt;br /&gt;          xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;          xsi:schemaLocation=&amp;quot;http://maven.apache.org/SETTINGS/1.0.0&lt;br /&gt;                      http://maven.apache.org/xsd/settings-1.0.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;profiles&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;developer1&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;!-- global properties --&amp;gt;&lt;br /&gt;        &amp;lt;siteLocation&amp;gt;file://${user.dir}/site&amp;lt;/siteLocation&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;!-- project specific properties --&amp;gt;&lt;br /&gt;        &amp;lt;prop1&amp;gt;prop1Value&amp;lt;/prop1&amp;gt;&lt;br /&gt;        &amp;lt;prop2&amp;gt;prop2Value&amp;lt;/prop2&amp;gt;&lt;br /&gt;      &amp;lt;/properties&amp;gt;&lt;br /&gt;      &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;  &amp;lt;profiles&amp;gt;&lt;br /&gt;&amp;lt;/settings&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Little profile clutter in POM&lt;/td&gt;    &lt;td width="50%"&gt;Massive clutter &amp;amp; overhead in profile settings file, as all your normal settings.xml things are now in each profile settings file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Checking all these settings files in allows developers to make sure they're all using and deploying to the same repos&lt;/td&gt;    &lt;td width="50%"&gt;profile settings are machine-dependent since &amp;lt;localRepository/&amp;gt; is also in settings file.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Also works with Maven 2&lt;/td&gt;    &lt;td width="50%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;6. Use the Properties Maven Plugin&lt;/b&gt;&lt;/div&gt;The &lt;a href="http://mojo.codehaus.org/properties-maven-plugin/"&gt;Properties Maven Plugin&lt;/a&gt; allows for properties files to be loaded (and saved) just as if you had used &amp;lt;properties/&amp;gt; in the pom.xml itself.&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Properties are cleanly externalized&lt;/td&gt;    &lt;td width="50%"&gt;Plugin is considered an alpha version&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Also works with Maven 2&lt;/td&gt;    &lt;td width="50%"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Variations&lt;/b&gt;&lt;br /&gt;&lt;i&gt;1. Use profiles to select the properties file&lt;/i&gt;&lt;br /&gt;This could be invoked in the standard way:&lt;br /&gt;&lt;i&gt;mvn -P developer1 &amp;lt;goal&amp;gt;&lt;/i&gt;&lt;br /&gt;And your pom might look like&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false;" title="pom.xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;br /&gt;         xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;         xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.foo&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;propertiesProfileTest&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;!-- these are defaults, they can be overridden with a settings.xml --&amp;gt;&lt;br /&gt;    &amp;lt;javaVersion&amp;gt;1.5&amp;lt;/javaVersion&amp;gt;&lt;br /&gt;    &amp;lt;junitVersion&amp;gt;4.8.2&amp;lt;/junitVersion&amp;gt;&lt;br /&gt;    &amp;lt;sourceEncoding&amp;gt;UTF-8&amp;lt;/sourceEncoding&amp;gt;&lt;br /&gt;    &amp;lt;resourceEncoding&amp;gt;UTF-8&amp;lt;/resourceEncoding&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;dev&amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;prop1&amp;gt;null&amp;lt;/prop1&amp;gt;&lt;br /&gt;    &amp;lt;prop2&amp;gt;null&amp;lt;/prop2&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;profiles&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;developer1&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;developer1.properties&amp;lt;/profile&amp;gt;&lt;br /&gt;      &amp;lt;/properties&amp;gt;&lt;br /&gt;    &amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;      &amp;lt;id&amp;gt;developer2&amp;lt;/id&amp;gt;&lt;br /&gt;      &amp;lt;properties&amp;gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;developer2.properties&amp;lt;/profile&amp;gt;&lt;br /&gt;      &amp;lt;/properties&amp;gt;&lt;br /&gt;    &amp;lt;/profile&amp;gt;&lt;br /&gt;  &amp;lt;/profiles&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;properties-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.0-alpha-2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;          &amp;lt;execution&amp;gt;&lt;br /&gt;            &amp;lt;phase&amp;gt;initialize&amp;lt;/phase&amp;gt;&lt;br /&gt;            &amp;lt;goals&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;read-project-properties&amp;lt;/goal&amp;gt;&lt;br /&gt;            &amp;lt;/goals&amp;gt;&lt;br /&gt;            &amp;lt;configuration&amp;gt;&lt;br /&gt;              &amp;lt;files&amp;gt;&lt;br /&gt;                &amp;lt;file&amp;gt;${project.basedir}/filters/${profile}&amp;lt;/file&amp;gt;&lt;br /&gt;              &amp;lt;/files&amp;gt;&lt;br /&gt;            &amp;lt;/configuration&amp;gt;&lt;br /&gt;          &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;  &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Standard way for selecting profile&lt;/td&gt;    &lt;td width="50%"&gt;POM now is cluttered with mapping profiles to properties files&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;i&gt;2. Use a variable to select the properties file&lt;/i&gt;&lt;br /&gt;In my sample, the invocation would be&lt;br /&gt;&lt;i&gt;mvn -Dprofile=developer1 &amp;lt;goal&amp;gt;&lt;/i&gt;&lt;br /&gt;And the POM would be like&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false;" title="pom.xml"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;project xmlns=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;br /&gt;         xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;         xsi:schemaLocation=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;org.foo&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;propertiesProfileTest&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;!-- these are defaults, they can be overridden with a settings.xml --&amp;gt;&lt;br /&gt;    &amp;lt;javaVersion&amp;gt;1.5&amp;lt;/javaVersion&amp;gt;&lt;br /&gt;    &amp;lt;junitVersion&amp;gt;4.8.2&amp;lt;/junitVersion&amp;gt;&lt;br /&gt;    &amp;lt;sourceEncoding&amp;gt;UTF-8&amp;lt;/sourceEncoding&amp;gt;&lt;br /&gt;    &amp;lt;resourceEncoding&amp;gt;UTF-8&amp;lt;/resourceEncoding&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;dev&amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;prop1&amp;gt;null&amp;lt;/prop1&amp;gt;&lt;br /&gt;    &amp;lt;prop2&amp;gt;null&amp;lt;/prop2&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;properties-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.0-alpha-2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;          &amp;lt;execution&amp;gt;&lt;br /&gt;            &amp;lt;phase&amp;gt;initialize&amp;lt;/phase&amp;gt;&lt;br /&gt;            &amp;lt;goals&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;read-project-properties&amp;lt;/goal&amp;gt;&lt;br /&gt;            &amp;lt;/goals&amp;gt;&lt;br /&gt;            &amp;lt;configuration&amp;gt;&lt;br /&gt;              &amp;lt;files&amp;gt;&lt;br /&gt;                &amp;lt;file&amp;gt;${project.basedir}/filters/${profile}.properties&amp;lt;/file&amp;gt;&lt;br /&gt;              &amp;lt;/files&amp;gt;&lt;br /&gt;            &amp;lt;/configuration&amp;gt;&lt;br /&gt;          &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;  &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="50%"&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/td&gt;    &lt;td width="50%"&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="50%"&gt;Little profile clutter in POM&lt;/td&gt;    &lt;td width="50%"&gt;No standard way of selecting profile&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;I still really wish the Maven folks would change their mind on this. But until then (unless you're sticking with Maven 2 -- which might not be a bad idea at least for now because of plugin incompatibilities), the best option seems to me to use the Maven Properties Plugin, either with a property or with a profile. (Personally, I'm leaning to the profile option beacuse I think the fact it can be invoked in a standard way is worth the extra POM clutter). Though it is technically an alpha version, it seemed to work fine for me and I believe Maven's decision to remove support for profiles.xml will cause people to flock to this plugin, and therefore likely to only increase its stability. Of course, IDE support for this practice is another question.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;font-size: large;"&gt;&lt;b&gt;Conclusion Part 2&lt;/b&gt;&lt;/div&gt;I do feel obligated to mention that the practice of using Maven filtering for things like database URLs where I work is actually changing to use runtime properties instead. (Generally by building a property reader class using &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/Properties.html"&gt;java.util.Properties&lt;/a&gt; to read different properties files based on the name passed with -Denv=&amp;lt;environmentName&amp;gt;). This has the advantage (besides working with Maven 3) of not requiring separate deployments just for environment differences or redeploys for changes to an environment property.&lt;br /&gt;I still think removing profiles.xml support is bad since the intent was to keep backward compatibility, thus making pointing my M2_HOME to Maven 3 a bit painful when working on old and new projects. It also seems a bit strange that they removed support for profiles.xml when they but not for profiles. It was nice to be able to have those external to the POM.&lt;br /&gt;However, for my (and probably the gentleman on Nabble also) use case, Maven filtering with profiles probably may not have been the right idea in the first place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7367390604784740712?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7367390604784740712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/12/maven-3-profilesxml.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7367390604784740712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7367390604784740712'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/12/maven-3-profilesxml.html' title='Maven 3 &amp; profiles.xml'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6024323850704020481</id><published>2010-10-24T15:18:00.001-04:00</published><updated>2010-10-25T09:01:37.988-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>My Review of Medal of Honor (2010)</title><content type='html'>I was on the fence about getting this game.&amp;nbsp; If they didn't offer guns that were only available through pre-ordering, I may not have even gotten the game.&amp;nbsp; But this coupled with the bonus sniper rifle for having BC2 VIP, and my lack of interest in the upcoming CoD game nudged me to the purchasing side of the fence.&amp;nbsp; Oh, one other bonus is that you get in on the beta for Battlefield 3 (if that's important to you).&amp;nbsp; And probably there'll be other bonuses through EA's &lt;a href="http://gunclub.ea.com/"&gt;Gun Club&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First off: everything mediocre I've read about this game is true.&amp;nbsp; The single player is unremarkable in almost every way, it does suffer from a few scripting issues (I don't think worst than other MoH titles I've played, but our standards have gone up since then), and the graphics stutter in a few places (seemed to me to be mostly around save points).&amp;nbsp; On the plus side, the sliding into cover system they have in single player is pretty cool.&amp;nbsp; Unfortunately, this isn't available in multiplayer.&amp;nbsp; Which is the other unfortunate thing about this game: how disconnected the singleplayer is from the multiplayer.&amp;nbsp; It was done by two teams, in two countries, with two different engines, and they seemed to communicate very little between them during development.&amp;nbsp; It's amazing how much time (3 years) was spent on the singleplayer and yet it still rings pretty hollow at the end of the day.&amp;nbsp; Interestingly, EA's stock dropped 6% on launch day, due to investors being worried by the mediocre reviews.&amp;nbsp; There are a couple of interesting levels, but nothing we haven't really seen before and no level sticks out in my memory as "woah, that was awesome!".&amp;nbsp; There's a level where you get to use attack helicopters, a sniping level, a level with ATVs, and the cinematics are pretty good (and you could skip them if you wanted to, which I've not seen in recent games).&amp;nbsp; The storyline could have been a little tighter (for example the incompetent, friendly-fire causing general is all but forgotten later in the game), but I did like that it was grittier and had fewer Jack Bauer-esque moments than MW2's storyline.&lt;br /&gt;&lt;br /&gt;For the mulitiplayer side: It's actually pretty good, and I've found the description as a hybrid of BC2 and MW2 to be true.&amp;nbsp; This game differs from BC2 in that there is limited destructibility (one of the coolest things about BC2), and most game modes don't have any vehicles (the other really cool thing about BC2), although there are light tanks in one of the modes.&amp;nbsp; There are perks like in MW2, but you don't roll through them in the frantic pace that seems to dominate MW2.&amp;nbsp; The guns do seem more balanced than either of the other 2 games.&amp;nbsp; The maps are bigger than MW2, but smaller than BC2.&amp;nbsp; One thing that is unique about their perk system is that every time you unlock a perk, you can choose between a defensive and an offensive action.&amp;nbsp; Defensive actions include stuff like enemy radar and flak vests for your buddies, and offensive actions involve things like mortar strikes and rocket strikes.&amp;nbsp; But unlike MW2, then chain of perks is not configurable.&amp;nbsp; Like BC2 and MW2, you unlock new guns and stuff for your guns as you progress ranks by earning points.&amp;nbsp; The number of rounds to take down an opponent is about the same as BC2 (they have a hardcore mode too, which I haven't tried yet).&lt;br /&gt;The only major downside to the multiplayer is the spawn points.&amp;nbsp; They're awful.&amp;nbsp; In BC2, you'd only get popped on spawn if you spawned on a buddy about to get pwnd. In this game I find myself spawning into a mortar strike or into a gang of enemies fairly often.&amp;nbsp; Which, needless to say, is intensely aggravating (particularly after it happens 4 times in a row -- not uncommon since kills with a perk count towards the next perk).&amp;nbsp; In some modes, you can spawn back to your base instead of the front, but not all modes have this idea (for example their version of Death Match).&amp;nbsp; But sometimes you can use this to your advantage.&amp;nbsp; On some maps, I've been able to run up to one of their spawn points with my M60 a few seconds into the game and wipe half their team before they can put a stop to my mayhem.&amp;nbsp; A dirty trick, but it made me giggle.&lt;br /&gt;&lt;br /&gt;Overall, if you have to choose between this game and BC2 and MW2, I'd say get either BC2 or MW2 (depending on your playing style).&amp;nbsp; But if you already have those games and are looking for something with a little less Vietnam and RC cars, this might make for a good distraction until something better comes along.&amp;nbsp; It's definitely not a terrible game, but its not an amazing game either.&amp;nbsp; The worst thing about it is realizing what could have been...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6024323850704020481?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6024323850704020481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/10/my-review-of-medal-of-honor-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6024323850704020481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6024323850704020481'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/10/my-review-of-medal-of-honor-2010.html' title='My Review of Medal of Honor (2010)'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-754171791994772997</id><published>2010-10-24T14:33:00.000-04:00</published><updated>2010-10-24T14:33:12.065-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>Bad Company 2 vs Modern Warfare 2</title><content type='html'>I'd played and loved Modern Warfare 2. I still believe it to be the best multilayer first person shooter I've ever played. That said, when MW2 released their so-called stimulus package at a rate of $15, I felt like that was kind of an insult to their playerbase, which helped them to record-breaking profits in the midst of a recession (particularly when 3 of the maps weren't even new). When I saw that BC2 offered new maps for free (and had already released 2), and claims some were making that it was a better game than MW2, I had to give it a try. What follows is my impressions in contrast to MW2.&lt;br /&gt;&lt;br /&gt;When I first started playing the game, I felt a bit underwhelmed. The single player in MW2 is short, but intense. The single player in BC2 might be worth playing to get a feel for the characters, but its a pretty forgettable experience. But the singleplayer isn't why you bought the game anyway.&lt;br /&gt;&lt;br /&gt;The sound is great, the graphics look not quite as nice as MW2 in particular with regard to weapon detail, but I think some of this is the scaling. My impression is that BC2 drew humans with a more realistic relative size, this coupled with that the maps are much larger makes everything seem a bit smaller, and perhaps not as graphically wowing. But if you look at the water, buildings, and people (up close), the graphics actually are pretty good.&amp;nbsp; You just might not notice it at first.&lt;br /&gt;&lt;br /&gt;There's also some fun stuff about BC2's personality. In singleplayer, whilst riding some 4-wheelers, they comment how much more awesome 4-wheelers are than snowmobiles. While heading into a mission, one says that they want to go in first, because otherwise they'll send some pansy special ops group with rifles and heartbeat sensors. All, of course, references to Modern Warfare 2's singleplayer campaign.&lt;br /&gt;&lt;br /&gt;Gameplay: I'd have to say neither are 'better' than the other. BC2 is a different kind of game than MW2. MW2 is a run &amp;amp; gun fragging game, with BC2 there's more strategy. MW2 is on smaller maps, where people routinely camp in predictable places. BC2 has huge maps where camping is largely meaningless. MW2 lets you build a custom warrior with a wide array of addons and perks. BC2 has some customization, but not as large as MW2, and only within your class (rifleman, recon, medic, and engineer). There are no perks like MW2 has after a certain number of kills. BC2 has vehicles prominently featured in combat. MW2 does not. BC2 has destructible environments. MW2 does not. (As a MW2 player, you'll be really lost at first 'How the hell am I supposed to take cover? Everything is exploding!').&lt;br /&gt;I also really love what they've done with the sniper, calling it recon.&amp;nbsp; This makes the role more useful than some griefer only contributing a few kills, because they can call out enemy positions they observe through their scope and place motion sensors.&lt;br /&gt;&lt;br /&gt;There are some minor gripes I have with BC2. Such as the repeating sound on the unlock page once you unlock everything for a class, the small and difficult to read menus when not displayed on a widescreen TV, the awful guns you start with in assault class, the unskippable cinematics when you start the game and at the end of each round of multiplayer.&lt;br /&gt;&lt;br /&gt;They do seem to have taken a cue from MW2 when it comes to unlocks. You'll be able to win new guns and gadgets as you play along in multiplayer. The pace seemed slower to me than MW2 because there weren't a lot of little things that you unlocked like MW2. But many people find 'the hump' less than MW2. I'd say the guns are more balanced overall (with the exception of the M80 for the medic class). One thing I don't get is the pins you win for doing things like getting a revenge kill, being thrifty with your LMG ammo, etc. They award them to you, but you can't really do anything with them. It was nice in MW2 to be able to brag about them by putting them up with your nametag.&lt;br /&gt;&lt;br /&gt;What others have said about BC2 being more strategy and team oriented is true. You can't win the game by yourself. While they do have a deathmatch, I play (and most others too I think) rush or conquest, mostly rush in my case. It doesn't matter if you go around slaughtering the other team (although I think you'll find that more difficult to pull off in this game). If your buddies don't have your back, your team will still lose (and you will probably die).&lt;br /&gt;&lt;br /&gt;I didn't feel like BC2 was a better game, especially with respect to single player. And while instinctively I'd say buy MW2 before buying BC2, I also have to recall that since getting BC2 I've barely touched MW2. I certainly don't miss the camping, lag &amp;amp; DCs. If you have a preference for fragging games, get MW2. If you enjoy multiplayer shooters that involve a little more strategy, get BC2. If you've got enough money, get both. They each have something different to offer, and having both provides for a good change of pace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-754171791994772997?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/754171791994772997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/10/bad-company-2-vs-modern-warfare-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/754171791994772997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/754171791994772997'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/10/bad-company-2-vs-modern-warfare-2.html' title='Bad Company 2 vs Modern Warfare 2'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7830827892788750874</id><published>2010-07-18T16:38:00.000-04:00</published><updated>2010-07-18T16:38:54.333-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Cousins Cousins Cousins</title><content type='html'>I consistently forget the difference the various kinds of cousins you can have. Fortunately, I recently found a chart that explains it all (and not just cousins) on Wikipedia:&lt;br /&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/0/00/Relatives_Chart.svg"&gt;http://upload.wikimedia.org/wikipedia/commons/0/00/Relatives_Chart.svg&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7830827892788750874?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7830827892788750874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/cousins-cousins-cousins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7830827892788750874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7830827892788750874'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/cousins-cousins-cousins.html' title='Cousins Cousins Cousins'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5264221712961698200</id><published>2010-07-14T22:04:00.000-04:00</published><updated>2010-07-14T22:04:12.430-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>I opened a new IntelliJ issue</title><content type='html'>I opened &lt;a href="http://youtrack.jetbrains.net/issue/IDEA-56520"&gt;an issue&lt;/a&gt; for IntelliJ IDEA to highlight TODOs in blue in gsp files like they do for other files tonight. Vote if you're interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5264221712961698200?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5264221712961698200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/i-opened-new-intellij-issue.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5264221712961698200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5264221712961698200'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/i-opened-new-intellij-issue.html' title='I opened a new IntelliJ issue'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2720844749240287862</id><published>2010-07-13T17:07:00.003-04:00</published><updated>2010-12-07T13:03:14.393-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='userscripts'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Greasemonkey and local files</title><content type='html'>I'm a big fan of the &lt;a href="http://userscripts.org/scripts/show/23200"&gt;Javadoc Search Frame&lt;/a&gt; userscript. Today's apperent outage of the Javadoc page has forced me to use a local copy of the documentation. I did some poking around on the Greasemonkey mailing list and &lt;a href="http://www.mail-archive.com/greasemonkey-users@googlegroups.com/msg01038.html"&gt;found&lt;/a&gt; that if you still want to run this userscript (or any other userscript) on local files, you will need to edit your about:config. An update changed the default &lt;i&gt;greasemonkey.fileIsGreaseable&lt;/i&gt; in about:config from true to false for security reasons.  If you want to run Greasemonkey on local files, simply change that value to true.&lt;br /&gt;&lt;br /&gt;Also, if you're using the shiny new &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/231203/"&gt;Scriptish&lt;/a&gt;, the value to set to true is &lt;i&gt;extensions.scriptish.fileIsGreaseable&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2720844749240287862?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2720844749240287862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/greasemonkey-and-local-files.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2720844749240287862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2720844749240287862'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/greasemonkey-and-local-files.html' title='Greasemonkey and local files'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7172770023744861039</id><published>2010-07-12T10:29:00.002-04:00</published><updated>2010-07-12T10:35:30.449-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>BASH Colors</title><content type='html'>I was messing with my &lt;a href="http://linux.die.net/man/5/dir_colors"&gt;.dir_colors&lt;/a&gt; file (about.com also has a &lt;a href="http://linux.about.com/library/cmd/blcmdl5_dir_colors.htm"&gt;good article&lt;/a&gt; on this) and wanted a chart to help me pick out my colors. So I modified the popular script that is floating around on the internet to display every possible combination in a graphical chart.&lt;br /&gt;The way it is read is foreground and effect is on the row titles and the backgrounds are on the column titles. Hopefully someone else will find this useful.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell; wrap-lines:false" title="colors.sh"&gt;#!/bin/bash&lt;br /&gt;#&lt;br /&gt;#  This file echoes a bunch of color codes to the &lt;br /&gt;#  terminal to demonstrate what's available.  Each &lt;br /&gt;#  line is the color code of one forground color,&lt;br /&gt;#  out of 17 (default + 16 escapes), followed by a &lt;br /&gt;#  test use of that color on all nine background &lt;br /&gt;#  colors (default + 8 escapes).&lt;br /&gt;# &lt;br /&gt;#  Attribute codes: &lt;br /&gt;#   00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed&lt;br /&gt;#  Text color codes:&lt;br /&gt;#   30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white&lt;br /&gt;#  Background color codes:&lt;br /&gt;#   40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white&lt;br /&gt;#&lt;br /&gt;#  A quick test can be done by echo -e &amp;quot;\033[&amp;lt;color code&amp;gt;&amp;lt;test text&amp;gt;\033[0m&amp;quot;&lt;br /&gt;#   e.g. echo -e &amp;quot;\033[01;32mHello World\033[0m&amp;quot;&lt;br /&gt;#&lt;br /&gt;#  Modified from: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html&lt;br /&gt;&lt;br /&gt;T='gYw'   # The test text&lt;br /&gt;&lt;br /&gt;# smaller set without attribute codes commented out below&lt;br /&gt;#echo -e &amp;quot;\n                 40m     41m     42m     43m     44m     45m&amp;quot; \&lt;br /&gt;#        &amp;quot;    46m     47m&amp;quot;;&lt;br /&gt;#for FGs in '    m' '   1m' '  30m' '  31m' '  32m' '  33m' '  34m' '  35m' \&lt;br /&gt;#           '  36m' '  37m' ;&lt;br /&gt;echo -e &amp;quot;\n                  40m     41m     42m     43m     44m     45m&amp;quot; \&lt;br /&gt;        &amp;quot;    46m     47m&amp;quot;;&lt;br /&gt;for FGs in '     m' '    1m' \&lt;br /&gt;           '   30m' '01;30m' '02;30m' '03;30m' '05;30m' '07;30m' '08;30m' \&lt;br /&gt;           '   31m' '01;31m' '02;31m' '03;31m' '05;31m' '07;31m' '08;31m' \&lt;br /&gt;           '   32m' '01;32m' '02;32m' '03;32m' '05;32m' '07;32m' '08;32m' \&lt;br /&gt;           '   33m' '01;33m' '02;33m' '03;33m' '05;33m' '07;33m' '08;33m' \&lt;br /&gt;           '   34m' '01;34m' '02;34m' '03;34m' '05;34m' '07;34m' '08;34m' \&lt;br /&gt;           '   35m' '01;35m' '02;35m' '03;35m' '05;35m' '07;35m' '08;35m' \&lt;br /&gt;           '   36m' '01;36m' '02;36m' '03;36m' '05;36m' '07;36m' '08;36m' \&lt;br /&gt;           '   37m' '01;37m' '02;37m' '03;37m' '05;37m' '07;37m' '08;37m';&lt;br /&gt;  do FG=${FGs// /}  &lt;br /&gt;  echo -en &amp;quot; $FGs \033[$FG  $T  &amp;quot;&lt;br /&gt;  for BG in '40m' '41m' '42m' '43m' '44m' '45m' '46m' '47m';&lt;br /&gt;    do echo -en &amp;quot;$EINS \033[$FG\033[$BG  $T  \033[0m&amp;quot;;&lt;br /&gt;  done&lt;br /&gt;  echo;&lt;br /&gt;done&lt;br /&gt;echo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As a side note, for those who may be like myself and didn't see any logic to the codes used for colors, ls and most terminals use the &lt;a href="http://en.wikipedia.org/wiki/ANSI_escape_code"&gt;ANSI escape codes&lt;/a&gt;&amp;nbsp;(&lt;a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf"&gt;ECMA-48&lt;/a&gt;), which is where the numbers come from.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7172770023744861039?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7172770023744861039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/bash-colors.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7172770023744861039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7172770023744861039'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/07/bash-colors.html' title='BASH Colors'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-540112659944259144</id><published>2010-06-07T23:41:00.010-04:00</published><updated>2010-06-08T12:25:42.981-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='wave'/><title type='text'>Snapshots of Wave Robot API Now Available</title><content type='html'>I've Mavenized the &lt;a href="http://code.google.com/p/wave-robot-java-client/"&gt;Wave Robot API&lt;/a&gt; and the Wave model portion of &lt;a href="http://code.google.com/p/wave-protocol/"&gt;Wave Protocol&lt;/a&gt;, a dependency of Wave Robot API and deployed snapshots to my public &lt;a href="http://code.google.com/p/public-repo/"&gt;repository&lt;/a&gt;. Currently, I've only deployed snapshots since the use of this artifact is completely untested. I'm working on creating a Maven archetype for Wave robots (which will use this repository until Google uploads it somewhere), and an example using the archetype. After I've done this and am sure it works (and that I haven't done anything stupid with Maven), then I will tag a release and put it on my release repository.&lt;br /&gt;&lt;br /&gt;If anyone would like to try it out in the mean time, your feedback would be most appreciated! Here is what you would need in your pom.xml:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false"&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;com.google.wave&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;wave-robot-api&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;20100408-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;public-repo_maven2-repository&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://public-repo.googlecode.com/svn/repository/&amp;lt;/url&amp;gt;&lt;br /&gt;        &amp;lt;snapshots&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;        &amp;lt;/snapshots&amp;gt;&lt;br /&gt;        &amp;lt;releases&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br /&gt;        &amp;lt;/releases&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;    &amp;lt;repository&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;public-repo_maven2-snapshots&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://public-repo.googlecode.com/svn/snapshots/&amp;lt;/url&amp;gt;&lt;br /&gt;        &amp;lt;snapshots&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br /&gt;        &amp;lt;/snapshots&amp;gt;&lt;br /&gt;        &amp;lt;releases&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;        &amp;lt;/releases&amp;gt;&lt;br /&gt;    &amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;/pre&gt;&lt;br /&gt;Some stuff I picked up along the way:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When using the WebDAV wagon with Google Code, make sure you use https, otherwise you're liable to get a 405 method not allowed error on a deploy.&lt;/li&gt;&lt;li&gt;There's an interesting bug with the Robot API's EventSerializerTest. The behavior is different in Javac 1.5 vs 1.6 but compile fine with the Eclipse compiler. There is bug report for Javac &lt;a href="ttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6302954"&gt;here&lt;/a&gt; (fixed in 1.7). I opened &lt;a href="http://code.google.com/p/google-wave-resources/issues/detail?id=782"&gt;a ticket&lt;/a&gt; for Google to explicitly cast this in the method so the compiler doesn't have to do any inference, so that way it will build fine with Javac even if they're using JDK 1.6. In the mean time, I've opted to use the Eclipse compiler in the pom rather than altering my local copy of the source. My goal is to make this an exact match to the class files in the zip they've distributed.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/guava-libraries/"&gt;Guava&lt;/a&gt;, the successor to &lt;a href="http://code.google.com/p/google-collections/"&gt;Google Collections&lt;/a&gt; (as a backwards compatible superset) and dependency of the Wave model API is on Maven central, but not on Google's &lt;a href="http://code.google.com/p/google-maven-repository/"&gt;repository&lt;/a&gt;. It's a little odd, but shouldn't cause any issues.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A special thanks to Jurgen and commenters for the helpful &lt;a href="http://www.beeworks.be/hosting-maven-repository-google-code/"&gt;post&lt;/a&gt; that got me started.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-540112659944259144?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/540112659944259144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/06/snapshots-of-wave-robot-api-now.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/540112659944259144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/540112659944259144'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/06/snapshots-of-wave-robot-api-now.html' title='Snapshots of Wave Robot API Now Available'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7378821091060752919</id><published>2010-06-04T00:17:00.010-04:00</published><updated>2010-06-04T02:36:26.371-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='wave'/><title type='text'>Bots updated to v2 API</title><content type='html'>I've updated &lt;a href="http://code.google.com/p/worldcat-bot/"&gt;WorldCat-Bot&lt;/a&gt; and &lt;a href="http://code.google.com/p/yodaspeakify/"&gt;Yodaspeakify&lt;/a&gt; to v2 of the Wave API, which &lt;a href="http://googlewavedev.blogspot.com/2010/03/introducing-robots-api-v2-rise-of.html"&gt;boasts&lt;/a&gt; some fantastic new features, including an easier way to do annotations, doing away with Cron, no need for a separate profile servlet, and the capabilities.xml is automatically generated for you using annotations.&lt;br /&gt;&lt;br /&gt;One thing I &lt;a href="http://code.google.com/p/google-wave-resources/issues/detail?id=773"&gt;voted for&lt;/a&gt; as an improvement was to use regular expressions in this method. I'm not sure what the author of the issue was talking about with iterating over &lt;a href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/com/google/wave/api/Element.html"&gt;Element&lt;/a&gt;s since, as I understand, these don't include text. The artifacts are still not on Google's repository and I'm getting pretty tired of a 5 minute commit time when I change some jars around.&amp;nbsp; I'm working on using Google Code as a repository and adding these artifacts after I mavenize them, then I'll create archetypes for Wave -- watch for an update on this soon, now that my bots are done this is the next project.&lt;br /&gt;&lt;br /&gt;Some snags I ran into:&lt;br /&gt;The .replace() of &lt;a href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/com/google/wave/api/BlipContentRefs.html"&gt;BlipContentRefs&lt;/a&gt; doesn't work the way you'd think it would. I thought I could do&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;BlipContentRefs content = blip.first(originalText).replace(newText);&lt;/pre&gt;But the BlipContentRefs will be empty. I got a hint for how to do this from &lt;a href="http://code.google.com/p/wadrobotframework/"&gt;wadrobotframework's&lt;/a&gt; &lt;a href="http://code.google.com/p/wadrobotframework/source/browse/trunk/src_V2/org/wadael/waverobotfrmwrk/utils/BlipUtils.java"&gt;BlipUtils&lt;/a&gt;:&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;public static void replaceBlipContent(Blip bleep, String nextContent) {&lt;br /&gt;    BlipContentRefs bcr = bleep.all();&lt;br /&gt;    if (bcr != null) {&lt;br /&gt;        bcr.delete();&lt;br /&gt;        bleep.append(nextContent);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Thanks, wadael!&lt;br /&gt;&lt;br /&gt;Another issue was when I used &lt;a href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/com/google/wave/api/event/DocumentChangedEvent.html"&gt;DocumentChangedEvent&lt;/a&gt; and then did a .getBlip() it would return a null &lt;a href="http://wave-robot-java-client.googlecode.com/svn/trunk/doc/com/google/wave/api/Blip.html"&gt;Blip&lt;/a&gt;. My understanding of the JavaDoc was that it would return the root blip if no Blip was associated with that event, but this didn't seem to be happening. So, I opted for a BlipSubmittedEvent instead. Which, now that I think about it, is probably the desired behavior anyway.&lt;br /&gt;&lt;br /&gt;Another issue was when I was trying to take advantage of the cool new &lt;a href="http://code.google.com/apis/wave/extensions/robots/events.html#EventFiltering"&gt;filtering&lt;/a&gt; options. WorldCat-Bot used to surround it's searches with angle brackets (&amp;lt;&amp;gt;), but when I tried to filter on this&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;@Capability(filter = "&amp;lt;.*&amp;gt;")&lt;br /&gt;@Override&lt;br /&gt;public void onDocumentChanged(DocumentChangedEvent event) {&lt;br /&gt;  ...&lt;br /&gt;}&lt;/pre&gt;It didn't work because the capabilities.xml that was generated was not well formed. I also tried the escaped version&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;@Capability(filter = "&amp;amp;lt;.*&amp;amp;gt;")&lt;br /&gt;@Override&lt;br /&gt;public void onDocumentChanged(DocumentChangedEvent event) {&lt;br /&gt;  ...&lt;br /&gt;}&lt;/pre&gt;But this didn't work either, it looked for the entire literal not the unescaped form. I don't think this is currently possible to do, so I now use square brackets ([]) to filter on.&lt;br /&gt;&lt;br /&gt;While trying to debug this, I set up logging (&lt;a href="http://code.google.com/appengine/"&gt;GAE&lt;/a&gt; supports &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/logging/package-summary.html"&gt;JUL&lt;/a&gt;), but I learned it only logs things with INFO, WARN, and SEVERE levels (though I couldn't get INFO to work even with the logging.properties file with .level = ALL. Maybe something else is misconfigured).&lt;br /&gt;&lt;br /&gt;But overall, the new API has been a very positive experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7378821091060752919?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7378821091060752919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/06/bots-updated-to-v2-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7378821091060752919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7378821091060752919'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/06/bots-updated-to-v2-api.html' title='Bots updated to v2 API'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7246436444657638712</id><published>2010-06-03T21:30:00.003-04:00</published><updated>2010-06-04T00:25:13.341-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Chai I've tried</title><content type='html'>On chai: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tazo's Chai Latte -&amp;gt; thumbs up: Best off the shelf chai I've tasted&lt;/li&gt;&lt;li&gt;Oregon Trail Original Chai -&amp;gt; thumbs down: tasted like southern sweet tea mixed with milk. I ended up dumping it down the drain after not being able to finish a single glass :(&lt;/li&gt;&lt;/ul&gt;On an unrelated note, Mrs. T's pierogies are pretty good as well (especially the 4 cheese). While they can be prepared many ways, I think they're best prepared by defrosting in the microwave then sauteed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7246436444657638712?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7246436444657638712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/06/chai-ive-tried.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7246436444657638712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7246436444657638712'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/06/chai-ive-tried.html' title='Chai I&apos;ve tried'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-8659168195308455891</id><published>2010-06-02T15:34:00.011-04:00</published><updated>2011-08-21T14:29:11.670-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>GMaven &amp; source encodings</title><content type='html'>I'm re-posting this because I made some more discoveries after I had initially posted it.&lt;br /&gt;&lt;br /&gt;I discovered apparently SourceEncoding is completely broken in GMaven. I tried on Linux where the platform default encoding is UTF-8 and on Windows XP where the platform default encoding is Windows-1252. In both cases, it used ISO-8859-1 as the encoding of the class file it generated, despite the fact the source was encoded in the platform default encoding. I tested this with version 1.2 of the plugin and Groovy 1.7.0. Why this is happening makes no sense to me; I could understand if it used the platform default...but why always ISO-8859-1? I think this is the Jira for this: &lt;a href="http://jira.codehaus.org/browse/GMAVEN-13"&gt;http://jira.codehaus.org/browse/GMAVEN-13&lt;/a&gt;.&lt;br /&gt;I find it shockingly disappointing that a 'critical' issue can go unassigned for almost an entire year. I wonder if it is working in Ant. Their &lt;a href="http://groovy.codehaus.org/The+groovyc+Ant+Task"&gt;documentation&lt;/a&gt; seems to suggest that it does. If that's true, it might tell us something about where the Groovy team's priorities are. &lt;br /&gt;&lt;br /&gt;In practice, this often is not problem, since if you're only using ASCII characters in your source code, the first 128 bytes have identical mappings in UTF-8, ISO-8859-1, and Windows-1252, so it won't matter which of those the plugin tries to use. However, I view this as a major obstacle to Groovy's gaining dominance, as it should support Maven (since for better or worst it's become the leading standard) and it should support encodings to support global growth.&lt;br /&gt;&lt;br /&gt;Am I missing something? Any good workarounds? I'm also happy to share my experiment project with anyone who wants to play with it.&lt;br /&gt;&lt;br /&gt;I've also discovered yet another way in which GMaven's documentation is fail. I was trying to get my project to work with the latest version of Groovy, when I came across &lt;a href="http://stackoverflow.com/questions/2199547/maven-compile-mixed-java-groovy-1-7-project-using-gmaven-plugin"&gt;this&lt;/a&gt; unrelated StackOverflow discussion which use the new 1.2 version of the plugin (which isn't in the archetype or anywhere documented as released -- I thought the artifacts were released by mistake since nothing has even been tagged in their repository for 1.1 or 1.2, although IntelliJ already &lt;a href="http://youtrack.jetbrains.net/issue/IDEA-51718"&gt;supports&lt;/a&gt; it, plus &lt;a href="http://old.nabble.com/GMaven-and-Groovy-1.7-td27378212.html"&gt;nabble&lt;/a&gt; and some &lt;a href="http://btilford.blogspot.com/2010/02/groovy-170-and-gmaven-12-multi-module.html"&gt;blogs&lt;/a&gt; talk about it so I guess it is released). Here are the needed bits from the pom:&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false"&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.gmaven.runtime&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;gmaven-runtime-1.7&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;    &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.gmaven&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;gmaven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;        &lt;br /&gt;        &amp;lt;configuration&amp;gt; &lt;br /&gt;            &amp;lt;providerSelection&amp;gt;1.7&amp;lt;/providerSelection&amp;gt;         &lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;            &amp;lt;execution&amp;gt;&lt;br /&gt;                &amp;lt;goals&amp;gt;&lt;br /&gt;                    &amp;lt;goal&amp;gt;generateStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;                    &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&lt;br /&gt;                    &amp;lt;goal&amp;gt;generateTestStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;                    &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;&lt;br /&gt;                &amp;lt;/goals&amp;gt;&lt;br /&gt;            &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;    &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;            &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;            &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;    &amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;/pre&gt;&lt;br /&gt;Update: According to &lt;a href="http://jira.codehaus.org/browse/GMAVEN-65"&gt;this&lt;/a&gt; Jira, this is fixed in the 1.3 release.  And it appears from my tests that this is the case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-8659168195308455891?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/8659168195308455891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/gmaven-source-encodings.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8659168195308455891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8659168195308455891'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/gmaven-source-encodings.html' title='GMaven &amp; source encodings'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2861559007002709482</id><published>2010-05-28T13:56:00.005-04:00</published><updated>2011-04-12T01:43:10.343-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><title type='text'>Firefox vs Chrome Performance: A language difference?</title><content type='html'>Like many folks, I've been pretty blown away by the speed of Chrome (especially with respect to running JavaScript intensive sites). Currently, I use both &lt;a href="http://www.mozilla.com/en-US/"&gt;Firefox&lt;/a&gt;  and &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; (depending on what I'm doing), but primarily  Firefox as there are still some addons I can't live without.&lt;br /&gt;&lt;br /&gt;Though I am excited to see the Out Of Process (OOP) &lt;a href="https://wiki.mozilla.org/Electrolysis"&gt;Electrolysis&lt;/a&gt; project (which is now in &lt;a href="http://www.mozilla.com/en-US/firefox/3.6.4build5/releasenotes/"&gt;beta&lt;/a&gt;) and the upcoming &lt;a href="http://blog.mozilla.com/dmandelin/2010/02/26/starting-jagermonkey/"&gt;JägerMonkey&lt;/a&gt; JavaScript engine, I've begun to wonder if some of the performance differences we're seeing are more deeply rooted. Now I do know there are things that are supposedly &lt;a href="http://www.downthemall.net/latest/no-google-chrome-support/"&gt;not possible&lt;/a&gt; with Chrome's extension support, and of course with greater functionality comes reduced performance. But I've lately been wondering if the differences are at the language level. Does the language each was written in greatly alter performance? Have a look at this graphic&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_z8scSW9cOxE/TAAEtDYr_ZI/AAAAAAAACbU/WukDImnBS6c/s1600/chrome_firefox_source.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://2.bp.blogspot.com/_z8scSW9cOxE/TAAEtDYr_ZI/AAAAAAAACbU/WukDImnBS6c/s400/chrome_firefox_source.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;Source: &lt;a href="http://www.ohloh.net/"&gt;Ohloh&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Just look at all that JavaScript! While some sources favor JavaScript as a "&lt;a href="http://www.thoughtworks.com/sites/www.thoughtworks.com/files/files/technology-radar-jan-2010.pdf"&gt;first-class language&lt;/a&gt;" (and maybe I'm misinterpreting their meaning here), I'm not convinced that makes sense for desktop applications. There are some advantages to having portions of Firefox be in a web language, it makes it easy for web developers to extend &amp;amp; theme. But I'm not sure it makes sense to use it as extensively as they appear to have done.&lt;br /&gt;&lt;br /&gt;For example, it would seem that the addon manager (nsExtensionManager.js) and session storage (sessionStore.js) are both JavaScript. How do I know these are their names? I didn't look at the code, but apparently I was putting Firefox under a bit too much pressure and I got the message saying these scripts had stopped responding (not at the same time). (Though this does happen less often with my portable Firefox, so maybe I need to clear out the profile).&lt;br /&gt;&lt;br /&gt;It will of course help when we have the content and the UI in separate processes, and maybe help some more when Firefox gets a faster JavaScript engine, but I wonder if you can ever get really good performance from a language like JavaScript. I'm not saying to write the thing in assembly, I'm just saying maybe it makes sense to write the lower level components in a lower level language. What do you think?&lt;br /&gt;&lt;br /&gt;As two somewhat unrelated sidenotes: What do you think the impact on Firefox's future will be with the loss of their &lt;a href="http://en.wikipedia.org/wiki/Ben_goodger"&gt;tech lead&lt;/a&gt;? And do you think Google will &lt;a href="http://www.zdnet.com/blog/btl/mozilla-still-too-dependent-on-google-for-revenue-can-it-diversify/27670"&gt;finance&lt;/a&gt; Mozilla now that they're in some competition with each other?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2861559007002709482?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2861559007002709482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/firefox-vs-wave-performance-language.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2861559007002709482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2861559007002709482'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/firefox-vs-wave-performance-language.html' title='Firefox vs Chrome Performance: A language difference?'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z8scSW9cOxE/TAAEtDYr_ZI/AAAAAAAACbU/WukDImnBS6c/s72-c/chrome_firefox_source.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3766314655115905386</id><published>2010-05-21T13:36:00.009-04:00</published><updated>2012-01-05T14:17:59.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>Syntax Highlighting in Blogger: Round 2</title><content type='html'>So I'm now able to use the popular &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;SyntaxHighlighter&lt;/a&gt; that most blogs use. I don't know what was stopping me &lt;a href="http://wittykeegan.blogspot.com/2009/10/code-in-blogger.html"&gt;before&lt;/a&gt;: maybe I've gone up in intelligence or they've fixed some bug. There's excellent instructions &lt;a href="http://www.cyberack.com/2007/07/adding-syntax-highlighter-to-blogger.html"&gt;here&lt;/a&gt;. I think I'm going to make the move to this, since it's easier to read, has more features, and is more standard that the&amp;nbsp;&lt;a href="http://code.google.com/p/google-code-prettify/"&gt;Prettify&lt;/a&gt; script I was using before. And one additional nice feature is I don't have to manually set my style="overflow:auto;", instead I just do&lt;br /&gt;&lt;pre class="brush:xml; wrap-lines:false"&gt;&amp;lt;pre class="brush:xml; wrap-lines:false"&amp;gt;&lt;/pre&gt;And there's no longer a need to do an onLoad in the body tag, and a Groovy &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes"&gt;brush&lt;/a&gt;!&lt;br /&gt;I've gone back to old posts and switched the styles, let me know if I've missed any.&lt;br /&gt;&lt;br /&gt;Edit: Actually I think maybe the reason was my own lack of attention. I think I forgot to add 'alexgorbatchev.com' to &lt;a href="http://noscript.net/"&gt;NoScript&lt;/a&gt;'s whitelist, and that's the host the scripts are currently hosted on, and it magically started working for me because I was in Chrome instead of Firefox. Doh! ... Doh? Who knows for sure?&lt;br /&gt;&lt;br /&gt;Edit: The instructions aren't really up to date anymore, as new brushes have been added. Here is an updated example (note this uses the default theme, but you can choose to use other &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/"&gt;themes&lt;/a&gt;):&lt;br /&gt;&lt;pre class="brush:html; wrap-lines:false"&gt;&lt;link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"&gt;&lt;/link&gt;&lt;br /&gt;&lt;link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"&gt;&lt;/link&gt;&lt;br /&gt;&lt;script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushColdFusion.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDelphi.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushDiff.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushErlang.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushGroovy.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJavaFX.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPowerShell.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushScala.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/&gt;&lt;br /&gt;&lt;script language='javascript'&gt;&lt;br /&gt;SyntaxHighlighter.config.bloggerMode = true;&lt;br /&gt;SyntaxHighlighter.config.clipboardSwf = &amp;#39;http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf&amp;#39;;&lt;br /&gt;SyntaxHighlighter.all();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;This still goes inside the header area of the template, which means you'll still need to manually edit the HTML.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3766314655115905386?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3766314655115905386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/syntax-highlighting-in-blogger-round-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3766314655115905386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3766314655115905386'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/syntax-highlighting-in-blogger-round-2.html' title='Syntax Highlighting in Blogger: Round 2'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-8220826608971213093</id><published>2010-05-21T00:46:00.000-04:00</published><updated>2010-05-21T00:46:59.651-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>OK Maven, You Win</title><content type='html'>So, I've tried every combination of dependencySets, fileSets, and copyDependencies I could think of, nothing I did seems to work. All I wanted was to have a runnable jar with its dependencies in unexploded jars (something I've done before when making a jar by hand, although I used the default package in that case, not sure if that makes a difference). When I failed in this, I tried to have a runnable jar with its dependencies exploded into a lib directory. I failed in this as well. The only thing that seems to work is to have everything exploded into the same level. I tried this briefly with the shade plugin, but have mostly been trying with the assembly plugin. I give up, Maven. You win.&lt;br /&gt;I've seen this mentioned fairly often on the web. If someone has a working example of a Groovy project compiled into a runnable uber-jar, I'd love to see it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-8220826608971213093?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/8220826608971213093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/ok-maven-you-win.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8220826608971213093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8220826608971213093'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/05/ok-maven-you-win.html' title='OK Maven, You Win'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4047773989447674926</id><published>2010-02-26T14:11:00.002-05:00</published><updated>2010-03-02T09:24:05.126-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><title type='text'>Workaround for JRA-19248: 401 on Jira Gadgets</title><content type='html'>Here is a workaround for &lt;a href="http://jira.atlassian.com/browse/JRA-19248"&gt;JRA-19248: Dashboard widgets fail with HTTP 401 malformed  security token, when left unattended for some time&lt;/a&gt;.  Set the 'Refresh Interval' on the gadgets to 1hr (or less).&amp;nbsp; It's worked for me so far.&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Edit: Well, it worked for several days, but apperently 1hr wasn't quite often enough. I'm trying with 30min, someone else reported having to use 15min. One more thing to note is that this issue is fixed with Jira 4.1.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4047773989447674926?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4047773989447674926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/02/workaround-for-jra-19248-401-on-jira.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4047773989447674926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4047773989447674926'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/02/workaround-for-jra-19248-401-on-jira.html' title='Workaround for JRA-19248: 401 on Jira Gadgets'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7837013914866684775</id><published>2010-02-09T20:37:00.001-05:00</published><updated>2010-02-09T20:54:40.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Windows Profile Woes</title><content type='html'>After struggling for months with folders magically changing ownership (first noticed when iTunes couldn't save podcasts) and messages saying the roaming profile did not synchronize completely, I believe I've found the problem. Apparently, Windows profiles &lt;a href="http://social.technet.microsoft.com/Forums/en-US/itprovistanetworking/thread/b59a587e-bb7f-4ed1-8e4c-7b9fa6056394"&gt;changed&lt;/a&gt; (though I don't understand how this affects me since although I did an upgrade install of Win7 from Vista, my machine never ran XP or earlier). The migration was failing because there wasn't enough hard drive space to copy all my music, documents, everything twice to do the migration. Though even once I resolved the issues preventing the sync (by moving to a temporary folder in C), it still didn't perform the sync. What I ended up having to do is create a new user, then copy everything over, take ownership, then delete the old user. This problem was also the cause of the mysterious S-{A bunch of meaningless numbers} user and the messages saying I wasn't the owner even though the username of the owner was my username. This was my user account's SID, which it apparently uses as part of the migration.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/_z8scSW9cOxE/S3IRw1GidCI/AAAAAAAACE8/8WNVreD1_Ds/s1600-h/roaming-problem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_z8scSW9cOxE/S3IRw1GidCI/AAAAAAAACE8/8WNVreD1_Ds/s320/roaming-problem.png" /&gt;&lt;/a&gt;&lt;/div&gt;I also learned that there is no Windows equivalent of Linux's &lt;a href="http://ss64.com/bash/usermod.html"&gt;usermod&lt;/a&gt; (let alone a GUI like Gnome and KDE have) when it comes to renaming accounts and their homes. My plan was to create a new account named Keegan2 then delete the original and rename the new to the old name after I was sure everything was moved over. While you can rename accounts in Windows, it doesn't change the profile path as part of the renaming. There is a &lt;a href="http://www.fixya.com/support/r463850-rename_or_move_user_profile_folder"&gt;registry hack&lt;/a&gt; that can be done, but this method gave me issues (all kinds of software installed for all users was still looking in the old place). When I tested this with XP, when I removed the renamed user it didn't remove the files. It would seem like it should be possible to run a script similar to the initialization Windows does the first time a user logs in before migrating to the new name.&amp;nbsp; This explains the laptop that was re-purposed a few times, but still had all the old usernames in 'Documents and Settings'.&lt;br /&gt;&lt;br /&gt;It's a Windows world, but I find the longer I live in it, the more I suffer. Vive Linux!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7837013914866684775?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7837013914866684775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/02/windows-profile-woes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7837013914866684775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7837013914866684775'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/02/windows-profile-woes.html' title='Windows Profile Woes'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z8scSW9cOxE/S3IRw1GidCI/AAAAAAAACE8/8WNVreD1_Ds/s72-c/roaming-problem.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4823949549930505853</id><published>2010-02-01T10:16:00.002-05:00</published><updated>2010-02-01T11:18:56.584-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Aero and LogMeIn</title><content type='html'>I've had the problem on Vista and Win7 of having Aero disabled after a remote LogMeIn session, even after changing themes to an aero theme and rebooting (the only thing that worked was uninstalling and reinstalling LogMeIn). After having no luck searching the LogMeIn &lt;a href="http://community.logmein.com/logmein/board/message?board.id=12&amp;amp;thread.id=17173&amp;amp;view=by_date_ascending&amp;amp;page=1"&gt;community forums&lt;/a&gt;, I finally stumbled across a &lt;a href="http://www.sevenforums.com/general-discussion/56028-lost-aero-after-logmein-login.html"&gt;tip&lt;/a&gt; from the folks at Windows 7 Forums:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Uncheck the 'Disable wallpaper and user interface effects on the host computer' in the LogMeIn preferences.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Uncheck the 'Use display accelerator' setting in LogMeIn preferences.&lt;/li&gt;&lt;li&gt;Disable the mirror display device in device manager.&lt;/li&gt;&lt;/ol&gt;That should do the trick! (Note that this will probably significantly reduce the responsiveness).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4823949549930505853?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4823949549930505853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/02/aero-and-logmein.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4823949549930505853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4823949549930505853'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/02/aero-and-logmein.html' title='Aero and LogMeIn'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2697948687752245178</id><published>2010-01-17T02:32:00.001-05:00</published><updated>2010-01-17T02:33:05.905-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><title type='text'>Prevent OpenDNS From Redirecting Google Searches – Fix for Firefox &amp; IE Address Bar</title><content type='html'>For those of us who enjoy the protection of OpenDNS, but don't want to use the OpenDNS guide, change the value of keyword.url in your about.config to &lt;a href="http://www.google.com/search?q="&gt;http://www.google.com/search?q=&lt;/a&gt;. Thanks to digital inspiration for the &lt;a href="http://www.labnol.org/software/browsers/prevent-opendns-google-redirects-firefox-address-bar-ie/2662/"&gt;tip&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2697948687752245178?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2697948687752245178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/prevent-opendns-from-redirecting-google.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2697948687752245178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2697948687752245178'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/prevent-opendns-from-redirecting-google.html' title='Prevent OpenDNS From Redirecting Google Searches – Fix for Firefox &amp; IE Address Bar'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2863616142239232000</id><published>2010-01-14T22:56:00.002-05:00</published><updated>2010-01-15T21:25:33.238-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><title type='text'>How to fix Pidgin issue connecting to AIM, ICQ – receiving ‘unexpected response’ - TechSpot Blog</title><content type='html'>I've been experiencing this issue with Pidgin 2.6.5, this seemed to do the trick.&lt;br /&gt;&lt;a href="http://www.techspot.com/blog/677/pidgin-aim-icq-unexpected-response-fix/"&gt;How to fix Pidgin issue connecting to AIM, ICQ – receiving ‘unexpected response’ - TechSpot Blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-- Edit --&lt;br /&gt;This must have been some problem on AOL's side. It no longer seems to be occurring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2863616142239232000?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2863616142239232000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/how-to-fix-pidgin-issue-connecting-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2863616142239232000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2863616142239232000'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/how-to-fix-pidgin-issue-connecting-to.html' title='How to fix Pidgin issue connecting to AIM, ICQ – receiving ‘unexpected response’ - TechSpot Blog'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4875687464024865760</id><published>2010-01-13T09:20:00.001-05:00</published><updated>2010-01-13T09:21:25.695-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><title type='text'>VirtualBox Tips</title><content type='html'>I've been experimenting a bit with Sun's&amp;nbsp;&lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;&amp;nbsp;over the last few days. For the most part, its been pretty smooth. I now use this instead of VMware. I thought I'd pass along a few snags I ran into to save someone else some trouble. When upgrading, uninstall the previous version first (they claim it can be installed over the old version, but its given me problems both times I've tried to upgrade that way). It won't delete your VMs. Also, for those running Vista/Win7, when installing, run the installer in administrator mode otherwise it seems to fail when trying to install the virtual network devices. I'm not sure why they don't have their installer set to require these permissions, and it doesn't seem to write a log either when it fails, making debugging difficult.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4875687464024865760?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4875687464024865760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/virtualbox-tips.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4875687464024865760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4875687464024865760'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/virtualbox-tips.html' title='VirtualBox Tips'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-8978096603355687410</id><published>2010-01-12T08:54:00.000-05:00</published><updated>2010-01-12T08:54:26.616-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><title type='text'>GoogleMonkeyR and SkipScreen Incompatibility</title><content type='html'>I'm a user of the &lt;a href="http://userscripts.org/scripts/show/9310"&gt;GoogleMonkeyR&lt;/a&gt; userscript, and for a few months I had been thinking that Google had changed something that caused the script to have the first result right-aligned instead of left-aligned. It turns out, the problem is actually because I'm also a user of &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/11243"&gt;SkipScreen&lt;/a&gt;. The problem lies in the 'search refinements' setting, it must be disabled for GoogleMonkeyR to work properly, either do this from the GUI SkipScreen options dialog, or change the value&amp;nbsp;extensions.skipscreen.searchrefinementsactive to false. Hopefully, this saves someone else some confusion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-8978096603355687410?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/8978096603355687410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/googlemonkeyr-and-skipscreen.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8978096603355687410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8978096603355687410'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/googlemonkeyr-and-skipscreen.html' title='GoogleMonkeyR and SkipScreen Incompatibility'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5936549678588706874</id><published>2010-01-11T15:20:00.002-05:00</published><updated>2010-01-13T08:40:50.472-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>More Groovy Bugs</title><content type='html'>While trying to add some sorting to my &lt;a href="http://code.google.com/p/validateme/"&gt;ValidateMe&lt;/a&gt; script, I discovered a Groovy &lt;a href="http://jira.codehaus.org/browse/GROOVY-3979"&gt;bug&lt;/a&gt; that someone else reported on Thursday. It appears that although inner classes are supposed to be supported in the new Groovy 1.7, calling methods on enums inside a class do not. I've also created another &lt;a href="http://jira.codehaus.org/browse/GROOVY-3992"&gt;suggestion&lt;/a&gt; for a reverse() method on Maps. I did add the changes I wanted to ValidateMe without these Jiras being addressed. What I did for the reverse was do something like&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow: auto;"&gt;theMap.reverse{it.value}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5936549678588706874?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5936549678588706874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/more-groovy-bugs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5936549678588706874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5936549678588706874'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2010/01/more-groovy-bugs.html' title='More Groovy Bugs'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2533181698662851926</id><published>2009-12-30T14:45:00.003-05:00</published><updated>2009-12-30T15:02:38.443-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>A Couple Of GroovyConsole Jiras</title><content type='html'>I find myself relying more and more on the GroovyConsole for testing out Java and Groovy stuff (especially regular expressions and xml processing), for writing scripts it basically &lt;i&gt;&lt;u&gt;is&lt;/u&gt;&lt;/i&gt; my IDE. There's a few irritations for which I opened a couple of Jiras for today, as I didn't see comments on them. All pretty minor, the first two deal with the open/save dialogs, the third deals with process management and output. We'll see what happens. If they're open to the changes, but don't have the time, a couple might be something even I could do. Anyway, here they are:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jira.codehaus.org/browse/GROOVY-3961"&gt;http://jira.codehaus.org/browse/GROOVY-3961&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jira.codehaus.org/browse/GROOVY-3962"&gt;http://jira.codehaus.org/browse/GROOVY-3962&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jira.codehaus.org/browse/GROOVY-3963"&gt;http://jira.codehaus.org/browse/GROOVY-3963&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2533181698662851926?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2533181698662851926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/couple-of-groovyconsole-jiras.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2533181698662851926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2533181698662851926'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/couple-of-groovyconsole-jiras.html' title='A Couple Of GroovyConsole Jiras'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-364638082185851804</id><published>2009-12-21T13:32:00.001-05:00</published><updated>2009-12-21T13:34:29.351-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Gettin' Groovy with xml validation</title><content type='html'>So, I wanted to be able to tell learn some things about the validity of a particular xml document I was working with a few days ago. If you use something like XMLSpy or the xml plugin for Notepad++, they will display only the first validation error. So, I wrote a Groovy script to let me control the amount of errors reported, and collect some statistics about the document. I call it ValidateMe. And now, I'm sharing it with you. You can get the script off its Google Code &lt;a href="http://code.google.com/p/validateme/"&gt;page&lt;/a&gt;. As usual, it's MIT licensed, so you can do pretty much whatever you want with it. It's usage is described by running 'groovy validateMe.groovy help'. It's pretty straightforward, about 130 lines or so, but I think it's pretty slick.&lt;br /&gt;&lt;br /&gt;As a result of doing this, I also learned that you can have multiple classes in the same .groovy script file, as long as the class with the main method is first.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-364638082185851804?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/364638082185851804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/gettin-groovy-with-xml-validation.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/364638082185851804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/364638082185851804'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/gettin-groovy-with-xml-validation.html' title='Gettin&apos; Groovy with xml validation'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1190469070316549895</id><published>2009-12-16T13:23:00.007-05:00</published><updated>2010-05-21T13:49:20.292-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Launching a GroovyConsole Without a cmd window</title><content type='html'>I run Groovy 1.7 from the .zip files (which doesn't yet have the &lt;a href="http://groovy.codehaus.org/Native+Launcher"&gt;native launchers&lt;/a&gt; built for it), and I love the line numbering, and many other things about it. The one thing that was irritating is that a new cmd window would have to be opened every time I launched the groovyConsole.bat. I now have a workaround. Create a new .vbs file in the bin folder of your groovy with the following contents:&lt;br /&gt;&lt;pre class="brush:vb; wrap-lines:false"&gt;Set WshShell = WScript.CreateObject("WScript.Shell")&lt;br /&gt;obj = WshShell.Run("groovyconsole.bat", 0)&lt;br /&gt;set WshShell = Nothing&lt;br /&gt;&lt;/pre&gt;You can then put a shortcut to this wherever, and even make it pretty by setting the icon to &lt;a href="http://svn.codehaus.org/groovy/trunk/groovy/modules/native_launcher/source/icons/groovy.ico"&gt;this&lt;/a&gt;. Oh, and make sure you have your GROOVY_HOME &lt;a href="http://wittykeegan.blogspot.com/2009/12/using-groovyconsole-from-zip-file.html"&gt;set up&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Actually, this can be used to run any batch script in the background, as long as you don't need to be able to let the user pass in arguments. My thanks to Koushik Biswas from Yahoo Answers for the &lt;a href="http://answers.yahoo.com/question/index?qid=20071011212557AAofTy6"&gt;tip&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1190469070316549895?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1190469070316549895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/launching-groovyconsole-without-cmd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1190469070316549895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1190469070316549895'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/launching-groovyconsole-without-cmd.html' title='Launching a GroovyConsole Without a cmd window'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1190813912439094142</id><published>2009-12-11T11:05:00.009-05:00</published><updated>2010-05-21T13:49:58.963-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Which Child Am I?</title><content type='html'>I don't know if this is worth blogging home about, but I've needed this solution a couple times, and I found myself referencing this blog entry draft, so I'll put it out there and maybe someone else will find it useful. The problem is I have an xml node, and I want to know the order it is (as an index integer) in relation to its siblings. You may have to modify this of course, if the children you are comparing are deeper down than 1.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;def CAR_RECORDS = '''&lt;br /&gt;&amp;lt;records&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;car name='HSV Maloo' make='Holden' year='2006'&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;country&amp;gt;Australia&amp;lt;/country&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;record type='speed'&amp;gt;Production Pickup Truck with speed of 271kph&amp;lt;/record&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/car&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;car name='P50' make='Peel' year='1962'&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;country&amp;gt;Isle of Man&amp;lt;/country&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;record type='size'&amp;gt;Smallest Street-Legal Car at 99cm wide and 59 kg in weight&amp;lt;/record&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/car&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;car name='Royale' make='Bugatti' year='1931'&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;country&amp;gt;France&amp;lt;/country&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;record type='price'&amp;gt;Most Valuable Car at $15 million&amp;lt;/record&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/car&amp;gt;&lt;br /&gt;&amp;lt;/records&amp;gt;'''&lt;br /&gt;&lt;br /&gt;def records = new XmlSlurper().parseText(CAR_RECORDS)&lt;br /&gt;def record = records.car[2].country&lt;br /&gt;&lt;br /&gt;int index = 0&lt;br /&gt;Boolean found = false&lt;br /&gt;record.parent().parent().children().each {&lt;br /&gt;  if (it == record.parent()) {&lt;br /&gt;    found = true&lt;br /&gt;  } else if (!found) {&lt;br /&gt;    index++&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;assert index == 3&lt;br /&gt;return index&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1190813912439094142?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1190813912439094142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/which-child-am-i.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1190813912439094142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1190813912439094142'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/which-child-am-i.html' title='Which Child Am I?'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6369836168892726209</id><published>2009-12-07T13:05:00.007-05:00</published><updated>2010-05-21T13:51:37.096-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Using Groovy from the .zip file</title><content type='html'>I had always had trouble launching groovysh or groovyConsole from the .zip releases of groovy, and always waited until they released the installer for Windows, never knowing why. There is a simple fix, but one that didn't occur to me right away. The cause is that the GROOVY_HOME variable needs set before startGroovy.bat tries to add it to the classpath, so just add&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:shell; wrap-lines:false"&gt;set GROOVY_HOME=..\&lt;/pre&gt;to startGroovy.bat (anywhere before the classpath gets set), and let the good times roll...&lt;br /&gt;This also, of course, overrides whatever you have set as system or user variables, so you can safely play with other versions from the .zips without needing to change anything (or needing admin rights).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6369836168892726209?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6369836168892726209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/using-groovyconsole-from-zip-file.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6369836168892726209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6369836168892726209'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/using-groovyconsole-from-zip-file.html' title='Using Groovy from the .zip file'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4150785298669799463</id><published>2009-12-04T13:24:00.002-05:00</published><updated>2009-12-04T13:31:21.637-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>My First DMCA Notice</title><content type='html'>I got a little popup in Blogger today, letting me know that they had moved one of my posts on &lt;a href="http://wittyreads.blogspot.com/"&gt;WittyReads&lt;/a&gt;&amp;nbsp;(where I reblog things) has been moved to draft status because of a DMCA takedown notice they (Google) got. The post in question was a reblog of an entry from &lt;a href="http://www.fluxblog.org/"&gt;Fluxblog&lt;/a&gt;&amp;nbsp;on one of Julian Casablanca's songs. (Will I get sued for posting a link to a link to a link of an mp3?) Needless to say, I'm kinda pissed about this. What I did was reblog a post of a blog that allegedly has the blessings of the various related copyright lawyers. I didn't myself host the mp3 nor provide details on how it could be obtained through unauthorized channels. My reblogging it helps get the word out about the album, potentially driving up their sales (the original post even has a link to the amazon page to purchase the album). I'm going to leave it down for now, but I feel as long as that fluxblog post is legal than what I did is perfectly in my rights and after doing some more research I may just put it right back up (provided Google doesn't ban me to protect themselves from possible lawsuits). I think the little javascript popup said something about an email being sent about this yesterday, which I haven't yet&amp;nbsp;received, though I should, a little popup hardly qualifies as notice, it should be on&amp;nbsp;permanent&amp;nbsp;record through a system that isn't as prone to glitches as javascript. In &amp;nbsp;the mean time...Guess who's album I &lt;i&gt;won't&lt;/i&gt;&amp;nbsp;be buying? (though in this case I'm not sure I would buy it anyway, since some of the money &lt;a href="http://www.riaaradar.com/search.asp?searchtype=Keywords&amp;amp;keyword=B002KD0ORY"&gt;supports&lt;/a&gt; the professional bullies at the RIAA) I&amp;nbsp;congratulate&amp;nbsp;Julian's legal team. You've demonstrated a sophisticated understanding of the Internet and blogging, forward-thinking, and strength of character. Outstanding work.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://randazza.files.wordpress.com/2009/02/middle-finger.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://randazza.files.wordpress.com/2009/02/middle-finger.jpg" width="197" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4150785298669799463?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4150785298669799463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/my-first-dmca-notice.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4150785298669799463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4150785298669799463'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/my-first-dmca-notice.html' title='My First DMCA Notice'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1610326397014737691</id><published>2009-12-03T10:02:00.001-05:00</published><updated>2009-12-09T08:07:42.679-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>My Second Wave Bot</title><content type='html'>Inspired by &lt;a href="http://code.google.com/p/raffly/source/browse/#svn/trunk/sandbox/python/pirate-bot"&gt;Piratify&lt;/a&gt;,&amp;nbsp;I decided to make a bot that makes everyone talk like Yoda (Yodaspeak as I call it). The bot lives at &lt;a href="http://yodaspeakify.appspot.com/"&gt;yodaspeakify.appspot.com&lt;/a&gt;, and can be added by adding yodaspeak@appspot.com to your wave. The sourcecode is available &lt;a href="http://code.google.com/p/yodaspeakify/"&gt;here&lt;/a&gt;. It works, but needs more work to improve its results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1610326397014737691?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1610326397014737691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/my-second-wave-bot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1610326397014737691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1610326397014737691'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/12/my-second-wave-bot.html' title='My Second Wave Bot'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6806374223189688559</id><published>2009-11-23T13:30:00.003-05:00</published><updated>2009-11-23T14:30:47.345-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>My First Wave Bot</title><content type='html'>I finally got my &lt;a href="http://wave.google.com/"&gt;Wave&lt;/a&gt; invite, and I immediately got interested in coding with it. I recently finished creating a bot for it that allows you to search &lt;a href="http://www.worldcat.org/"&gt;WorldCat&lt;/a&gt; from inside Wave. The main servlet is in Groovy, the profile is in Java. Their &lt;a href="http://code.google.com/apis/wave/guide.html"&gt;tutorial&lt;/a&gt; pretty much works, though one of the methods was renamed: &lt;br /&gt;&lt;i&gt;getRobotProfileUrl()&lt;/i&gt; should be called &lt;i&gt;getRobotProfilePageUrl()&lt;/i&gt; (there's a &lt;a href="http://code.google.com/p/google-wave-resources/issues/detail?id=435"&gt;request&lt;/a&gt; filed to fix this). Google's &lt;a href="http://code.google.com/eclipse/"&gt;plugin&lt;/a&gt; for Eclipse also works very well. JetBrains also has a &lt;a href="http://plugins.intellij.net/plugin/?id=4254"&gt;plugin&lt;/a&gt; for IDEA, though I didn't test this. In their &lt;a href="http://blog.springsource.com/2009/04/07/write-your-google-app-engine-applications-in-groovy/"&gt;sample project&lt;/a&gt; SpringSource has a build script that uses AntBuilder, which I modified to use the folder structure that was already created by the Eclipse plugin. I successfully built with this and deployed the app using appcfg.cmd from the SDK. I used straight html for the bot's profile page, but in their sample SpringSource shows how you could use the MarkupBuilder in groovlets.&lt;br /&gt;&lt;br /&gt;Anyway, the app is deployed on the Google App Engine &lt;a href="http://worldcat-bot.appspot.com/"&gt;here&lt;/a&gt;, it's homepage (where the sourcecode is also available) is &lt;a href="http://code.google.com/p/worldcat-bot/"&gt;here&lt;/a&gt;. You can add it to your waves by adding &lt;i&gt;worldcat-bot@appspot.com&lt;/i&gt;. For even more bots, check out the &lt;a href="http://googlewavebots.info/wiki/index.php?title=Main_Page"&gt;list&lt;/a&gt;. Mine's listed &lt;a href="http://googlewavebots.info/wiki/index.php?title=WorldCat-Bot"&gt;too&lt;/a&gt;. There is &lt;a href="http://wavegadgets.com/"&gt;another list&lt;/a&gt; out there, but it doesn't seem used as much.&lt;br /&gt;&lt;br /&gt;Some gotchas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You cannot test robots without deploying them to the Google &lt;a href="http://code.google.com/appengine/"&gt;App Engine&lt;/a&gt;, this makes you waste some of the number of deployments you have on the free account (currently you get 1000).&lt;/li&gt;&lt;li&gt;Wave caches its bots, so you have to change the version in appengine-web.xml (I don't think you have to change the version in capabilities.xml too unless the capabilities have also changed, but I've been changing both to match). They tell you this, but you have to be careful because even though you may have deleted the old version if you reuse a version descriptor text Wave may still try to call the old version and you will get a ServletUnavailable exception and waste another deployment. You have to wait for the re-caching to occur.&lt;/li&gt;&lt;li&gt;If you are using Groovy, you have to upload the groovy-all jar in the war/WEB-INF/lib directory (the war folder can be a different name, but that is the convention used by the Eclipse plugin).&lt;/li&gt;&lt;/ol&gt;For those who haven't heard about Wave, it's basically a kind of collaborative IM (I once jokingly described it as an MMIM - Massively Multiperson Instant Messaging). But it isn't quite accurate to describe it as a kind of IM. The text is live, you can see it as the person is typing it, but whether its treated as an IM or more like an email is fluid. It depends only on if other people are there at the same time. So, it can be viewed as a kind of mashup between email, IM, and collaborative documents and is more concurrent than traditional email. LifeHacker has some &lt;a href="http://lifehacker.com/5381219/google-waves-best-use-cases"&gt;use cases&lt;/a&gt;, which make for good propaganda.&lt;br /&gt;Anyone in the conversation (called a Wave) can edit any of the messages (blips). Side conversations can occur in the same stream, these side conversations are called wavelets. APIs exist to have bots in a conversation that automate tasks (such as links for searches, posting the conversation to a blog, bringing in text from a feed, or converting everyone's text to pirate talk) and for gadgets that let you put different kinds content inside the conversation, such as documents, polls, etc.&amp;nbsp;Google plans to open source most of Wave once it's finished, allowing other 'federated' servers to become Wave providers, and they plan to make the protocol they use the predominant protocol on the internet. The &lt;a href="http://www.waveprotocol.org/"&gt;Google Wave Federation Protocol&lt;/a&gt;&amp;nbsp;is itself built off &lt;a href="http://xmpp.org/"&gt;XMPP&lt;/a&gt; (the same protocol Jabber and GoogleTalk use).&amp;nbsp;They have bindings for Python and Java currently (I've heard the Python API is not as polished as the Java one, but I don't know that for sure and I'm sure it will improve), and will probably be adding more languages in the future to support their goal of making their protocol #1.&amp;nbsp;Wikipedia has a pretty good &lt;a href="http://en.wikipedia.org/wiki/Google_Wave"&gt;article&lt;/a&gt; on Wave as well.&lt;br /&gt;&lt;br /&gt;I still have Wave invites left for my friends, if you're interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6806374223189688559?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6806374223189688559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/my-first-wave-bot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6806374223189688559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6806374223189688559'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/my-first-wave-bot.html' title='My First Wave Bot'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5524714432537739325</id><published>2009-11-18T10:32:00.001-05:00</published><updated>2009-11-19T10:15:08.860-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>MySQL and Oracle</title><content type='html'>I've recently reversed my position on the EU's opinion on the Sun/Oracle merger. I had always taken the position of Oracle's CEO which was that since MySQL is open source, it can never really be killed. While this is true, when something like that loses its corporate backing it can languish if someone doesn't step in, making it effectively dead. Now I don't know what the ideal situation would be, but one must question the motives of a company that allows themselves really to lose money, as Sun's stock continues to drop well below the price Oracle will be paying. Why are they so insistent in keeping MySQL if they have no plans to quash it? Why don't they save themselves some money and grief and just give up MySQL? I still don't understand why quashing it is in their interest anyway, as many projects using MySQL wouldn't consider Oracle as a solution because of cost and probably would turn to another open source alternative if MySQL weren't an option. I don't think Oracle will see a dramatic fiscal difference after they destroy MySQL, but it certainly seems to be their goal. While their motivation may be that they are hoping to move some of MySQL's&amp;nbsp;customer-base&amp;nbsp;(particularly the enterprise ones) over to their products, their long-term interest in maintaining MySQL is&amp;nbsp;questionable&amp;nbsp;at best and it will be the smaller businesses (non-enterprise users) that will pay the price.&lt;br /&gt;&lt;br /&gt;I had always thought IBM would have been an ideal buyer, but it recently occurred to me: why didn't Google buy Sun? They already use Java for many of their internal stuff, and they're steadily becoming a bigger player in enterprise with their apps and search solutions. The would be acquiring SPARC, which I'm not sure would be very useful but I could see Google building off Java, JavaFX, Glassfish, NetBeans, MySQL,VirtualBox, and maybe even OpenOffice. Heck, they might have even worked on the red haired stepchild of Java: JavaME. We all know they have the money, and with their strong support of open source it actually wouldn't have been a bad match. EU probably wouldn't have an issue with it either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5524714432537739325?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5524714432537739325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/mysql-and-oracle.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5524714432537739325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5524714432537739325'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/mysql-and-oracle.html' title='MySQL and Oracle'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5672798368492115210</id><published>2009-11-11T16:22:00.001-05:00</published><updated>2009-11-11T16:25:20.213-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='computer science'/><title type='text'>Functional Programming</title><content type='html'>I know this is old news, but it's new to me. I've been thinking about an &lt;a href="http://www.paulgraham.com/icad.html"&gt;article&lt;/a&gt; by Paul Graham which is basically about how functional languages are superior to OOP and other imperative languages, and languages are shifting towards functional programming in general, and LISP in particular. I disagree on both counts. Ignoring the fact that whether its right or not, OOP isn't going away any time soon, I think that there are certainly problems that are better suited to that paradigm, but there are many problems that are not. This is a good part of the reason that we see more multi-paradigm languages that pure languages.&lt;br /&gt;&lt;br /&gt;I specifically object to the example he chose to demonstrate the 'power' of Lisp. He chooses a problem that Lisp and similar languages are naturally going to win. He wants to return a method that is an incrementer as the result. Its going to be ugly in any language where methods are not first class objects.&lt;br /&gt;&lt;br /&gt;He also claims that design patterns exist to make up for shortcomings in a language. There is a related &lt;a href="http://stackoverflow.com/questions/327955/does-functional-programming-replace-gof-design-patterns"&gt;question&lt;/a&gt; on StackOverflow. The study referenced there states that 7 of the 23 patterns in the GoF still applied in functional languages. Even Lisp is not a purely functional language and needs what can be regarded as a design pattern (&lt;a href="http://en.wikipedia.org/wiki/Monads_in_functional_programming"&gt;Monad&lt;/a&gt;) to allow for something stateful (like IO). (When was the last time you wrote a program that didn't use some kind of IO?).&lt;br /&gt;&lt;br /&gt;Languages are not becoming more and more like Lisp, though many of them did borrow some concepts from Lisp. One of the main reasons for this is that Lisp was one of the first high level languages (even before C). Yes, things like garbage collection, dynamic typing, and recursion were initially eschewed by the programming community only to be later made mainstream. This is for reasons of computing power rather than a sudden realization that Lisp had it right all along. Paul Prescod &lt;a href="http://www.prescod.net/python/IsPythonLisp.html"&gt;talks&lt;/a&gt; about how Python isn't moving towards Lisp and how many former Lispers have adopted Python. I think Paul's statements stem from having sour grapes over the lack of success of his pet language more than historical fact.&lt;br /&gt;&lt;br /&gt;That being said, Java certainly isn't perfect and has been constrained by Sun's unwillingness to break compatibility to add new features. Wouldn't it be better to say languages like Java could benefit from some additional Lisp-like options, such as lamda (available as closures in groovy) and first class methods (available in Scala) rather than immature statements like Lisp &amp;gt;&amp;gt; Java? While I agree that there might be a place for a language that keeps things simple to help curb mistakes, I would rather see greater flexibility and choice given to empower the programmer, allowing for whatever style best suites the problem at hand. Some problems lend themselves to functional programming, and some problems are stateful in their very nature. I find OOP easier to think in, because we fairly naturally think of things as interactions of systems. Though, this is perhaps overused currently in our industry for problems it shouldn't be used to tackle.&lt;br /&gt;For this reason, I would like to study and work with functional languages more than I currently am to recognize and take advantage of those situations in which functional languages are the right choice (assuming the decision is up to me).&lt;br /&gt;&lt;br /&gt;On a related note, the &lt;a href="http://shootout.alioth.debian.org/"&gt;Computer Language Benchmarks Game&lt;/a&gt; is also good fun, for those who find religious wars amusing. &lt;a href="http://99-bottles-of-beer.net/"&gt;99 bottles of beer&lt;/a&gt; is also an interesting reference. It is programs that print the lyrics to the song 99 bottles of beer, in many languages. (check out an Erlang &lt;a href="http://99-bottles-of-beer.net/language-erlang-1482.html"&gt;version&lt;/a&gt;, Lisp &lt;a href="http://99-bottles-of-beer.net/language-lisp-361.html"&gt;version&lt;/a&gt;, and a Java &lt;a href="http://99-bottles-of-beer.net/language-java-4.html"&gt;version&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Related links&lt;br /&gt;&lt;a href="http://norvig.com/design-patterns/"&gt;http://norvig.com/design-patterns/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.norvig.com/lisp_talk_final.htm"&gt;http://www.norvig.com/lisp_talk_final.htm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.norvig.com/python-lisp.html"&gt;http://www.norvig.com/python-lisp.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.paulgraham.com/power.html"&gt;http://www.paulgraham.com/power.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Something unrelated, but funny&lt;br /&gt;&lt;a href="http://www.willamette.edu/%7Efruehr/haskell/evolution.html"&gt;http://www.willamette.edu/~fruehr/haskell/evolution.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5672798368492115210?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5672798368492115210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/functional-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5672798368492115210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5672798368492115210'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/functional-programming.html' title='Functional Programming'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2365459940470012668</id><published>2009-11-11T08:12:00.004-05:00</published><updated>2010-05-21T13:53:26.336-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy - Sometimes you still need a semicolon</title><content type='html'>I Was ploughing through my overly-large blogroll the other night when this article caught my eye.&lt;br /&gt;&lt;a href="http://groovy.dzone.com/articles/groovy-sometimes-you-still"&gt;http://groovy.dzone.com/articles/groovy-sometimes-you-still&lt;/a&gt;&lt;br /&gt;I gave it a read, because I wanted to know all the cases where you had to have a semicolon.&lt;br /&gt;&lt;br /&gt;He gives two examples, the first of which he’s wrong about, it works fine in 1.6.5 and I believe it works for anything &amp;gt;= 1.6.&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;def list = [1,2,3] as List&amp;lt;Integer&amp;gt;&lt;br /&gt;println list&lt;/pre&gt;&lt;br /&gt;This second one (not the exact same example he used) does need a semicolon&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;{-&amp;gt; assert true == true }()&lt;br /&gt;{-&amp;gt; assert false == false }()&lt;/pre&gt;&lt;br /&gt;Should be&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;{-&amp;gt; assert true == true }();&lt;br /&gt;{-&amp;gt; assert false == false }()&lt;/pre&gt;&lt;br /&gt;This is only the case if you have two closure calls next to each other with nothing in between.&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;{-&amp;gt; assert true == true }()&lt;br /&gt;println ""&lt;br /&gt;{-&amp;gt; assert false == false }()&lt;/pre&gt;works fine.&lt;br /&gt;&lt;br /&gt;Are there other times when you need a semicolon at the end of the line (assuming only one statement per line)?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2365459940470012668?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2365459940470012668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/groovy-sometimes-you-still-need.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2365459940470012668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2365459940470012668'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/groovy-sometimes-you-still-need.html' title='Groovy - Sometimes you still need a semicolon'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2455059942031726759</id><published>2009-11-06T11:51:00.009-05:00</published><updated>2010-05-21T13:57:57.849-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy 1.7 Beta 2 Available</title><content type='html'>It’s a bit of old news, but I don’t remember seeing anything about it until today.&lt;br /&gt;It was available 12 Oct, and Windows installer binaries were available 18 Oct. Get yours&lt;a href="http://groovy.codehaus.org/Download"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A draft of the current features is available at http://docs.codehaus.org/display/GROOVY/(draft)+Groovy+1.7+release.&amp;nbsp; This release is mostly bug fixes, with two notable improvements.&amp;nbsp; They have added the ability to alter the meaning of Groovy Truth.&amp;nbsp; This lets you add some truth to your own class by adding the asBoolean method:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;class Foo {&lt;br /&gt;  String value&lt;br /&gt;  boolean asBoolean() { value == "something true" }&lt;br /&gt;}&lt;br /&gt;assert new Foo(value: "something true")&lt;br /&gt;assert !new Foo(value: "teh cake is a lie")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And of course, using ExpandoMetaClass, you can alter the behavior for Groovy classes that already have a Groovy Truth defined:&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;Integer.metaClass.asBoolean { int value -&amp;gt;&lt;br /&gt;  return value &amp;gt; 0&lt;br /&gt;}&lt;br /&gt;Integer foo = 7&lt;br /&gt;assert foo.asBoolean()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;They’ve also added stylish outputs for assertion failures (I guess taken from the Spock testing framework):&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;int foo = 0&lt;br /&gt;int bar = 1&lt;br /&gt;assert foo == bar&lt;br /&gt;&lt;/pre&gt;will display:&lt;pre&gt;Assertion failed:&lt;br /&gt;assert foo == bar&lt;br /&gt;       |   |  |&lt;br /&gt;       0   |  1&lt;br /&gt;         false&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2455059942031726759?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2455059942031726759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/groovy-17-beta-2-available.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2455059942031726759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2455059942031726759'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/11/groovy-17-beta-2-available.html' title='Groovy 1.7 Beta 2 Available'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2581510723715091084</id><published>2009-10-31T21:13:00.004-04:00</published><updated>2009-12-09T08:08:12.594-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>AHCI in Windows</title><content type='html'>A recent discovery I made because of my mobo's odd controller:&lt;br /&gt;While its true that AHCI works out of the box with Vista/Windows 7 (that is, there is no need for third party drivers) -- If you did not have it enabled when you first install Windows, it will be disabled to save some boot time. Makes sense. What's odd is what you have to do to enable it. You have to change HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\msahci\Start from 0x3 to 0x0. Otherwise, you get a blue screen when you try to boot. The fancy startup repair that comes with Vista/Windows 7 will be launched the next boot (if you let it), but won't be able to figure this out for you.&lt;br /&gt;&lt;br /&gt;So yea, I tried moving the cables around on the inside (thinking it might be a bad sata port), and changed to AHCI, and my cd drive was still the one that disappeared, not the drive in that port.&amp;nbsp; I thought it might be some incompatibility with the firmware, but the updater fails to run. :'( I suppose it's also possible it's a bad cable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2581510723715091084?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2581510723715091084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/ahci-in-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2581510723715091084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2581510723715091084'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/ahci-in-windows.html' title='AHCI in Windows'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1063720822859351088</id><published>2009-10-27T07:48:00.000-04:00</published><updated>2009-10-27T07:48:43.238-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='me'/><title type='text'>I'm Dying</title><content type='html'>I was digging through old journal entries I've made in .txt files buried in my hard drive (most of which I'm sure I'll have to apply an electromagnet to in the event of my death) and happened across this piece that is probably about as close to poetry as my pathetic writing skills will ever achieve. This one wasn't so much poetry as much as me trying to capture how I felt in a dream I had at about 3AM a few years back.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;I'm Dying&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;You feel the life slowly leaving your body&lt;br /&gt;panic grips you, as your clammy skin perspires slightly&lt;br /&gt;in your head, you can hear yourself screaming, "I'm dying!", but your lips make no sound&lt;br /&gt;the wait is unbearable, its like slowly bleeding to death&lt;br /&gt;you can almost feel the life running off your fingertips, like blood&lt;br /&gt;your eyes grow dim, unable to bring your surroundings in focus&lt;br /&gt;things look darker, as though the color itself were being drained from your world&lt;br /&gt;you feel a chill shiver, and a sudden sense of aloneness&lt;br /&gt;you want to reach out for something, but your body betrays you&lt;br /&gt;you feel the moment drawing nearer, as a dread shadow in the night&lt;br /&gt;your chest feels as though a weight were upon it, your eyes see almost nothing now&lt;br /&gt;voices in your ears, calling your name seem ironically unimportant as they slowly fade away&lt;br /&gt;you see only darkness, and hear only silence as a great void seems to devour you&lt;br /&gt;you feel the thick, inky darkness penetrate you, you become unsure of where the darkness ends and you begin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1063720822859351088?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1063720822859351088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/im-dying.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1063720822859351088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1063720822859351088'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/im-dying.html' title='I&apos;m Dying'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7352393174314046082</id><published>2009-10-22T23:42:00.000-04:00</published><updated>2009-10-22T23:42:36.568-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='religion'/><title type='text'>Woman is the Mother of Human Race</title><content type='html'>I don't say I agree with everything in this story, but it does sound pretty. This is taken from Dastur Dr. M.N. Dhalla's Homage Unto Ahura Mazda at &lt;a href="http://www.zarathushtra.com/z/article/dhalla/"&gt;http://www.zarathushtra.com/z/article/dhalla/&lt;/a&gt;. Zoroastrianism predates Christianity by over 1000 years, but later writings were greatly influenced by Christianity's writings. You'll therefore notice some definite similarities. Though perhaps a fanciful notion, I've found the account much preferable than the version of the story we're taught in Christianity. This respect for women, I've found unparalleled for the time (~1700BCE). Though certainly values and gender roles have changed a bit since then (I'm not sure yet whether its for the better or for the worst). I also find the notion of no original sin greatly appealing. I think most Christians don't completely accept. (It's kind of a new doctrine anyway, initially put forth by Paul if stories are to be believed, but not popularized until about 200CE by &lt;a href="http://en.wikipedia.org/wiki/Irenaeus" title="Irenaeus"&gt;Irenaeus&lt;/a&gt; to combat Gnosticism).&lt;br /&gt;A note on terms: Ahura Mazda means wise lord, it is the Zoroastrian term for God. The Amesha Spentas can be roughly thought of as angels, that's more or less what they were understood as by the time this was written. In any event, try to see past the semantic differences and realize the relationship they are describing. I wish I was this positive about life and relationships.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="color: maroon;"&gt;&lt;i&gt;&lt;b&gt;&lt;big&gt;&lt;big&gt;Woman is the mother of human race&lt;/big&gt;&lt;/big&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Seated under the Tree of Life all alone, was Mashya, the First Man. Morose and moody and melancholy was he. Oppressive and killing was his solitude in this strange, new world. He dreaded life. He cursed his existence. Then did Spenta Mainyu, Ahura Mazda's superb Fashioner of mortal clay, take compassion on him and made Mashyani, the First Woman. Mashya took Mashyani as his wife. With his life-mate Mashya set up his first human household upon earth.&lt;br /&gt;When Spenta Mainyu made man, he was acclaimed in the heavenly world as a good architect. When, with softer and finer clay and with unprecedented craftsmanship he made woman, he was hailed by all as the best and matchless Moulder of all time. Woman is the marvel of creation. Unrivalled and unequalled in form and beauty is she in this wide world of the seven zones. She is the blooming flower in the garden of life that breathes perfume all around.&lt;br /&gt;Woman is the teacher of gentility to man. She helps man to grow in moral height. She is the sustaining power of the life of man. Much has she that man has not. Man is not man until woman breathes manhood in him. She is the life of man. She has genius to love and she loves more intensely and more faithfully than man. In the virtues of the heart, she excels man. She is more patient and enduring than man. She suffers silently and hides her grief in her bosom and smothers her tears. She comforts and she soothes. She dispels the darkness of the depressed spirits around her. Wilderness would this world be without woman. There is freshness and there is sweetness, where woman steps in. When life becomes a-weary, woman makes it a-cheery.&lt;br /&gt;Man delights to lay at the feet of woman all that he wins from the world. The fanatic iconoclast turns docile idol-worshipper, when he approaches woman, the eternal idol of humanity in flesh.&lt;br /&gt;Life becomes livable for man, for woman shares it. Woman is the helpmate of man. She is not his drudge or chattel. Woman, again, is not man in the making. She has not to ape man and grow mannish. Woman is woman and always and ever woman. Wifehood and motherhood are her most sacred functions. As a prudent wife and a loving mother, she forgets her own self for the tender love of her dear ones and trains her children to virtue.&lt;br /&gt;Gentle and tender and delicate is womanly virtue. The slightest waft of vicious wind soils and withers it. Chastity is woman's priceless wealth. Purer than pearl and brighter than diamond is Asha Vanghuhi's chaste woman. Give us, Ahura Mazda, woman as chaste as Hvovi, as loving as Rodabeh, as devoted as Tehmina, as virtuous as Firangiz, as faithful as Manijeh, as pure as Pouruchisti and as brave as Gurdafrid.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;span style="color: maroon;"&gt;&lt;em&gt;&lt;strong&gt;&lt;big&gt;&lt;big&gt;Children are nearer heaven than we are&lt;/big&gt;&lt;/big&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Fresh from the land of the angels, the child is angelic at birth. It is godlike. The soul enters the body of a child and it sleeps its childhood. The reason sleeps. The conscience sleeps. The child exists. It has not yet begun to live a reasoned, responsible life. The child is innocent, for it knows no guile. It is pure, for it has come not across impurity. It is angelic; for it has faced not the demon lurking within it. The flower of life has not yet budded and blossomed. Innocent, pure and angelic is childhood. To see children is to see the Yazatas and Amesha Spentas, the Angels and Archangels of Ahura Mazda.&lt;br /&gt;Nature abounds in many a charming object, but none so sweet as a child. Children fill our eyes with light and our hearts with delight. They gladden and they brighten our homes with their bright faces and happy smiles and sweet prattlings. They amuse us and cheer us and enliven us. Incomparable is the joy to fondle them and love them and play with them. Children in their budding tender life, are the poetry and song of human life.&lt;br /&gt;Childhood has no past. The present and the future are the two seasons of children. They dream not of the future. The present is all their life. No care, no anxiety, no fear have they. Life to them is joy and sunshine, frolic and fun.&lt;br /&gt;Childhood is the season of planting seeds that will blossom into rich harvest. As the farmer anxiously awaits the nature of the season's crops, so do fond parents look year after year how the child-mind develops and the child-soul unfolds. The child is the man and the children are the nation of the morrow. One day will the nation be as children grown up to maturity, will make it.&lt;br /&gt;As the rose bud unfolds its petals to the beams of the rising sun, so does blooming youth outgrow its childhood and with wide awake reason and conscience assumes the responsibilities of life.&lt;br /&gt;Now begins the journey on the rough and rugged path of life of hope and despair, joy and sorrow, success and failure, honor and shame, happiness or misery. Blank was the tablet of the soul in childhood. Youth now begins to record its daily doings and creates its history. Childhood was unsoiled by the vulgarities of the world. Youth now lives and works in the midst of temptation and vice. The light of reason brightens the paths of his life and the inner, infallible, divine voice guides him. The child was the angel by birth. Man or woman has to live the angelic life and fighting evil and living for good, has to become angel on his or her own merit.&lt;br /&gt;The child is every parent's hope. All long to live in their children. Give us children of sound minds in sound bodies, who may grow up to be men and women of brilliant career and pure character, diligent and honest, upright and true, wise and virtuous, patriotic and selfless, and live and work for thee and thine, Ahura Mazda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7352393174314046082?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7352393174314046082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/woman-is-mother-of-human-race.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7352393174314046082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7352393174314046082'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/woman-is-mother-of-human-race.html' title='Woman is the Mother of Human Race'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-8291679072611830258</id><published>2009-10-22T23:04:00.000-04:00</published><updated>2009-10-22T23:04:50.023-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Body Swapping</title><content type='html'>I've been thinking about body swapping the last couple days. Aside from the obvious means of temporarily escaping boredom, what other benefits could come from the ability to move from body to body? What sort of commercial ventures would naturally arise?&lt;br /&gt;&lt;br /&gt;Fitness centers would probably offer training services where professionals could tone your body for you, then transfer your mind back once it is complete. Another idea I had was using the transference as a means of transportation. How handy would it be to transmit your mind into another body waiting for you at your place of business? People suffering from chronic pain could find respite by temporarily swapping minds with someone else. Walk a mile in someone else's shoes? Why not walk a mile in someone else's feet? And of course the human computational potential could be maximized using this method. Take the brightest minds of our world and put them in the brains with the best connected neurons.&lt;br /&gt;&lt;br /&gt;Personally, I think it would be pretty interesting to transfer my mind into the same brain as someone else. If it were an active presence, it would be interesting to see what kind of communication could be achieved. Could emotions be directly shared instead of simply described? If a passive presence, it would be a great way of observing people and better understanding how we work. This could be a new form of counseling. Marriage problems? Download the mind of a marriage counselor who will observe your interactions then be able to give the most relevant advice. And of course, if external storage is a possibility, this could open up all other kinds of possibilities. We could preserve the best leaders and thinkers, we could offer individuals the opportunity to experience life 100 years in the future (assuming we manage not to destroy ourselves for that long). How would you capitalize on this new technology?&lt;br /&gt;&lt;br /&gt;As a side note, Dollhouse on Fox has largely been an uninteresting series of glorified pimping. I think they're trying to make some kind of commentary on the nature of human existence, but aren't doing a very good job of it. But the last episode of season 1 is really cool. It is set in a post-apocalyptic world where transferring minds has gone awry.&amp;nbsp; If they show more of that, I may start to actually care about the series again.&lt;br /&gt;&lt;br /&gt;What would you do with the ability to jump from body to body?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-8291679072611830258?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/8291679072611830258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/body-swapping.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8291679072611830258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/8291679072611830258'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/body-swapping.html' title='Body Swapping'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3643807112465181215</id><published>2009-10-16T00:21:00.005-04:00</published><updated>2010-05-21T13:58:55.119-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Java vs Groovy: Polymorphism</title><content type='html'>While doing some studying for SCJP, I was tinkering with some stuff in the Groovy console as a way of testing some stuff in Java and I found they actually behave differently.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;class Person {&lt;br /&gt;  protected String name&lt;br /&gt;  protected int age&lt;br /&gt;  &lt;br /&gt;  public Person() {&lt;br /&gt;    name = "secret"&lt;br /&gt;    age = -1&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class John extends Person {&lt;br /&gt;  int favoriteNumber&lt;br /&gt;  &lt;br /&gt;  public John() {&lt;br /&gt;    name = "nobody special"&lt;br /&gt;    age = 0&lt;br /&gt;    favoriteNumber = 7&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public String doNothing() {&lt;br /&gt;    return "junk"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Person p = new John()&lt;br /&gt;println p.doNothing()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If you do this in Java (splitting the classes out to their own files of course), it won't compile. Java looks at the reference type for available methods, so you will get a NoSuchMethodException. In Groovy, however, it looks at the type of the object, not the type of the reference so the method is found at runtime. And this is probably what you would want, so I can refer to John or Mary as a generic Person, but they still do the things they do in a John or Mary way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3643807112465181215?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3643807112465181215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/java-vs-groovy-polymorphism.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3643807112465181215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3643807112465181215'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/java-vs-groovy-polymorphism.html' title='Java vs Groovy: Polymorphism'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7252076007558852868</id><published>2009-10-16T00:21:00.004-04:00</published><updated>2010-05-21T13:58:34.254-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Java vs Groovy: Overriding static methods</title><content type='html'>The Java equivalent of below will not compile, but in Groovy it works fine. Groovy supports overriding static methods, whereas Java does not.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;class Person {&lt;br /&gt;  protected String name&lt;br /&gt;  protected int age&lt;br /&gt;  &lt;br /&gt;  public Person() {&lt;br /&gt;    name = "secret"&lt;br /&gt;    age = -1&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public static String doNothing() {&lt;br /&gt;    return "junk"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class John extends Person {&lt;br /&gt;  int favoriteNumber&lt;br /&gt;  &lt;br /&gt;  public John() {&lt;br /&gt;    name = "nobody special"&lt;br /&gt;    age = 0&lt;br /&gt;    favoriteNumber = 7&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public String doNothing() {&lt;br /&gt;    return "more junk"&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Person p = new John()&lt;br /&gt;println p.doNothing()&lt;/pre&gt;&lt;br /&gt;I don't think this would be a problem. You might want each inherited class to have its own (maybe static) version of a method, but for every instance of the class to only have one in memory. If you don't want the children overriding the method, you should just make them final.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7252076007558852868?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7252076007558852868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/java-vs-groovy-overriding-static.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7252076007558852868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7252076007558852868'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/java-vs-groovy-overriding-static.html' title='Java vs Groovy: Overriding static methods'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4449733314629577905</id><published>2009-10-15T22:17:00.004-04:00</published><updated>2010-05-21T13:59:39.678-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Skip The Tests</title><content type='html'>Skipping tests is generally a bad idea. But, if you are changing things just to tinker and see results, without particularly caring about the tests, it is easily skipped from the command line:&lt;br /&gt;&lt;pre style="overflow:auto;"&gt;mvn install -DskipTests&lt;/pre&gt;This is something I'm sure you've seen. What I didn't know is that you can also skip the compiling of the tests:&lt;br /&gt;&lt;pre style="overflow:auto;"&gt;mvn install -Dmaven.test.skip=true&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4449733314629577905?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4449733314629577905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/skip-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4449733314629577905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4449733314629577905'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/skip-tests.html' title='Skip The Tests'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7164775545794443181</id><published>2009-10-15T21:01:00.019-04:00</published><updated>2010-05-22T15:13:08.476-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>Code in Blogger</title><content type='html'>So, I've been looking for a way to make my code examples in blog posts more readable. I had tried to use the hosted version of &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;SyntaxHighlighter&lt;/a&gt;, but couldn't seem to get it working right (I'm sure it was something simple) and it needed several lines added to the Blogger html template. Instead, I've opted to use &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;google-code-prettify&lt;/a&gt;. Though it doesn't support as many languages (in particular no groovy), all I needed was 2 lines pasted into the template, and making it load the class when the body element is. Couldn't be simpler. I followed the instructions (slightly tweaked) from &lt;a href="http://lukabloga.blogspot.com/2008/10/to-test-new-highlighting.html"&gt;here&lt;/a&gt;. Thanks Luka.&lt;br /&gt;&lt;br /&gt;These are the lines you need (anywhere in head tag):&lt;br /&gt;&lt;pre class="brush:html; wrap-lines:false"&gt;&amp;lt;link href=&amp;quot;http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css&amp;quot; type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js&amp;quot; /&amp;gt;&lt;/pre&gt;Then modify body tag to load the script:&lt;br /&gt;&lt;pre class="brush:html; wrap-lines:false"&gt;...&lt;br /&gt;&amp;lt;body onload='prettyPrint()'&amp;gt;&lt;br /&gt;...&lt;/pre&gt;Use:&lt;br /&gt;&lt;pre class="brush:html; wrap-lines:false"&gt;&amp;lt;pre class=&amp;quot;prettyprint&amp;quot; style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;!-- Your code goes here --&amp;gt;&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;/pre&gt;You don't need to specify the language since the script will guess, but you can if you like:&lt;br /&gt;&lt;pre class="brush:html; wrap-lines:false"&gt;&amp;lt;pre class=&amp;quot;prettyprint lang-html&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;!-- HTML code here --&amp;gt;&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;/pre&gt;The lang-* class specifies the language file extensions. File extensions supported by default include &amp;quot;bsh&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;cc&amp;quot;, &amp;quot;cpp&amp;quot;, &amp;quot;cs&amp;quot;, &amp;quot;csh&amp;quot;, &amp;quot;cyc&amp;quot;, &amp;quot;cv&amp;quot;, &amp;quot;htm&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;java&amp;quot;, &amp;quot;js&amp;quot;, &amp;quot;m&amp;quot;, &amp;quot;mxml&amp;quot;, &amp;quot;perl&amp;quot;, &amp;quot;pl&amp;quot;, &amp;quot;pm&amp;quot;, &amp;quot;py&amp;quot;, &amp;quot;rb&amp;quot;, &amp;quot;sh&amp;quot;, &amp;quot;xhtml&amp;quot;, &amp;quot;xml&amp;quot;, &amp;quot;xsl&amp;quot;.&lt;br /&gt;&lt;br /&gt;I've gone back and added the syntax highlighting to all my code examples in previous posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7164775545794443181?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7164775545794443181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/code-in-blogger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7164775545794443181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7164775545794443181'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/code-in-blogger.html' title='Code in Blogger'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5847330591084087557</id><published>2009-10-15T20:20:00.009-04:00</published><updated>2010-05-21T14:00:53.404-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Boolean.flip()</title><content type='html'>Recently I needed a Boolean in a groovy project I was working on to alternate back and forth (for row highlighting with Apache &lt;a href="http://poi.apache.org/"&gt;POI&lt;/a&gt;). I thought it would be slick to metaclass a flip() method (something I've always thought should be there) into Boolean. It turns out, this is not possible. I browsed the Java source and learned that all primitive wrapper classes are immutable. I'm not completely sure why they did this. My guess is to protect programmers from hurting themselves by mutating objects in a collection and possibly creating unexpected behavior or a race condition.&amp;nbsp; I could have created my own boolean wrapper class, of course, or use Apache Commons &lt;a href="http://commons.apache.org/lang/api-release/org/apache/commons/lang/mutable/MutableBoolean.html"&gt;MutabeBoolean&lt;/a&gt;. In the end, I decided not to be fancy and just reference a new object like&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;Boolean foo = false&lt;br /&gt;foo = !foo&lt;/pre&gt;But boy, it would have been pretty &amp;amp; nice to have&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;Boolean foo = true&lt;br /&gt;foo.flip()&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5847330591084087557?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5847330591084087557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/booleanflip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5847330591084087557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5847330591084087557'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/booleanflip.html' title='Boolean.flip()'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1269446803713607966</id><published>2009-10-06T08:24:00.001-04:00</published><updated>2009-10-06T08:25:17.423-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><title type='text'>Yay!  Someone else agrees with me!</title><content type='html'>A couple days ago, I &lt;a href="http://wittykeegan.blogspot.com/2009/10/project-estimation.html"&gt;blogged&lt;/a&gt; about some of my frustrations with task estimation. This morning, I saw an &lt;a href="http://agile.dzone.com/articles/problem-planning"&gt;article&lt;/a&gt; posted on &lt;a href="http://agile.dzone.com/"&gt;AgileZone&lt;/a&gt; that seemed to echo my words (though in a more concise and articulated fashion than I managed to).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1269446803713607966?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1269446803713607966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/yay-someone-else-agrees-with-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1269446803713607966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1269446803713607966'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/yay-someone-else-agrees-with-me.html' title='Yay!  Someone else agrees with me!'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5234712838195590112</id><published>2009-10-05T18:21:00.000-04:00</published><updated>2009-10-05T18:21:26.611-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Things About This Universe That Amuse Me</title><content type='html'>&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;We live in a weird universe.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol style="font-family: inherit;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;There are more species of &lt;a href="http://en.wikipedia.org/wiki/Beetle"&gt;beetles &lt;/a&gt;than any other order the animal kingdom, comprising 25% of all known life-forms.&lt;br /&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Humans are the only species that drinks milk from a species other than their own.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;There are significantly less than a &lt;a href="http://en.wikipedia.org/wiki/Googol"&gt;googol&lt;/a&gt; of atoms in the &lt;a href="http://en.wikipedia.org/wiki/Known_universe"&gt;known universe&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.writtensound.com/"&gt;Onomatopoeias&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Time is relative.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;More people have &lt;a href="http://en.wikipedia.org/wiki/World_population#Number_of_humans_who_have_ever_lived"&gt;died&lt;/a&gt; than are currently alive (6% of all people who had ever existed were alive in 2002).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;The chimpanzee genome is &lt;a href="http://en.wikipedia.org/wiki/Human_genome#Evolution"&gt;95% identical&lt;/a&gt; to the human genome. And up to &lt;a href="http://en.wikipedia.org/wiki/Junk_DNA"&gt;95%&lt;/a&gt; of our genome may be junk left behind by retroviruses and evolutionary artifacts.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Humans are the only species known to use the &lt;a href="http://en.wikipedia.org/wiki/Smile"&gt;smile&lt;/a&gt; to express something other than fear and aggression.&lt;/span&gt;&lt;/li&gt;&lt;li style="color: black;"&gt;&lt;span style="font-size: small;"&gt;∞ - &lt;/span&gt;&lt;span style="font-size: small;"&gt;∞ &lt;a href="http://www.philforhumanity.com/Infinity_Minus_Infinity.html"&gt;!= 0&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Human &lt;a href="http://en.wikipedia.org/wiki/Childbirth"&gt;childbirth&lt;/a&gt;. How does this not kill us? The infant's skull actually changes shape as it passes through the birth canal.&lt;/span&gt;&lt;/li&gt;&lt;li style="color: black;"&gt;&lt;span style="font-size: small;"&gt;Human &lt;a href="http://en.wikipedia.org/wiki/Human_flora"&gt;flora&lt;/a&gt;. The womb is sterile, but after the family has finished kissing and caressing, 500 to 1000 kinds of bacteria live in the gut, and just as many on the skin. Cool.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;Song in my head today: &lt;a href="http://www.amazon.com/Cassie/dp/B000XMC0UI/"&gt;Cassie&lt;/a&gt; from the self-titled album by Flyleaf.&lt;/span&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/3203340561656331707-5234712838195590112?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5234712838195590112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/things-about-this-universe-that-amuse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5234712838195590112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5234712838195590112'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/things-about-this-universe-that-amuse.html' title='Things About This Universe That Amuse Me'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7342043053990374690</id><published>2009-10-04T22:29:00.001-04:00</published><updated>2009-10-06T08:19:39.351-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><title type='text'>Project Estimation</title><content type='html'>I've been thinking about project estimation the last several days. What initially got me thinking about it was the links off of &lt;a href="http://www.infoq.com/news/2009/09/story-points-versus-hours"&gt;this &lt;/a&gt;article. I find the notion of using story points instead of hours for sprint estimates appealing. I like the idea of having a set number of story points per sprint, it keeps everyone apprised of the complexity of the issues at hand. It also encourages the use of stories instead of use cases for requirements, which has some &lt;a href="http://www.mountaingoatsoftware.com/articles/27-advantages-of-user-stories-for-requirements"&gt;advantages&lt;/a&gt;. I buy the idea that estimating story points is easier than estimating time. Scrum-Breakfast &lt;a href="http://www.scrum-breakfast.com/2008/02/explaining-story-points-to-management.html"&gt;likens it&lt;/a&gt; to a train&lt;br /&gt;&lt;blockquote&gt;Traditional estimates attempt to answer the question, "how long will it take to develop X?" I could ask you a similar question, "How long does it take to get the nearest train station?&amp;nbsp; The answer, measured in time, depends on two things, the distance and the speed. Depending on whether I plan to go by car, by foot, by bicycle [...], the answer can vary dramatically. So it is with software development. The productivity of a developer can vary dramatically, both as a function of innate ability and whether the task at hand plays to his strong points, so the time to produce a piece of software can vary dramatically. But the complexity of the problem doesn't depend on the person solving it, just as the distance to the train station does not depend on how I get there.&lt;br /&gt;&lt;/blockquote&gt;However, I think this ignores a fundamental aspect of human nature (at least of modern day humans): our need for instant gratification. We don't really care how far away something is (except for concerns about fuel). When we ask someone how far away they live from some particular point, they usually give an answer in hours and minutes, not miles. They view it as a question of how long they have to wait before they get what they want. Similarly, product people and especially the customer don't particularly care how complex a problem is to solve. They just want it solved, and want to know how long they have to wait before they get what they want.&lt;br /&gt;&lt;br /&gt;It seems to me that eventually &lt;i&gt;someone&lt;/i&gt; will have to make the translation to hours (even if only done implicitly). Users care about release dates -- "when are the features I want going to be available?". Even if you schedule sprints with story points, someone is going to have to figure out how long those will take to complete in order to set a reasonable release date. When you make this conversion, you will have to account for variances in velocity (the speed at which people work). Even if you do decide to use story points, this correlation will be necessary at first to establish how many story points are possible in a sprint.&lt;br /&gt;&lt;br /&gt;Still, there are some advantages to this approach that come to mind. When you estimate story points, you don't have to estimate both complexity and your ability to solve the complexity. You only have to worry about the complexity. The hours for big things are often pulled out of the air and aren't very accurate until they are broken down into tasks. Story points provide a good way of looking at the big picture without fleshing out all the details. One additional cool thing about story points is that they have built in variances, as Scrum Breakfast &lt;a href="http://www.scrum-breakfast.com/2008/02/explaining-story-points-to-management.html"&gt;points out&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;The thing to realize about about estimates is that they are very imprecise. +/- 50%. One technique for dealing with a cost ceiling is to define an estimate such that the actual effort needed will be &amp;lt;= the estimate in 90% of the cases, regardless of whether they are measured in days, hours or point. So Story Points are usually estimated on the Cohn Scale (named for &lt;a href="http://www.scrumalliance.org/profiles/8-mike-cohn"&gt;Mike Cohn&lt;/a&gt;, who popularized the concept): 0, 1, 2, 3, 5, 8, 13, 20, 40, 100. Why is there no 4? Well a 3 is a 3 +/- 50%, so a three actually extends from 2 to 5, a 5 from 3 to 8, etc. The difference between 3 and 4 is nowhere near as significant and between 1 and 2, so we don't give estimates that give us a false sense of precision. Summed together, many imprecise estimates give a total that is a remarkably accurate estimate of the work to be performed (the errors tend to cancel each other out, rather than accumulate).&lt;br /&gt;&lt;/blockquote&gt;Mule also had an interesting &lt;a href="http://blogs.mulesoft.org/2009/09/agile-planning-at-mule/"&gt;approach&lt;/a&gt; to creating a product backlog, where they used a sort of bucket sorting rather than choosing actual numbers for story points. This is what Chris Sterling calls &lt;a href="http://chrissterling.gettingagile.com/2008/07/04/affinity-estimating-a-how-to/"&gt;affinity estimating&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mike Cohn says that sprint backlogs and product backlogs &lt;a href="http://blog.mountaingoatsoftware.com/sprint-and-release-planning-should-be-in-different-units"&gt;should have different units&lt;/a&gt; to prevent confusion, since if you use hours for both it doesn't show that hours on a sprint backlog have been thought about a lot more than hours on the product backlog. Speaking of Mike Cohn, he has an interesting &lt;a href="http://blog.mountaingoatsoftware.com/why-i-dont-use-story-points-for-sprint-planning"&gt;notion&lt;/a&gt; for the role of story points. He suggests they are a good long-term indicator, but the short term should focus on the product backlog and prioritize stories, then break them into tasks and estimate those using hours. Some have suggested using task points in a similar way as story points, but for individual tasks. This might provide some room for variance if you really suck at estimating. Additionally, you will only have to update the estimates when complexity changes not when velocity changes. This also might be a more lean approach since it doesn't waste time on an artifact that is not needed. However there are some downsides to this approach. One is that there is no easy way to track the progress of the task (e.g. in Jira), unless a conversion to hours is first made. It also presents a challenge to HR, which may wish to account for hours for financial reporting purposes.&lt;br /&gt;&lt;br /&gt;I think it makes a bit of sense to use hours to estimate at the task level, since you should be able to give more detail at that point (as opposed to the bigger items, like stories where any hours ascribed would basically be pulled out of thin air). This is what I'm interested in. How can I make my task estimates more accurate to make sure I can deliver what I think I can deliver? To me, it seems the issue with both of these methods of task estimation is that they do not address the real problem with why tasks get off schedule in the first place. Actually, there are two, but both deal with an unknown. The first is if there are other tasks competing for the same resource (e.g. your time) that weren't initially accounted for: either they came up after the estimation or were a result of oversight. The second is because you have misjudged the complexity of a task. You look at a problem, it seems pretty simple, you ascribe a few hours/points/whatever to it, but once you start digging into the problem you realize its going to take longer than you thought. Then you are left with the &lt;a href="http://blog.mountaingoatsoftware.com/to-re-estimate-or-not-that-is-the-question"&gt;question&lt;/a&gt; of whether or not to re-estimate. I think while the original estimate should be retained for posterity's sake, its useful for the product people to have a new estimate for planning purposes...perhaps pushing back to another sprint.&lt;br /&gt;&lt;br /&gt;The only certainty is the certainty of uncertainty, but that's probably why you're doing agile in the first place. This is especially true when new technology is involved. While there are some who advocate task points for breaking down tasks (pieces of a story), most advocate to use hours at this level. And this is what I do not understand. Why are we going to all the bother to make all these estimates about minutia? Get a commitment from developers, keep a backlog, and get to work! I can't believe some agile teams are willing to spend &lt;a href="http://scrumtraininginstitute.com/home/stream_download/scrumprimer"&gt;several hours&lt;/a&gt; (some say &lt;a href="http://abrachan.wordpress.com/scrum/scrum/rules-for-the-spint-planning-meeting/"&gt;8 hours&lt;/a&gt;) on sprint planning. That doesn't sound agile to me at all. A practice that seems to work pretty well for some of my colleagues here at OCLC is to use units that are a bit fuzzier than an hour. They tend to estimate in 1/2 days, which is a bit less precise, but allows for greater accuracy because it is easier to ballpark. But unless you are continuously updating estimates (as the &lt;a href="http://scrumtraininginstitute.com/home/stream_download/scrumprimer"&gt;Scrum Primer&lt;/a&gt; suggests) so that volunteers can move around on tasks (perhaps in a paired situation), I don't see much point in having exact hours.&lt;br /&gt;&lt;br /&gt;Honestly, I'd rather do away with task estimates altogether. Maybe its because I don't like submitting something that I know I can't do a good job on (at least not yet). But it also seems to me that you are spending time creating an artifact that doesn't necessarily help you finish the sprint. There are some out there who have suggested this. Including Jeff Sutherland &lt;a href="http://www.notesfromatooluser.com/2008/02/solve-your-task.html"&gt;here&lt;/a&gt;. Jurgen De Smet has an interesting blog post on it &lt;a href="http://agilefun.com/2008/09/10/why-dont-we-use-hours-for-task-estimation/"&gt;here&lt;/a&gt;. I feel that as long as I'm reasonably certain I can get tasks X, Y, Z done in sprint N, I don't' really need to make up numbers for how long they'll take. Maybe I'd feel differently if I were on multiple teams and close to being overworked. But I feel developing this sense is developing a skill that isn't really useful for anything. I can't even get good at estimating to apply it to other areas to improve productivity, this 'gut' sense is a rather domain specific intuition. What's the point? Am I completely missing something?&lt;br /&gt;&lt;br /&gt;P.S. This didn't really fit with anything else, but I wanted to pass it along. It is about building a common definition of done:&lt;br /&gt;&lt;a href="http://chrissterling.gettingagile.com/2007/10/05/building-a-definition-of-done/"&gt;http://chrissterling.gettingagile.com/2007/10/05/building-a-definition-of-done/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1253797980854"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7342043053990374690?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7342043053990374690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/project-estimation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7342043053990374690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7342043053990374690'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/10/project-estimation.html' title='Project Estimation'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3671209184988766845</id><published>2009-09-25T13:46:00.000-04:00</published><updated>2009-09-25T13:46:34.144-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Vaccuum Your Firefox</title><content type='html'>This has been blogged about in the usual places already, but for those who haven't seen it:&lt;br /&gt;There's an addon for Firefox that defragments its sqlite database, called &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/13878"&gt;Vacuum Places&lt;/a&gt;. I recently gave this a whirl and was pleased with the results. The responsiveness of my address bar was noticeably improved. Now, bear in mind that I use Firefox &lt;b&gt;a lot&lt;/b&gt;. I have over 4000 bookmarks -- its kinda getting out of control. Those who don't use it as much probably won't notice much of a difference, but give it a whirl and see what it does for you. Note that there is a disclaimer saying to backup you profile (easily done with &lt;a href="http://mozbackup.jasnapaka.com/"&gt;MozBackup&lt;/a&gt;), but I haven't had any issues with it.&lt;br /&gt;&lt;br /&gt;Some other addons you might want to check out:&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1865"&gt;Adblock Plus&lt;/a&gt; - never see another ad&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/11243"&gt;SkipScreen&lt;/a&gt; - auto waits on file upload sites&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3006"&gt;DownloadHelper&lt;/a&gt; - download youtube videos, a page of images at once, and more&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/201"&gt;DownThemAll!&lt;/a&gt; - download everything on a page, based on filters (all pdfs, all images, etc)&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasmonkey&lt;/a&gt; - run custom javascript in website to do all sorts of nifty things (use &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8352"&gt;Greasefire&lt;/a&gt; to light up when scripts are available on the current site or get some &lt;a href="http://userscripts.org/"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2108"&gt;Stylish&lt;/a&gt; - loads custom css into sites (get some &lt;a href="http://userstyles.org/"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1122"&gt;Tab Mix Plus&lt;/a&gt; - one of the biggest reasons I use it is for the 'duplicate tab' option, but the 'close other tabs', 'close right tabs', and 'close left tabs' are pretty nifty too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3671209184988766845?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3671209184988766845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/vaccuum-your-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3671209184988766845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3671209184988766845'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/vaccuum-your-firefox.html' title='Vaccuum Your Firefox'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1674620159110999339</id><published>2009-09-25T13:07:00.000-04:00</published><updated>2009-09-25T13:07:11.057-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Duct Tape Programmers</title><content type='html'>Wednesday there Joel &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;blogged&lt;/a&gt; about the first chapter of &lt;a href="http://www.amazon.com/dp/1430219483"&gt;Coder's At Work&lt;/a&gt;, where he admired duct tape programmers that were willing to skip unit tests and code quality in order ship on time. I don't really have much to say about it that Uncle Bob and his commenters have &lt;a href="http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer"&gt;said&lt;/a&gt;. I agree with just about everything Bob said except for&lt;br /&gt;&lt;blockquote&gt;I found myself annoyed at Joel’s notion that most programmers aren’t smart enough to use templates, design patterns, multi-threading, &lt;span class="caps"&gt;COM&lt;/span&gt;, etc. I don’t think that’s the case. I think that any programmer that’s not smart enough to use tools like that is probably not smart enough to be a programmer period.&lt;br /&gt;&lt;/blockquote&gt;In an ideal world, this would be true. And as the industry matures, I think this is becoming increasingly true. However, there are still some programmers out there that aren't very talented and probably shouldn't be programming, and yet they still are. Now I'm not an advocate of making your life difficult to weed out the less talented, but our ever increasing toolbox is lowering the barriers to entry. This isn't necessarily a bad thing. I have a fair amount of faith in the invisible hand and if this allows businesses to get their needs met, then so be it. Just be aware there are people programming that aren't the sharpest knives in the box out there, and they may even be getting away with it...at least for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1674620159110999339?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1674620159110999339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/duct-tape-programmers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1674620159110999339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1674620159110999339'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/duct-tape-programmers.html' title='Duct Tape Programmers'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3518543859806256200</id><published>2009-09-25T08:12:00.001-04:00</published><updated>2009-09-25T08:18:04.794-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><title type='text'>Free</title><content type='html'>Today's XKCD:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xkcd.com/641/"&gt;Free&lt;/a&gt;: "&lt;img alt="Asbestos is bad; definitely get the one on the right. Wait -- this one over here has no swine flu!  Now I can't decide." src="http://imgs.xkcd.com/comics/free.png" title="Asbestos is bad; definitely get the one on the right. Wait -- this one over here has no swine flu!  Now I can't decide." /&gt;"&lt;br /&gt;&lt;br /&gt;How about those labels like on bottled water "0 calories" (uhh, its water...I should hope so). Reminds me of that Head and Shoulders &lt;a href="http://www.youtube.com/watch?v=VzTXxZ3sNUI"&gt;commercial&lt;/a&gt;. "I'm gunna make tires with zero death crystals...and those will be the tires to have"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3518543859806256200?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3518543859806256200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/free.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3518543859806256200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3518543859806256200'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/free.html' title='Free'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3654718732429186490</id><published>2009-09-25T01:09:00.004-04:00</published><updated>2012-01-25T18:27:47.577-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'></title><content type='html'>Highlights from today's thoughtstream: &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;I've always wondered why there was no netflix for cds...turns out there &lt;a href="http://www.yourmusic.com/"&gt;is&lt;/a&gt;. And you can keep the cd for $7 each. Not a bad deal.&lt;/li&gt;&lt;li&gt;I've also wondered why the speed on the rear window wipers is so damn fast...in most vehicles you need to wipe it at least 1/3 of the number of times as the front, perhaps less -- unless you are driving 70mph..in reverse.&lt;/li&gt;&lt;li&gt;I Tried Japanese green tea with Matcha the other night...bit of a different flavor than the usual and lighter more lime green color. I particularly like the bags on these, I believe they are silk. The paper bags always leave an aftertaste.&lt;/li&gt;&lt;li&gt;Women have a lower amount of &lt;a href="http://en.wikipedia.org/wiki/Body_water"&gt;body water&lt;/a&gt; than men, not higher as I previously believed. However, &lt;a href="http://books.google.com/books?id=3pPAWd1PW2sC&amp;amp;pg=PA227&amp;amp;lpg=PA227#v=onepage&amp;amp;q=&amp;amp;f=false"&gt;The Science of Flexibility&lt;/a&gt; supports our belief that woman are more flexible than men. This is because the placement of the hips are wider, allowing for greater range of motion (wouldn't it be cool if they could unhinge somehow?). We know that women have a lower hematocrit and higher levels of subcutaneous fat, but this would presumably only affect endurance and not flexibility. I haven't seen anything about differences in muscular composition that could contribute to increased flexibility.&lt;/li&gt;&lt;li&gt;Song stuck in my head today: Flobots - Mayday!&lt;/li&gt;&lt;li&gt;A talk with Kyle reminded me of an interesting &lt;a href="http://www.foreignpolicy.com/articles/2009/07/24/the_world_s_worst_sons"&gt;article&lt;/a&gt; I read about the sons of world leaders. I especially like the section on Kim Jong Il's son&lt;/li&gt;&lt;li&gt;I've been looking for a music search engine that finds songs of similar acoustic quality and style of queried songs. I found &lt;a href="http://audiobaba.com/"&gt;this one&lt;/a&gt;, but its not very easy to use.&lt;/li&gt;&lt;li&gt;Enabling piplining in firefox (in about:config) and turning up the maxrequests to 15 or so makes firefox considerably more peppy.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_z8scSW9cOxE/SryuM4Gpb5I/AAAAAAAABhc/b8_HoRRyBX8/s1600-h/piplining.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_z8scSW9cOxE/SryuM4Gpb5I/AAAAAAAABhc/b8_HoRRyBX8/s400/piplining.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3654718732429186490?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3654718732429186490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/highlights-from-todays-thoughtstream.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3654718732429186490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3654718732429186490'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/highlights-from-todays-thoughtstream.html' title=''/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z8scSW9cOxE/SryuM4Gpb5I/AAAAAAAABhc/b8_HoRRyBX8/s72-c/piplining.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2281562643011608285</id><published>2009-09-23T10:15:00.000-04:00</published><updated>2009-09-23T10:15:48.536-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Don't Bother Testing for Null?</title><content type='html'>This &lt;a href="http://www.jbrains.ca/permalink/282"&gt;appeared&lt;/a&gt; on Rainsberger's blog a couple of days ago&lt;br /&gt;&lt;blockquote&gt;Unless I’m publishing an API for general use, I don’t worry about testing method parameters against &lt;code&gt;null&lt;/code&gt;. It’s too much code and too many duplicate tests. Besides, I would be testing the wrong thing.&lt;br /&gt;When a method receives &lt;code&gt;null&lt;/code&gt; as a parameter, the invoker—and not the receiver—is missing a test&lt;br /&gt;&lt;/blockquote&gt;I think I've got to disagree with him on this one. Unless I'm misunderstanding 'general use'. It might be OK not to test for null if it's just your code calling your code (of course what happens when this gets pushed out, maybe serviceized and suddenly others are calling it?) Even if you do not guarantee the right results if the method is passed a null, I would think you should at least make sure that it doesn't blow up. If it fails, it should fail gracefully. It's true that it's not the responsibility of the receiver to make sure the invoker is calling it correctly, and I wouldn't expect a test for every conceivable possibility necessarily. But nulls happen all the time, its not unreasonable to expect a quick check. There wouldn't even be a lot of code. something like&lt;br /&gt;&lt;code&gt;if (someVar == null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.error("it was null");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;would do nicely. I do agree there is test duplication between the reciever and invoker, in that both are testing for the null condition on the same variable, but this doesn't really bother me. It seems to me there are lots of tests that have overlap or dependencies. Maybe I'm just crazy. I left a comment on the post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2281562643011608285?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2281562643011608285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/dont-bother-testing-for-null.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2281562643011608285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2281562643011608285'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/dont-bother-testing-for-null.html' title='Don&apos;t Bother Testing for Null?'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2752077658594989207</id><published>2009-09-23T08:10:00.000-04:00</published><updated>2009-09-23T08:10:32.904-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><title type='text'>I guess I just don't understand Europe</title><content type='html'>I saw &lt;a href="http://www.infoq.com/news/2009/09/sun_oracle_delay"&gt;this&lt;/a&gt; article today, which said that Larry Ellison (Chief Executive of Oracle) stated that Sun was losing $100 million every month their proposed merger doesn't go through. The reason the EU commission has been reluctant to put the deal through? They're worried MySQL might get dumped. Well, so am I --- but, uh, it's OPEN SOURCE. It can't be killed. If Oracle decides they're not going to do any further work on it whatsoever, someone else can pick it up and continue development. Don't like the direction the company is going with it? Fork it! Someone actually &lt;a href="http://askmonty.org/wiki/index.php/MariaDB"&gt;already has&lt;/a&gt;, actually two &lt;a href="https://launchpad.net/drizzle"&gt;have&lt;/a&gt;. That's the whole point of open source.&lt;br /&gt;"The Commission    has to ensure that such alternatives would continue to be available." Uhh, duh?!&lt;br /&gt;&lt;br /&gt;Open source: Have it your way&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://farm1.static.flickr.com/21/24784426_f76e8b70aa_o.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://farm1.static.flickr.com/21/24784426_f76e8b70aa_o.jpg" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2752077658594989207?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2752077658594989207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/i-guess-i-just-dont-understand-europe.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2752077658594989207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2752077658594989207'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/i-guess-i-just-dont-understand-europe.html' title='I guess I just don&apos;t understand Europe'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2300746919975983017</id><published>2009-09-21T10:38:00.000-04:00</published><updated>2009-09-21T10:38:51.704-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Extending NTFS with Bad Sectors</title><content type='html'>I wanted to grow an NTFS partition to use unallocated space this weekend on an XP machine. If it were Vista or Win7, I would have used the built in resizing ability in disk management, and I found I could not do so with my usual tool of choice (&lt;a href="http://gparted.sourceforge.net/livecd.php"&gt;GParted Live CD&lt;/a&gt;). The error message said that it could not complete the operation because of two bad sectors, and to run chkdsk (which I did) and then use ntfsresize with the --bad-sectors option. When I tried this, it said it couldn't grow it unless I make it bigger with fdisk. The only way I know how to do this would be to create an entirely new partition (which would mean all the hassle of reinstalling windows and the needed apps). I was finally able to do it with &lt;a href="http://www.partition-tool.com/personal.htm"&gt;EASEUS Partition Master Personal&lt;/a&gt;. Unfortunately, it is not open source, but it is free and it did what I was trying to do without restarting in minutes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2300746919975983017?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2300746919975983017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/extending-ntfs-with-bad-sectors.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2300746919975983017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2300746919975983017'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/extending-ntfs-with-bad-sectors.html' title='Extending NTFS with Bad Sectors'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1732687356246474220</id><published>2009-09-18T14:36:00.000-04:00</published><updated>2009-09-18T14:36:52.297-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Types of Reviews</title><content type='html'>&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;An interesting discussion was started in this month's section meeting about code reviews. People brought up the point that catching flaws in design implementation requires knowledge of the requirements and that not having such knowledge allows the reviewer to only look for bad programming practices in general. Of course, I'm new to all this, but it seemed logical to me to have three kinds of reviews.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;- Design Review&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;- Implementation Review&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;- Code Review&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The purpose of a design review would be to review the design of the system. This is a higher level view and shouldn't involve any code. The purpose of an implementation review is to review how well the code meets the requirements (somewhat similar to acceptance testing), this test is probably the most time intensive of the three. A code review is a review of the code itself (perhaps with some context, but not at the level of an implementation review. This should focus on errors in logic, and adherence to accepted coding standards (not style). Am I missing something that should be reviewed?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;I think when I prepared code for review, it helped when I attached an overview of the classes and what their purpose and general relation to each other was. If a class is very large (probably needs refactored), it may also help to attach an overview of it (at least for the methods most important to complete its job).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;It was also pointed out that having people read over requirements and code would take a fair amount of time, which is time not spent on other tasks. An unanswered question was whether pair programming should complement standard reviews or replace them&lt;/span&gt;&lt;/span&gt; altogether, and how time could be used most efficiently. Everyone agreed that in some way the feedback loop needed to be shortened, whether that be through pair programming or reviewing more often over smaller amounts of code or some other means.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1732687356246474220?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1732687356246474220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/types-of-reviews.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1732687356246474220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1732687356246474220'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/types-of-reviews.html' title='Types of Reviews'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1530116455001066181</id><published>2009-09-14T23:14:00.002-04:00</published><updated>2009-09-14T23:15:12.051-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>These aren't the leaks you're looking for</title><content type='html'>So I got back to my computer today and found my computer moving so slow the mouse was chugging across the screen and the start menu essentially unresponsive. I discovered explorer.exe consuming 3.8 GB of memory. It was awesome. (BTW I'm running Windows 7 64bit RTM). Naturally, I'd expect some poorly written shell extension to be the culprit (which I intend to investigate further). But seeing as how I've been enjoying the bliss that is Redmond since XP with the same problem (even more memory with Vista and Win7), I have a hunch its not. Now remember, according to Microsoft:&lt;br /&gt;&lt;i&gt;begin Jedi mind trick:&lt;/i&gt;&lt;br /&gt;There are no memory leaks in Windows Explorer&lt;br /&gt;&lt;br /&gt;Restarting explorer.exe brought it down to about 1.2 GB and restarting brought it down to like 50 MB. These are the leaks we're looking for... move along.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1530116455001066181?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1530116455001066181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/these-arent-leaks-youre-looking-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1530116455001066181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1530116455001066181'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/these-arent-leaks-youre-looking-for.html' title='These aren&apos;t the leaks you&apos;re looking for'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1201309348667129321</id><published>2009-09-14T22:50:00.003-04:00</published><updated>2009-09-14T23:23:47.526-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gadgets'/><title type='text'>Why Cowon is Awesome</title><content type='html'>The &lt;a href="http://www.cowonamerica.com/products/cowon/s9/"&gt;COWON S9&lt;/a&gt; is infinitely more awesome than the iPod and the Zune. Here are a few reasons why: AMOLED touch display, video playback, FLAC and OGG compatibility (though unfortunately no apple lossless), a completely customizable interface (flash/actionscript), &lt;a href="http://iaudiophile.net/forums/forumdisplay.php?f=93"&gt;Themes&lt;/a&gt; and &lt;a href="http://www.anythingbutipod.com/forum/forumdisplay.php?f=201"&gt;more themes&lt;/a&gt;, &lt;a href="http://iaudiophile.net/forums/forumdisplay.php?f=95"&gt;games and apps&lt;/a&gt;, drag and drop file syncing (no iTunes or special software required), highly customizable equalizer. And they regularly provide free updates. On August 17, they updated the firmware with even more &lt;a href="http://www.cowonglobal.com/download/Firmware/COWONS9/GUIDE/2_41/en_s9_guide.html"&gt;features&lt;/a&gt; (previous update was July 24). It also has a microphone and a radio. I also hear they are working on porting rockbox to COWON.&lt;br /&gt;&lt;br /&gt;I was a bit nervous when I purchased this, I carefully read reviews and so forth about it, but its a Korean brand I had not heard of before. I've owned it for about three months now and I have absolutely no regrets. It doesn't have quite the storage capacity of iPod or Zune (30GB), but don't think I could fit my entire collection on them anyway. I keep my music in three different places on my computer, some mp3, some flac, some ogg. With my S9, I can just drag and drop whatever in there and it maintains the same folder structure so you can easily find things (ever try making sense of the organization iPod uses?). I'm using my music collection in ways that were simply not possible with my old iPod. If your iPod or Zune has recently bit the dust, I highly recommend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1201309348667129321?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1201309348667129321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/why-cowon-is-awesome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1201309348667129321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1201309348667129321'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/why-cowon-is-awesome.html' title='Why Cowon is Awesome'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-953183987254365753</id><published>2009-09-14T10:00:00.009-04:00</published><updated>2009-10-15T21:23:32.836-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>The Not So Answered Variables in GPathResult</title><content type='html'>A while ago, I &lt;a href="http://wittykeegan.blogspot.com/2009/08/answered-using-variables-in-xmlslurpers.html"&gt;posted&lt;/a&gt; that I had gotten the answer on how to get the number of records in an xml file using XMLSlurper (or XMLParser) by passing a variable. It turns out, it was not so answered. This only worked for elements that are immediate children of the root. It seems XMLSlurper and XMLParser can't get longer paths from a single String, it needs to be broken up. (Not sure why it was implemented this way). Fortunately, our own brilliant, Jonathan Baker noticed this and suggested the solution below. It's not complicated once you figure out that the String has to be broken up:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow:auto;"&gt;def xmltxt = """&lt;br /&gt;&amp;lt;file&amp;gt;&lt;br /&gt;  &amp;lt;something&amp;gt;&lt;br /&gt;    &amp;lt;record&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;nakina&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;/record&amp;gt;&lt;br /&gt;    &amp;lt;record&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;buaboe&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;/record&amp;gt;&lt;br /&gt;  &amp;lt;/something&amp;gt;&lt;br /&gt;&amp;lt;/file&amp;gt;"""&lt;br /&gt; &lt;br /&gt;def xml = new XmlSlurper().parseText(xmltxt)&lt;br /&gt;def fullPath = 'file.something.record'&lt;br /&gt;&lt;br /&gt;def pathElements = fullPath.tokenize('.')&lt;br /&gt;pathElements -= xml.name()&lt;br /&gt;def root = xml&lt;br /&gt;pathElements.each {node -&amp;gt;&lt;br /&gt;    root = root."$node"&lt;br /&gt;}&lt;br /&gt;return root.size()&lt;/pre&gt;&lt;br /&gt;You could also use split, as &lt;a href="http://stackoverflow.com/users/24337/john-wagenleitner"&gt;John Wagenleitner&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/1307919/using-variables-in-xmlslurpers-gpath"&gt;suggested&lt;/a&gt; in response to my comment on his answer on StackOverflow:&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow:auto;"&gt;def xmltxt = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;lt;file&amp;gt;&lt;br /&gt;  &amp;lt;something&amp;gt;&lt;br /&gt;    &amp;lt;record name=&amp;quot;some record&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;record name=&amp;quot;some other record&amp;quot; /&amp;gt;&lt;br /&gt;  &amp;lt;/something&amp;gt;&lt;br /&gt;&amp;lt;/file&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;def xml = new XmlSlurper().parseText(xmltxt)&lt;br /&gt;String foo = "something.record"&lt;br /&gt;&lt;br /&gt;def aNode = xml&lt;br /&gt;foo.split("\\.").each {&lt;br /&gt;  aNode = aNode."${it}"&lt;br /&gt;}&lt;br /&gt;return aNode.size()&lt;/pre&gt;&lt;br /&gt;My thanks to you both.&lt;br /&gt;&lt;br /&gt;After talking with Josh, I understand why the Groovy people had to do what they did. Dots (.) are still legal in XML &lt;a href="http://www.w3schools.com/XML/xml_elements.asp"&gt;element names&lt;/a&gt;, as long as the name doesn't start with a dot. (Actually, other punctuation is allowed as well, though it is not recommended). I don't think they could use forward slashes as XPath does because of how Groovy has overloaded the operators and dots had to be allowable, so this is what we're stuck with. Maybe they should have used spaces instead, since those aren't legal in element names. I don't know the impact this would have on other classes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-953183987254365753?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/953183987254365753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/not-so-answered-variables-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/953183987254365753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/953183987254365753'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/not-so-answered-variables-in.html' title='The Not So Answered Variables in GPathResult'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1894985000328099817</id><published>2009-09-11T15:07:00.000-04:00</published><updated>2009-09-11T15:07:35.113-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='admin'/><category scheme='http://www.blogger.com/atom/ns#' term='me'/><title type='text'>So, Why The Name?</title><content type='html'>Thought I would give credit where credit is due. I'm not a terribly creative person, if someone else has something creative I can use, I'll most likely rip it off.  'Witty Keegan' is one of the nicknames bestowed upon me by my friend and college roommate, Vitus Pelsey. ('Keegasaurus' being one of the others). I thought a pun would make for a good blog title, while giving a false impression of witticism and intelligence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1894985000328099817?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1894985000328099817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/so-why-name.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1894985000328099817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1894985000328099817'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/so-why-name.html' title='So, Why The Name?'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1078865640404684754</id><published>2009-09-11T14:45:00.004-04:00</published><updated>2010-05-21T14:04:47.176-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Bad GString!  Bad!  --- Wait, My Bad</title><content type='html'>I was trying to write a test for a method that inserted some stuff into a StringBuilder that was modified as a GString and was frustrated to find that my stubbed method was never called!&lt;br /&gt;&lt;br /&gt;Initially I got mad, blamed Groovy for making my life more difficult with its ridiculous automagical boxing. Then Josh pointed out that &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html"&gt;StringBuilder&lt;/a&gt; is actually a &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/CharSequence.html"&gt;CharSequence&lt;/a&gt;. It's not a Groovy thing, I'm just dumb.  Fire up your GroovyConsole and observe:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:groovy; wrap-lines:false"&gt;StringBuilder.metaClass.insert = {int arg0, Object arg1 -&amp;gt;&lt;br /&gt;  println "FOOO"&lt;br /&gt;}&lt;br /&gt;StringBuilder.metaClass.insert = {int arg0, String arg1 -&amp;gt;&lt;br /&gt;  println "BARR"&lt;br /&gt;}&lt;br /&gt;StringBuilder.metaClass.insert = {int arg0, CharSequence arg1 -&amp;gt;&lt;br /&gt;  println "I'M HERE!!!"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;StringBuilder sb = new StringBuilder()&lt;br /&gt;def foo = "ROGER"&lt;br /&gt;def bar = "$foo"&lt;br /&gt;sb.insert 0, bar&lt;/pre&gt;The result is "I'M HERE!!!".  All I had to do was stub the &lt;b&gt;right&lt;/b&gt; method.&lt;br /&gt;&lt;br /&gt;If you're experiencing String vs GString issues, like I &lt;i&gt;thought&lt;/i&gt; I was, you may find &lt;a href="http://insidethemachine.wordpress.com/2008/11/17/groovy-strings-n-things/"&gt;this&lt;/a&gt; helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1078865640404684754?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1078865640404684754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/bad-gstring-bad-wait-my-bad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1078865640404684754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1078865640404684754'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/bad-gstring-bad-wait-my-bad.html' title='Bad GString!  Bad!  --- Wait, My Bad'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5504426102688253595</id><published>2009-09-11T11:13:00.008-04:00</published><updated>2009-09-14T21:45:17.068-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Integration Tests Are a Scam?</title><content type='html'>I recently listened to a talk given by J. B. Rainsberger (author of &lt;a href="http://www.manning.com/rainsberger/"&gt;JUnit Recipes&lt;/a&gt;) with the title &lt;a href="http://www.infoq.com/presentations/integration-tests-scam"&gt;Integration Tests Are a Scam&lt;/a&gt; (summary notes &lt;a href="http://b-speaking.blogspot.com/search/label/integration%20tests"&gt;here&lt;/a&gt;). If the idea seems crazy, blame the fact that he's from Canada ;) These are some quick thoughts I had, I may expand on them later.&lt;br /&gt;&lt;br /&gt;Here's some definitions he gives:&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;Basic Correctness&lt;/dt&gt;&lt;dd&gt;"Given the myth of perfect technology, do we compute the right answer?"&lt;/dd&gt;&lt;dt&gt;Myth of Perfect Technology&lt;/dt&gt;&lt;dd&gt;"Assuming we can use an arbitrary large amount of memory, for an arbitrary amount of time, on a Turing machine for spherical people[...]"&lt;/dd&gt;&lt;dt&gt;Integration Tests&lt;/dt&gt;&lt;dd&gt;"...any test whose result (pass or fail) depends on the correctness of the implementation of more than one piece of non-trivial behavior."&lt;/dd&gt;&lt;/dl&gt;"You should never need to write an integration test to show basic correctness." He believes our largest problems lie in basic correctness. After we get this right, then we can worry about issues of performance, security, etc. The question of basic correctness is where he focuses his efforts. (He paraphrases a quote I believe based on the &lt;a href="http://en.wikipedia.org/wiki/Pareto_principle"&gt;Pareto Principle&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Downsides of integration testing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Intergration tests are slow&lt;/li&gt;&lt;li&gt;Integration tests don't tell you where the failure occurred (may be difficult to find even with debugger, assuming TDD hasn't caused you to forget how to use one)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In order to have enough tests at the integration level to test thoroughly, the number of tests that need to be written increases combinatorially, based on code paths&lt;/li&gt;&lt;li&gt;There is a lot of duplication in test setup&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now, it should be noted that he is not talking about acceptance tests. He says that acceptance tests tend to be end-to-end, and that is OK. But end-to-end tests should not be used for developer tests. He is also not altogether against integration tests for finding bugs, he just doesn't want them permanently added to the project. Bugs found through an integration test should create new object tests. "I don’t doubt the necessity of integration tests. I depend on them to solve difficult system-level problems. By contrast, I routinely see teams using them to detect unexpected consequences, and I don’t think we need them for that purpose. I prefer to use them to confirm an uneasy feeling that an unintended consequence lurks."&lt;br /&gt;&lt;br /&gt;Instead, he recommends 'collaboration tests' (commonly called 'interaction tests') and 'contract tests'. By collaboration tests, he means to stubbing out or mocking the collaborators to isolate functionality and make sure all the ways it can interact with collaborators behave as expected. This is 1/2 of the work (and actually the easier 1/2). You've checked if you've asked the right questions and able provide an answer for all the responses.&lt;br /&gt;The missing piece (that commonly causes people to rely on integration tests) is a misunderstanding between the interaction of piece in question and its collaborators.&lt;br /&gt;&lt;br /&gt;The second 1/2 is 'contract tests'. The first of the two checks on the other side of the interface is whether the collaborator able to provide a response when "the star" (Class in Test CIT) asks for it (is it implemented? can it handle the request in the first place?). The second is whether the the collaborator responds in the way the CIT is expecting. "A contract test is a test that verifies whether the implementation respects the contract of the interface it implements." There should be a contract test for every case we send the collaborator and every case the collaborator might send back. Again this will using stubbing and mocking. The advantage of this approach is that you know when you have enough tests (two for each behavior). I've tried to diagram the idea thusly:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_z8scSW9cOxE/SqpdsivfXHI/AAAAAAAABYM/n_5-mhyao5k/s1600-h/testing.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_z8scSW9cOxE/SqpdsivfXHI/AAAAAAAABYM/n_5-mhyao5k/s400/testing.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;He claims that if you ask these questions between every two services and focus on basic correctness, we can be "arbitrarily confident" in the correctness. The number of tests increases additively instead of combinatorially and is easier to maintain, with less duplication, and faster to run. If something goes wrong, you are either missing a collaboration test or missing a contract test or the tests do not agree. This makes troubleshooting easier. As of yet, there is no automated way of testing that every collaboration test has a matching contract test.&lt;br /&gt;&lt;br /&gt;When I saw the title of the talk, I initially reacted rather violently against the notion. I'm still not sure if I'm 100% behind it, but I think there are some good points raised about integration tests and their utility. However, as Dan Fabulich points out in a reply to a &lt;a href="http://www.jbrains.ca/permalink/278"&gt;response&lt;/a&gt; Rainsberger gave to a &lt;a href="http://www.infoq.com/presentations/integration-tests-scam#view_47627"&gt;comment&lt;/a&gt; about a Mars rover failure, figuring out that you are missing a test may not come easily.&lt;br /&gt;&lt;blockquote&gt;"The ability to notice things" is high magic. If you have that, you can find/fix any bug without any tests... why don't we all just "notice" our mistakes when writing production code? In this case you're just using intuition to notice a missing test, but that's no easier than noticing bugs.&lt;br /&gt;&lt;br /&gt;As you know, I share your view that integration tests are tricky, in the sense that writing one tempts you into writing two, where instead you should be writing more isolated unit tests. But unit tests have the opposite problem: once you have some unit tests, it's too easy to assume that no more testing is necessary, because your unit tests have covered everything. By exaggerating the power of unit tests and the weakness of integration tests, you may be doing more harm than good.&lt;br /&gt;&lt;br /&gt;Imagine you're actually coding this. You just finished writing testDetachingWhileLanded and testDetachingWhileNotLanded. (It was at this point in your story that you first began to "notice" that a test was missing.) You go back over the code and find you have 100% branch coverage of the example application. Your unit tests LOOK good enough, to a superficial eye, to an ordinary mortal. But you're still missing a critical test. How are you supposed to just "notice" this?&lt;br /&gt;&lt;br /&gt;More generally, how are you supposed to build a habit or process that notices missing tests *in general*?&lt;br /&gt;&lt;br /&gt;I've got just the habit: write all the unit tests you can think of, and then, if you're not sure you've got enough unit tests, do an integration test. You don't even necessarily have to automate it; just try it out once, in real life, to see if it works. If your code doesn't work, that will help you find more unit tests to write. If it does work, don't integration-test every path; you were just double-checking the quality of your unit tests, after all."&lt;/blockquote&gt;&amp;lt;edit&amp;gt;&lt;br /&gt;While I wouldn't go so far as calling it 'magic', finding all the edge cases can be difficult and may require a fair amount of knowledge about the collaborator. Rainsberger later commented that his method of ensuring every condition is tested is&lt;br /&gt;&lt;blockquote&gt;Every time I stub a method, I say, "I have to write a test that expects the return value I've just stubbed." I use only basic logic there: if A depends on B returning x, then I have to know that B can return x, so I have to write a test for that. &lt;br /&gt;&lt;br /&gt;Every time I mock a method, I say, "I have to write a test that tries to invoke that method with the parameters I just expected." Again, I use only basic logic there: if A causes B to invoke c(d, e, f) then I have to know that I've tested what happens when B invokes c(d, e, f), so I have to write a test for that.&lt;/blockquote&gt;&lt;br /&gt;Dan Fabulich suggests adding either "&lt;i&gt;Every time I stub a method that can raise an exception, I have to stub it again with a test that expects the exception&lt;/i&gt;" or "&lt;i&gt;Every time I stub a method to return X, I also have to write a test where the stub returns Y. And Z. For all possible return values of the method.&lt;/i&gt;" Of course, it's impossible (or at least very difficult) to be sure you've gotten all edge cases.&lt;br /&gt;&lt;br /&gt;My takeaway from all this is that integration tests are overused, often perhaps as a half-baked attempt to remedy poor unit tests (even though the two different tests try to solve different problems). While I'm not quite ready to do away with integration tests entirely (I think they provide a useful documentation of examples of use without going into the nitty gritty details of a unit test and make a nice supplement to unit tests), I think one should recognize their place: performance testing, and as general review. NOT for finding bugs or ensuring changes didn't break anything and certainly not for finding where they occurred. One should add them as a separate module that is only built when requested, or using something like the &lt;a href="http://mojo.codehaus.org/failsafe-maven-plugin/"&gt;FailSafe&lt;/a&gt; plugin for Maven.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/edit&amp;gt;&lt;br /&gt;&lt;br /&gt;One idea that he mentions early on in the talk is the idea of having only one assert per test. This is something I'm occasionally guilty of (especially if the method being tested does several things). This should be a testing smell that may indicate the need for some refactoring.&lt;br /&gt;&lt;br /&gt;He also mentions what first got him interested in TDD, which I thought was one of the most compelling reasons I've heard so far to use TDD. When you don't use TDD you have a seemingly endlessly depressing cycle of writing tests, fixing bugs, writing more tests, and so on...how do you know when you're finished? When you do TDD, it has a bit more definitive ending point:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Think about what you want to do &lt;/li&gt;&lt;li&gt; Think about how to test it &lt;/li&gt;&lt;li&gt; Write a small test. Think about the desired API &lt;/li&gt;&lt;li&gt; Write just enough code to fail the test &lt;/li&gt;&lt;li&gt; Run and watch the test fail. (The test-runner, if you're using something like JUnit, shows the "Red Bar"). Now you know that your test is going to be executed &lt;/li&gt;&lt;li&gt; Write just enough code to pass the test (and pass all your previous tests) &lt;/li&gt;&lt;li&gt; Run and watch all of the tests pass. (The test-runner, if you're using JUnit, etc., shows the "Green Bar"). If it doesn't pass, you did something wrong, fix it now since it's got to be something you just wrote &lt;/li&gt;&lt;li&gt; If you have any duplicate logic, or inexpressive code, refactor to remove duplication and increase expressiveness -- this includes reducing coupling and increasing cohesion &lt;/li&gt;&lt;li&gt; Run the tests again, you should still have the Green Bar. If you get the Red Bar, then you made a mistake in your refactoring. Fix it now and re-run &lt;/li&gt;&lt;li&gt; Repeat the steps above until you can't find any more tests that drive writing new code &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;(from the &lt;a href="http://c2.com/cgi/wiki?TestDrivenDevelopment"&gt;C2 wiki&lt;/a&gt;)&lt;br /&gt;I like that. This would help address my &lt;a href="http://wittykeegan.blogspot.com/2009/09/unit-testing-mein-kampf.html"&gt;previously mentioned&lt;/a&gt; fear of knowing when you've tested everything. (Though I'm sure it's not foolproof).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5504426102688253595?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5504426102688253595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/integration-tests-are-scam.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5504426102688253595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5504426102688253595'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/integration-tests-are-scam.html' title='Integration Tests Are a Scam?'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z8scSW9cOxE/SqpdsivfXHI/AAAAAAAABYM/n_5-mhyao5k/s72-c/testing.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2018287735541840692</id><published>2009-09-11T05:47:00.001-04:00</published><updated>2009-12-09T08:21:05.348-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>For my next trick....I will make a DVD drive disappear</title><content type='html'>My DVD drive continues to disappear, only reappearing after a restart.  I tried updating both the bios and the chipset drivers to no avail.  Only the SATA drive disappears, the PATA drive remains.  I have a P5N7A-VM motherboard and a Pioneer DVR-216D.  I believe this to be a windows driver issue, but I don't know what I can do about it.  (I certainly won't get any help from Microsoft).  I guess I'm living with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2018287735541840692?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2018287735541840692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/for-my-next-tricki-will-make-dvd-drive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2018287735541840692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2018287735541840692'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/for-my-next-tricki-will-make-dvd-drive.html' title='For my next trick....I will make a DVD drive disappear'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1451160174713046251</id><published>2009-09-10T21:05:00.005-04:00</published><updated>2009-10-16T01:38:25.953-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>iTunes Pains (Again)</title><content type='html'>This time the upgrade to &lt;a href="http://www.downloadsquad.com/2009/09/12/itunes-9-continues-to-suck-on-windows-makes-halfhearted-attempt/"&gt;iTunes 9&lt;/a&gt; broke my beloved MediaMonkey.  I really should just use something else to get my podcasts and blow away iTunes.  I don't even have an iPod anymore and have no plans of getting an iPhone -- there's really no reason to keep this piece of trash on my hard drive.&lt;br /&gt;A work around was posted here: &lt;a href="http://www.thebitguru.com/blog/view/310-MediaMonkey%20and%20iTunes%209"&gt;http://www.thebitguru.com/blog/view/310-MediaMonkey%20and%20iTunes%209&lt;/a&gt;&lt;br /&gt;Granted, its not iTunes' fault per se, and I'm sure MediaMonkey will get it fixed soon, just damned irritating.  I didn't follow his instructions exactly...what I did was rename d_iPhone.dll to d_iPhone.dll.disabled in the MediaMonkey plugins folder in program files.&lt;br /&gt;&lt;br /&gt;EDIT: &lt;br /&gt;MediaMonkey has pushed out a beta release (a bit earlier than they were planning) that fixes compatibility with iTunes 9, only 1 day after it came out: &lt;a href="http://www.mediamonkey.com/beta/MediaMonkey_3.1.2.1267.exe"&gt;http://www.mediamonkey.com/beta/MediaMonkey_3.1.2.1267.exe&lt;/a&gt;.&amp;nbsp; It might be better to delete the file rather than rename it (if you're comfortable with that), then it will be replaced when the new installer is run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1451160174713046251?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1451160174713046251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/itunes-pains-again.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1451160174713046251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1451160174713046251'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/itunes-pains-again.html' title='iTunes Pains (Again)'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6790567069492420815</id><published>2009-09-10T12:57:00.016-04:00</published><updated>2010-05-21T14:05:17.171-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Beware of openStream</title><content type='html'>Yesterday we discovered a bug where one of our projects hung and had to be CTRL-C'd.  The culprit ended up being one line:&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;URL url = new URL("http://someurl")&lt;br /&gt;InputStream is = url.openStream()//&lt;---this one&lt;/pre&gt;The openStream method is actually shorthand for openConnection().getInputStream().  So it returns a newly instantiated URLConnection and calls getInputStream() on that.  The problem is, which the &lt;a href="http://java.sun.com/javase/6/docs/api/java/net/URLConnection.html"&gt;API&lt;/a&gt; won't tell you (but is visible in the &lt;a href="http://www.docjar.com/html/api/java/net/URLConnection.java.html"&gt;source&lt;/a&gt;) is that the default values for connectTimeout and readTimeout are 0.  This means, if the connection/read fails, it will continue to try to connect/read forever.  While we tested for the connection to be good before we began processing, getting from a URL caused it to hang when the service went down in the middle of processing.The solution was mentioned in &lt;a href="http://stackoverflow.com/questions/644856/how-do-i-test-the-availability-of-the-internet-in-java"&gt;this&lt;/a&gt; StackOverflow question.  The solution lies in not creating the InputStream from URL, but from URLConnection and setting the timeouts:&lt;pre class="brush:java; wrap-lines:false"&gt;int timeoutMS = 5000 // 5 secs&lt;br /&gt;try {&lt;br /&gt;  URL url = new URL("http://someurl")&lt;br /&gt;  URLConnection conn = url.openConnection();&lt;br /&gt;  conn.setConnectTimeout(timeoutMs);&lt;br /&gt;  conn.setReadTimeout(timeoutMs);&lt;br /&gt;  InputStream is = conn.getInputStream();&lt;br /&gt;} catch (java.net.UnknownHostException uhe) {&lt;br /&gt;    // something useful here&lt;br /&gt;} catch (java.net.SocketTimeoutException ste) {&lt;br /&gt;    // something useful here&lt;br /&gt;}&lt;/pre&gt;Eric has &lt;a href="http://ericmaxwell.blogspot.com/2009/09/youre-in-timeout.html"&gt;posted&lt;/a&gt; about this as well (it was his project we learned this from).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6790567069492420815?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6790567069492420815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/beware-of-openstream.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6790567069492420815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6790567069492420815'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/beware-of-openstream.html' title='Beware of openStream'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5886175163641500734</id><published>2009-09-04T22:41:00.012-04:00</published><updated>2009-10-15T21:26:06.283-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Unit Testing: Mein Kampf</title><content type='html'>So, over the last 1.5 weeks or so I've been having a bit of an identity crisis with unit tests.  Sure, I got the basic idea of writing tests for each method in college but like most never used it much while in school.  Now that I'm at OCLC and unit testing is expected, I'm trying to develop my own philosophy on the matter and get a feel for it.&lt;br /&gt;&lt;br /&gt;I felt like I should bring code coverage up on the project I was working on, but for purely religious reasons.  Now, granted, this project is heavy in IO (it's the same project I mentioned &lt;a href="http://wittykeegan.blogspot.com/2009/08/integration-testing.html"&gt;previously&lt;/a&gt;).  So perhaps I'd see less benefit from unit tests on this project than others, but despite the fact I now have &amp;gt;70% coverage (up from 0%), I haven't found a single bug by using unit tests, only with integration tests.  The results might also have been different had I used TDD or my home-brewed syncretic &lt;a href="http://wittykeegan.blogspot.com/2009/08/test-oriented-development.html"&gt;TOD&lt;/a&gt; approach.&lt;br /&gt;&lt;br /&gt;Despite these facts, I don't argue that Unit Testing used with &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;CI&lt;/a&gt; can help as a tool for preventing software regressions and as up-to-date documentation for the code (though I still don't find it a very natural read except for &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;BDD&lt;/a&gt; approaches like &lt;a href="http://www.easyb.org/"&gt;EasyB&lt;/a&gt;).  It's also useful for finding the root cause of a problem.  Whereas an integration test might only be able to say "something blew up" a unit test might be able to tell "here is what blew up".  However, the value of the unit tests I've created I think remains to be seen.  Meanwhile, it did deliver value as a learning platform.&lt;br /&gt;&lt;br /&gt;Groovy has served as an excellent &lt;a href="http://groovy.codehaus.org/Testing+Guide"&gt;testing platform&lt;/a&gt; for me.  This particular project was written in Groovy, but I think this would work well with Java projects as well (there is, however, the slight overhead of the additional dependency).  I was able to do everything I wanted (still a few kinks to work out) with stubbing using the wonderful, magical, &lt;a href="http://groovy.codehaus.org/ExpandoMetaClass"&gt;ExpandoMetaClass&lt;/a&gt;.  There are a few tests I have yet to do where I may have to use their &lt;a href="http://groovy.codehaus.org/Using+MockFor+and+StubFor"&gt;mocking framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A couple gotchas:&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow:auto;"&gt;// getters cannot be overridden using just the property name, even though they can be called that way&lt;br /&gt;class Foo {&lt;br /&gt;  int bar&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Foo.metaClass.getBar {-&amp;gt;&lt;br /&gt;  return 44&lt;br /&gt;}&lt;br /&gt;foo1 = new Foo()&lt;br /&gt;assert foo1.bar == 44  // this passes&lt;br /&gt;&lt;br /&gt;GroovySystem.metaClassRegistry.removeMetaClass Foo&lt;br /&gt;Foo.metaClass.bar {-&amp;gt;&lt;br /&gt;  return 42&lt;br /&gt;}&lt;br /&gt;Foo foo1 = new Foo()&lt;br /&gt;assert foo1.bar == 42  // this does not&lt;/pre&gt;&lt;br /&gt;I wanted to send some precanned input to a method that uses BufferedReader to get its input.  The constructor from it eventually constructs a File to get the data.  I can't extend File or create a new interface with all the File stuff for a test, because that would require modifying BufferedReader and Reader classes to match these changes.  I've not found a way around this.&lt;br /&gt;&lt;br /&gt;Another problem was a method that takes a String path of a file that contains filepaths of input files to process and adds the string and a BufferedReader to that file to a collection (not sure why that decision was made).  So, I tried to mock out eachline().  But there is a problem...&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow:auto;"&gt;// you cannot metaclass constructors, therefore, this code doesn't work. I've still got to figure out a way of faking a file, since File cannot use map coercion because it has no default constructor&lt;br /&gt;String aPath = "a/path/to/file"&lt;br /&gt;String fakeData = "some\nfake\nstuff\n"&lt;br /&gt;&lt;br /&gt;File.metaClass.init {String filePath -&amp;gt;&lt;br /&gt;  def mock = [eachLine: {return "${fakeData}"}, exists: {return true}] as File&lt;br /&gt;  return mock&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;File f = new File(aPath)  // doesn't work&lt;/pre&gt;&lt;br /&gt;There are still some larger questions I have that maybe I'll never get THE ANSWER to.  One question in particular I've been struggling with is &lt;a href="http://junit.sourceforge.net/doc/faq/faq.htm#best_3"&gt;"How simple is too simple to break?"&lt;/a&gt;  The JUnit authors suggest this is a never-ending source of pain:&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow:auto;"&gt;becomeTimidAndTestEverything&lt;br /&gt;while writingTheSameThingOverAndOverAgain&lt;br /&gt;    becomeMoreAggressive&lt;br /&gt;    writeFewerTests&lt;br /&gt;    writeTestsForMoreInterestingCases&lt;br /&gt;    if getBurnedByStupidDefect&lt;br /&gt;        feelStupid&lt;br /&gt;        becomeTimidAndTestEverything&lt;br /&gt;    end&lt;br /&gt;end&lt;/pre&gt;And it's still very easy for me to lose sight of what I'm actually testing in the midst of all the mocking, stubbing, and so forth.  More than a few times this last week I've looked down and realized that what I've written is so paranoid that it is really testing stuff that can only fail if the compiler or JVM fails or cosmic rays come down and change my data.&lt;br /&gt;&lt;br /&gt;Just as important as making sure your tests pass is making sure they fail.  I struggled with this the most when I started this process.  I thought "wonderful, everything works."  When it turns out that the code didn't work quite the way I thought it did and my tests were actually written in such a way that they would NEVER fail.  All those green bars might not actually &lt;a href="http://www.ibm.com/developerworks/java/library/j-cq01316/"&gt;mean much&lt;/a&gt;.  That't not to say they're worthless, just maybe not as valuable as you might initially think.&lt;br /&gt;&lt;br /&gt;And this leads to my greatest fear: How do you know when something is thoroughly tested?  And can some sort of confidence be associated with your tests?  Clearly, code coverage doesn't cut it.  I'm still new to all this, but I'm not taking much comfort from unit tests.  I feel a bit better when integration tests return exactly the result I'm expecting and I test several possible scenarios.  Still, even with this, you cannot test all possible scenarios and when do you know you've got enough?  I guess when something blows up and you didn't find it.  (&amp;gt;_&amp;lt;)&lt;br /&gt;&lt;br /&gt;P.S. by 'Mein Kampf' I just meant the literal 'my struggle' it has nothing to do with Hitler or his work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5886175163641500734?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5886175163641500734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/unit-testing-mein-kampf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5886175163641500734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5886175163641500734'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/unit-testing-mein-kampf.html' title='Unit Testing: Mein Kampf'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1608382972083068044</id><published>2009-09-04T21:44:00.002-04:00</published><updated>2009-09-11T05:48:00.555-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>iTunes Blows</title><content type='html'>iTunes blows, but we all knew that.  The latest chapter in the suckage occurred when I deleted UppperFilters from HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318} in an attempt to solve my problem of the disappearing cd drive (it didn't).  Instead iTunes lost the ability to write CDs, not something I really care about since I only use iTunes for podcasts now anyway, but the stupid error was kinda annoying.  The message said to reinstall iTunes, yet neither a repair install nor uninstalling then reinstalling fixed the issue, even after I manually created the key.  Apperantly there are some &lt;a href="http://www.gearsoftware.com/support/drivers/index.cfm"&gt;magic&lt;/a&gt; drivers in use by iTunes that their support site will tell you nothing about.  I finally got it fixed.  My thanks to &lt;a href="http://www.whatralphknows.com/2004/08/i-fixed-the-registry-settings.html"&gt;Ralph&lt;/a&gt; and Google.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1608382972083068044?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1608382972083068044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/itunes-blows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1608382972083068044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1608382972083068044'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/itunes-blows.html' title='iTunes Blows'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6295936380432279032</id><published>2009-09-04T08:36:00.002-04:00</published><updated>2009-09-04T08:36:25.851-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>The Obvious</title><content type='html'>Read a quote yesterday I rather enjoyed:&lt;br /&gt;&lt;br /&gt;by C.A.R. Hoare&lt;br /&gt;There are two ways of creating a software design. One way is to make it so&lt;br /&gt;simple that there are obviously no deficiencies. And the other way is to&lt;br /&gt;make it so complicated that there are no obvious deficiencies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6295936380432279032?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6295936380432279032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/obvious.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6295936380432279032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6295936380432279032'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/09/obvious.html' title='The Obvious'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-638183466161570396</id><published>2009-08-28T16:48:00.003-04:00</published><updated>2010-05-21T14:08:21.413-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Why My GroovyConsole Wouldn't Open</title><content type='html'>For a few weeks now, I've been wondering why I couldn't launch the pretty version of GroovyConsole on my home computer, but could on my work computer.  It turns out this is a bug: &lt;a href="http://jira.codehaus.org/browse/GROOVY-3655"&gt;http://jira.codehaus.org/browse/GROOVY-3655&lt;/a&gt;.  Groovy needs the 32 bit JDK to launch.  Nore more batch hack, I can now launch the GroovyConsole.exe directly.  (Though they still haven't built this for the updated versions -- I assume they're holding off for the 1.7 release).&lt;br /&gt;&lt;br /&gt;Problem was, at work I need to use HermesJMS which needs JAVA_HOME to be the 64 bit version (doesn't make sense, but it works).  What to do?  Fortunately, HermesJMS uses a batch file for its invocation, so just add&lt;br /&gt;&lt;pre class="brush:shell; wrap-lines:false"&gt;JAVA_HOME=C:\Progra~2\Java\jdk1.6.0_16&lt;/pre&gt;to line 23 (or anywhere in the beginning, really).  Done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-638183466161570396?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/638183466161570396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/why-my-groovyconsole-wouldnt-open.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/638183466161570396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/638183466161570396'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/why-my-groovyconsole-wouldnt-open.html' title='Why My GroovyConsole Wouldn&apos;t Open'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2086185122951655652</id><published>2009-08-27T00:11:00.006-04:00</published><updated>2009-10-15T21:51:51.865-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Answered: Using variables in XmlSlurper’s GPath</title><content type='html'>Yesterday I asked &lt;a href="http://stackoverflow.com/questions/1307919/using-variables-in-xmlslurpers-gpath"&gt;this&lt;/a&gt; question about using variables with XmlSlurper.  I got an answer that works (although I don't see it anywhere in the documentation or the book &lt;a href="http://www.amazon.com/Groovy-Action-Dierk-Koenig/dp/1932394842"&gt;Groovy in Action&lt;/a&gt;.  Below is the example the answerer gave.&lt;code&gt;&lt;br /&gt;&lt;pre class="prettyprint lang-java" style="overflow:auto;"&gt;def xmltxt = """&lt;br /&gt;&amp;lt;file&gt;&lt;br /&gt;&amp;lt;record name="some record" /&gt;&lt;br /&gt;&amp;lt;record name="some other record" /&gt;&lt;br /&gt;&amp;lt;/file&gt;&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;def xml = new XmlSlurper().parseText(xmltxt)&lt;br /&gt;String foo = "record"&lt;br /&gt;return xml."${foo}".size()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2086185122951655652?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2086185122951655652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/answered-using-variables-in-xmlslurpers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2086185122951655652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2086185122951655652'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/answered-using-variables-in-xmlslurpers.html' title='Answered: Using variables in XmlSlurper’s GPath'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4463847137121655506</id><published>2009-08-26T22:34:00.001-04:00</published><updated>2009-08-26T22:35:12.566-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Test Oriented Development</title><content type='html'>The other day I had an idea.  Probably a bad idea, but its something I feel more comfortable with than diving straight into &lt;a href="http://en.wikipedia.org/wiki/Test_driven_development"&gt;TDD&lt;/a&gt;.  The rules are&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You are encouraged to write the test first, but are not forced to.&lt;/li&gt;&lt;li&gt;You may not write more than one method without a test.&lt;/li&gt;&lt;/ol&gt;This way, you write tests as you are writing code, you might write all your test first, but you will never write too much code that isn't tested (assuming you don't cram it all into one gigantic, godlike method).  I dub it TOD (Test Oriented Development).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4463847137121655506?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4463847137121655506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/test-oriented-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4463847137121655506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4463847137121655506'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/test-oriented-development.html' title='Test Oriented Development'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-9153371762105371910</id><published>2009-08-26T22:30:00.000-04:00</published><updated>2009-08-26T22:30:29.658-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>GW2 Trailer</title><content type='html'>ArenaNet has released their first trailer for Guild Wars 2 here: &lt;a href="http://www.guildwars2.com/"&gt;http://www.guildwars2.com/&lt;/a&gt;&lt;br /&gt;I'm pleased to see that progress is being made.  However, I do have to admit a little disappointment at the graphics.  Although GW2 is supposed to use DX10, it doesn't look any different than the first GW (not that it's bad).  I really didn't like the first part of the movie where they gave movement to their concept art.  Made it look like construction paper glued to straws as puppets.  I don't if this was a stylistic decision or their way of combating a lack of content (though my guess is the former).  I'm sure the graphics will probably change before its final appearance.&lt;br /&gt;&lt;br /&gt;One thing that definitely was a stylistic decision that disgusted me more than anything was how they made the Asura look.  They were already too cutesied up in GW1 (especially compared to the &lt;a href="http://wiki.guildwars.com/images/a/a6/GWXPostUno008.jpg"&gt;concept art&lt;/a&gt;), now they look like some kind of anime character.  That was one thing we all love about GW art was that it was fairly realistic, not the cartoonish fantasies of WoW.  PLEEEZ, don't change this ANet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-9153371762105371910?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/9153371762105371910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/gw2-trailer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/9153371762105371910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/9153371762105371910'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/gw2-trailer.html' title='GW2 Trailer'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2415151977745383911</id><published>2009-08-21T00:45:00.004-04:00</published><updated>2009-09-11T10:47:06.999-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Integration Testing</title><content type='html'>My colleagues and I have been learning a lot about testing this week.  One of my friends' thoughts are &lt;a href="http://insidethemachine.wordpress.com/2009/08/19/integrating-unit-tests/"&gt;here&lt;/a&gt;.  He asks the question of whether it is a unit test if the method in question calls other methods.  I agree with him and would argue that no, it is not, since the culprit is unclear if the method fails (until you go into debugger).  Arguably, this could be worst for code that is properly refactored.  This is something I don't think &lt;a href="http://en.wikipedia.org/wiki/Code_coverage"&gt;code coverage&lt;/a&gt; &lt;a href="http://cobertura.sourceforge.net/"&gt;tools&lt;/a&gt; will help you recognize.&lt;br /&gt;StackOverflow has some good definitions of unit and integration testing &lt;a href="http://stackoverflow.com/questions/557409/if-a-project-has-100-unit-test-coverage-are-integration-tests-still-needed"&gt;here&lt;/a&gt;, &lt;a href="http://stackoverflow.com/questions/516572/am-i-unit-testing-or-integration-testing"&gt;and here&lt;/a&gt;.  I like &lt;a href="http://www.michaelfeathers.com/"&gt;Michael Feathers&lt;/a&gt;' definition:&lt;br /&gt;A test is not a unit test if:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It talks to the database&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It communicates across the network&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It touches the file system&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It can’t run at the same time as any of your other unit tests&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You have to do special things to your environment (such as editing config files) to run it&lt;/li&gt;&lt;/ul&gt;Josh Brown, a colleague of mine, also suggests adding:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the code under test uses an external framework or library (Hibernate, Spring, some internal library, etc.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the code under test calls other methods (that you didn't mock)&lt;/li&gt;&lt;/ul&gt;I wholeheartedly agree with both of these.&lt;br /&gt;&lt;br /&gt;I had a case that was interesting to me.  I was working on some code that I've become the caretaker of to get it better tested (a good thing too, as a bug was discovered).  The project takes big files and chunks them into smaller files.  It handles any xml or delimited file.  The way I was testing it was to take different types of files, chunk them then merge them and make sure the record counts stayed the same.  This isn't really (even if I had more granular asserts) a unit test.  It relies on an external resource (the sample files) and involves multiple methods.  Someone else &lt;a href="http://www.jroller.com/hgilani/entry/loading_resources_from_classpath_the"&gt;suggested&lt;/a&gt; unit tests using files loaded through classpath, which I disagreed with since they're not really unit tests.  Those File objects should be mocked (or possibly stubbed if using Groovy).&lt;br /&gt;&lt;br /&gt;I did attempt to make these an integration test with &lt;a href="http://mojo.codehaus.org/failsafe-maven-plugin/"&gt;FailSafe&lt;/a&gt;.  I decided against this when I figured out that I could not override the behavior to not run the integration test on deploys.  In my opinion, these should not be run on deploy, integration-test should be later in the Maven lifecycle.  The reason for this is that deploys are often done across different environments and the whole idea with integration tests is that they depend on external resources.  An example of this is a project my friend is working on, which works with the dev database, where it would be fine to run the integration tests on deploy, but when it is deployed to prod, we definitely don't want to modify our production database as part of running tests.  To continue to be able to access the QA environment or dev environment would mean adding special firewall rules.  What's more, when I set the configuration to skip the tests, it ran the tests anyway (maybe this is why it's alpha?).  According to their documentation, it shouldn't have even run the unit tests.  I just don't feel quite comfortable deploying something so young and apparently unstable into production code.  Maybe someday this will change.  There are some other suggestions &lt;a href="http://olemortenamundsen.wordpress.com/2009/07/22/strategies-for-separating-unit-and-integration-tests-using-maven-eclipse-idea-cobertura/"&gt;here&lt;/a&gt;.  The &lt;a href="http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing"&gt;page&lt;/a&gt; he links to from Codehaus states that there are rumors of a future version of Maven supporting integration tests with a src/it/java and its own integration-test phase.  Its kinda surprising that with so many organizations using &lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;continuous integration&lt;/a&gt; and it not being something all that new.&lt;br /&gt;&lt;br /&gt;In the end, I decided to do what others have done, which is to have the integration tests in a separate module that is only built if the argument is passed for it.&lt;br /&gt;The parent pom should have&lt;br /&gt;&lt;pre&gt;&amp;lt;profiles&amp;gt;&lt;br /&gt;&amp;lt;profile&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;integration-testing&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;activation&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;it&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/activation&amp;gt;&lt;br /&gt;&amp;lt;modules&amp;gt;&lt;br /&gt;&amp;lt;module&amp;gt;sampleProject-integration&amp;lt;/module&amp;gt;&lt;br /&gt;&amp;lt;/modules&amp;gt;&lt;br /&gt;&amp;lt;/profile&amp;gt;&lt;br /&gt;&amp;lt;/profiles&amp;gt;&lt;br /&gt;&lt;/pre&gt;Also, do not list it in the modules section.  This way, the integration module will only be built (and the associated surefire tests run) when the -Dit argument is present.  I think for most projects, this makes sense for most projects, though I'm still a little torn on the issue.  While Failsafe lets you still build even if the integration test fails, doesn't this defeat the purpose of continuous integration?  This is especially the case if your integration tests depend on resources that may be going up and down all the time, it doesn't make much sense to run something every time if half the time you just ignore the results anyway.  I also wonder how practical this is for organizations that have resources on multiple subnets, where a deploy from one environment to another can result in failed integration tests not because of any problem with the code, but because of a technical failure.&lt;br /&gt;&lt;br /&gt;The next part (and for me, the harder part) will be mocking out (and maybe stubbing with Groovy's metaclass) the pieces needed so I can isolate the methods in the classes for unit tests, as there currently aren't any for this project.  I'll post any interesting results I get from that.  For other initiates, such as myself, I've found this article helpful: &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;http://martinfowler.com/articles/mocksArentStubs.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2415151977745383911?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2415151977745383911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/integration-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2415151977745383911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2415151977745383911'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/integration-testing.html' title='Integration Testing'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-16646905610184462</id><published>2009-08-18T19:12:00.004-04:00</published><updated>2009-08-19T02:04:36.817-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>GW2 Update (well, sorta)</title><content type='html'>Yesterday ArenaNet put the Test Krewe page back up and gave some small hints at forthcoming GW2 news.  They've posted a shiny swf on their homepage to be: &lt;a href="http://www.guildwars2.com/"&gt;http://www.guildwars2.com/&lt;/a&gt;, created a facebook page: &lt;a href="http://www.facebook.com/GuildWars2"&gt;http://www.facebook.com/GuildWars2&lt;/a&gt;, and a twitter account: &lt;a href="http://twitter.com/guildwars2"&gt;http://twitter.com/guildwars2&lt;/a&gt;.  All indicators that they're preparing to release some news.  Probably nothing as dramatic as a date yet, but we should at least get a trailer and some concept art.  Maybe even some discussion about the professions (my prediction is that it will be the core professions from GW1 or very similar, based on the fact the shaping of the world has cut off Tyria from Cantha and Elona).&lt;br /&gt;The related GWGuru page is here: &lt;a href="http://www.guildwarsguru.com/forum/showthread.php?t=10395760"&gt;http://www.guildwarsguru.com/forum/showthread.php?t=10395760&lt;/a&gt;.  Mostly people are excited (those that haven't left the game anyway) though some other pages lurking on the internets weren't as generous.&lt;br /&gt;Am I peeing my pants excited?  No.  But as I've said, I do think little tidbits, even if they're contrived and only give the illusion of progress (which I don't think these will be) are an important part of keeping a feeling of aliveness in the community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-16646905610184462?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/16646905610184462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/gw2-update-well-sorta.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/16646905610184462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/16646905610184462'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/gw2-update-well-sorta.html' title='GW2 Update (well, sorta)'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3169111369780695524</id><published>2009-08-17T22:33:00.003-04:00</published><updated>2009-08-17T22:43:40.208-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>The Taste of Cha</title><content type='html'>I've resumed my habit of regular consumption of green tea.  Every time I do, I think of the legend of how green tea came about:&lt;br /&gt;&lt;br /&gt;Bodhidharma set about meditating for nine years facing a wall. After five years he was so sleepy that he could not keep his eyelids open and fell asleep. When he woke up he was so angry about this that he cut of his eyelids and threw them on the ground. The eyelids grew into the first green tea plants.  And from henceforth, tea has ever been the companion of monks for mediation (and apparently for geeks and programming as well).&lt;br /&gt;&lt;br /&gt;It is said that "the taste of tea (cha) and the taste of Zen (Chan) are the same".  In Japanese, the characters for 'tea' and 'eyelids' are both 'cha'.&lt;br /&gt;&lt;br /&gt;mmmmmm.....cha tastes good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3169111369780695524?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3169111369780695524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/taste-of-cha.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3169111369780695524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3169111369780695524'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/taste-of-cha.html' title='The Taste of Cha'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-1361700254243322050</id><published>2009-08-17T21:58:00.004-04:00</published><updated>2009-08-17T22:31:32.736-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='research'/><category scheme='http://www.blogger.com/atom/ns#' term='religion'/><title type='text'>The Tao of Zen</title><content type='html'>In pursuance of an ongoing 'independent research project' I am conducting, I recently 'read' (by read, I mean I took the chapters I needed to answer specific questions I had) &lt;a href="http://www.amazon.com/Tao-Zen-Ray-Grigg/dp/0785811257"&gt;The Tao of Zen&lt;/a&gt; by Ray Grigg.  Its a good book, I had to return it, but I may purchase it for myself and finish it.&lt;br /&gt;&lt;br /&gt;The question I wished to answer was 'what was the historical relationship between Buddhism and Taoism, particularly Chan and Taoism in China and how this changed when it migrated to Japan.  This book argued essentially that Zen was a convoluted form of Taoism, tainted by later Mahayana thought that felt the need to establish a historical tie to the Buddha Gautama in India and through rapid expansion it adopted practices (like zazen and the hierarchy in temples) that were antithetical to the original teachings.  He states that it is this same difference that separates the northern and southern schools in Taoism and their Japanese counterparts of Soto and Rinzai.  This will take some more research to verify.  I'm not sure how highly regarded this work is in academia, it is certainly a possibility.  However, since not a lot of written materials has survived from this period intact, I should think it is a position that is hard to verify.&lt;br /&gt;&lt;br /&gt;The gist was that Zen - Buddhism = Taoism.  While this appeals to me as someone who as adopted principles of Tao Te Ching in my own life, it is a bit too strong I think.  China's religious history (at least before the revolution, they're raised atheists now) is a syncretic one.  Taoism influence Chan (Zen in Japan) but Chan also changed Taoism.  Some of the practices, such as meditation seem to have had parallel histories.  When Buddhism first arrived in China, some believed it to be another form of Taoism, speculating that Lao Tzu must have traveled to India and now the teachings are returning.  This could explain why many of the early Buddhist texts of the period use Taoist words as the framework for understanding Buddhism (e.g. Tao in place of enlightenment, or Satori as it is called in Japan).  It's also important to note they are not in direct conflict with each other, and many people practice a combination of faiths.  It does beg the question though, for people like Alan Watts who purport to follow Zen, would it actually be more accurate to say they follow Taoism?  Alan Watts doesn't seem too concerned with the distinction from what I've read and heard from him.&lt;br /&gt;&lt;br /&gt;I am not completely satisfied with this answer, and will be seeking a more rigorous investigative report.  In the mean time, the next step in this project will be to learn the relationship between Taoism and traditional chinese folk religion and animism.  Specifically, I would like to know if there is any relationship between it and the animism of Shinto in Japan.  More to follow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-1361700254243322050?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/1361700254243322050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/tao-of-zen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1361700254243322050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/1361700254243322050'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/tao-of-zen.html' title='The Tao of Zen'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3094710974249983221</id><published>2009-08-17T21:27:00.002-04:00</published><updated>2009-08-17T21:28:55.975-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Massive EMP</title><content type='html'>I've often wondered: If a massive EMP (from a nuke or whatever) were to go off, wiping out all our technological achievements (silicon chip designs, computer languages, etc), how long would it take for us to rebuild?  Is the knowledge mostly inside us?  Or are we standing on the soldiers of giants to such an extent, we would have to invent the wheel all over again?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3094710974249983221?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3094710974249983221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/massive-emp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3094710974249983221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3094710974249983221'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/massive-emp.html' title='Massive EMP'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-198564023117842179</id><published>2009-08-17T19:54:00.001-04:00</published><updated>2009-08-17T19:55:40.433-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Skype Spam</title><content type='html'>Been getting a lot of spam contact details requests lately.  Usually more than one in a day.  What's up with that?  How do they profit from this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-198564023117842179?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/198564023117842179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/skype-spam.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/198564023117842179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/198564023117842179'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/skype-spam.html' title='Skype Spam'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4811101863568398207</id><published>2009-08-17T08:04:00.002-04:00</published><updated>2009-08-17T08:11:55.154-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Traffic Calming Ahead</title><content type='html'>I saw a sign that said "Traffic Calming Ahead" during my last shopping trip.  This morning I remembered to look up what it means since, in my mind, 'traffic calming' brings an immediate association with 'crowd pacification'.  Don't ask me why.  It turns out, its not all that exciting it's apparently just a more &lt;I&gt;polite?&lt;/I&gt; way of saying speed bumps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4811101863568398207?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4811101863568398207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/traffic-calming-ahead.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4811101863568398207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4811101863568398207'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/traffic-calming-ahead.html' title='Traffic Calming Ahead'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4863212180358144789</id><published>2009-08-16T11:35:00.000-04:00</published><updated>2009-08-16T11:35:58.253-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Substition in Java .properties</title><content type='html'>Though I ended up not using it for a project I'm working on, I was interested in using the java.util.Properties with substituted strings, as can be done in Ant and Maven.  I came across this link to XProperties: &lt;a href="http://www2.sys-con.com/ITSG/virtualcd/Java/archives/0612/mair/index.html"&gt;http://www2.sys-con.com/ITSG/virtualcd/Java/archives/0612/mair/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4863212180358144789?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4863212180358144789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/substition-in-java-properties.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4863212180358144789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4863212180358144789'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/substition-in-java-properties.html' title='Substition in Java .properties'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6164718029370127544</id><published>2009-08-14T17:12:00.003-04:00</published><updated>2009-08-14T22:43:04.314-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gaming'/><title type='text'>ArenaNet Fail</title><content type='html'>This is something that has been bugging me, and I'm sure several others over the past couple months.  ArenaNet seems to be unable to meet deadlines or even keep up with routine maintenance.&lt;br /&gt;&lt;br /&gt;The latest of ArenaNet's offenses has been the &lt;a href="http://www.guildwars.com/community/test_krewe"&gt;Test Krewe&lt;/a&gt; page.  They enlist players to play around with updates on a test server before it was pushed out to the live one.  Cool.  The problem?  Apparently they don't know how to write PHP!  Basic form validation was completely absent, people who used hard returns, too many characters, or certain punctuation broke the page.  Come on people, this is basic stuff.  They took it down until it could be fixed the same day it was up (Aug 11) and its still down.  Yet again, ANet kept the community in the dark.  While there was a post by Regina Buenaobra &lt;a href="http://www.guildwarsguru.com/forum/showthread.php?t=10394377"&gt;buried&lt;/a&gt; in Guild Wars Guru, if you navigate to the page today, you will just get the message "We're sorry, the page you requested could not be found."  How hard would it have been to put a message saying "We know this page is broke, we're fixing it".  As usual, there is no time estimate whatsoever for when the page will be back up.&lt;br /&gt;&lt;br /&gt;Another example of their apparent complete lack of even basic web dev skills was the whole Xunlai Tournament House fiasco.  The page was taken down June 23 because of problems with the distribution of the points for May.  It's now been 2 months and there is no word on its status.  There are players who still haven't gotten their points.  Another 'It'll be done when it's done' deals.&lt;br /&gt;&lt;br /&gt;GW2 news, plz.  I know, I know, everyone who plays Guild Wars would love to have some tasty morsel of information regarding Guild Wars 2 and ArenaNet doesn't want to jump the gun (though I think they already did by suggesting a beta in 2008 then reneging on it).  I think especially in the light that there won't be a beta, players would much appreciate a blog or something where once or twice a month SOMETHING is posted about GW2.  Maybe its an idea they have for a profession.  Maybe its some kind of rough sense of progress (1/2, 2/3, etc).  It doesn't have to be much.  It doesn't have to be written in stone.  Just something to let us know we aren't forgotten, and that GW2 is still making progress.&lt;br /&gt;&lt;br /&gt;While this is a problem that is not unique to Guild Wars, I'd really like to see community involvement.  Take a look at &lt;a href="http://www.guildwarsguru.com/forums"&gt;GuildWarsGuru&lt;/a&gt;, there are several threads full of ideas people have for making the sequel kickass.  Why not find a way to incorporate these in some way?  Maybe even respond to some of them?&lt;br /&gt;&lt;br /&gt;It seems to me that ANet is short-staff and/or over-tasked and anachronistic in its communication.  I know they're probably working on a tighter budget than some other game companies (though their &lt;a href="http://www.ncsoft.net/global/ir/quarterly.aspx"&gt;quarterly report&lt;/a&gt; shows increased sales (up 51%), and growth in Guild Wars), but would it really be that expensive to be more open with your customers?&lt;br /&gt;&lt;br /&gt;I'm kinda mad.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---Oh, and $20 is too much for character renames.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6164718029370127544?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6164718029370127544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/arenanet-fail.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6164718029370127544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6164718029370127544'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/arenanet-fail.html' title='ArenaNet Fail'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5705489680444732985</id><published>2009-08-13T00:37:00.003-04:00</published><updated>2009-08-14T17:15:20.642-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><title type='text'>My First iGoogle Theme</title><content type='html'>I experimented with making my own iGoogle theme&lt;br /&gt;&lt;a href="http://www.google.com/ig/directory?hl=en&amp;gl=us&amp;type=themes&amp;url=www.google.com/ig/tm%3Foutput%3Dxml%26te%3DH4sIAAAAAAAAAKXPTW6DMBAF4NPAxhXYOPxF8qKBpIsumz0yMBinJo7soVVvX6NG4gDdfXp-M_L0anVGzIiPY5pOIHF14JNBeTtowJ_EOpV6tE6DTzNKs46xVGn0KUrUn3aR3Sm5PVTEL7hgxFt2oFFW4GKC__QdVD3TeWuUeWyssqKHLzAwdg7GOAxrNCCuz60-C5FccbZOvAMoeY9H8MP-TiZnF_I2W49E38l1BvIxgzEvxNvVDXAk_74p_ICJlp2bSx2YCc5LJlkg33kQzTkUmsB87xai5qe23Qql4K9FXpWB1Z7We8qooFTW07SZib7PKK9_Af62ZK-WAQAA"&gt;here&lt;/a&gt;&lt;br /&gt;The interface they have is rather limiting (couldn't choose the color black for background) than their API, may experiment with that next.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5705489680444732985?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5705489680444732985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/igoogle-theme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5705489680444732985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5705489680444732985'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/igoogle-theme.html' title='My First iGoogle Theme'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2721135692420366545</id><published>2009-08-12T21:19:00.002-04:00</published><updated>2009-08-12T21:22:28.653-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>You left your stuff</title><content type='html'>I discovered why my bathroom sink drains so slowly this evening.  The previous renter must have been a girl with long black hair.  Diiiisssgusting.  I got what clumps I could from the top with Q-Tips, but its caked pretty thick.  I don't know what the hell she was doing, maybe she had cancer or something, its a fair amount of hair.  I don't have the wrenches to take the trap apart.  I'm going to see if I can get maintenance to do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2721135692420366545?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2721135692420366545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/you-left-your-stuff.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2721135692420366545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2721135692420366545'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/you-left-your-stuff.html' title='You left your stuff'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-5661383803444133049</id><published>2009-08-09T22:37:00.002-04:00</published><updated>2009-08-28T16:50:23.636-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emotions'/><category scheme='http://www.blogger.com/atom/ns#' term='me'/><title type='text'>Knowing Someone</title><content type='html'>This is a subject that has been on my mind for a few years now, and probably the emotion most directly responsible for my feelings of isolation from the rest of my species.  I've always wanted to really, really get to know someone.  Yet, when I think about the people I know, even those I know really well, like my family, I never feel like I know them &lt;i&gt;really&lt;/I&gt;.  When I think about knowing someone I see a face and collection of facts and behavior patterns.  I know their history, I know how they'll probably act, and to a certain degree how they think.  I may even be able to ascribe certain characteristic attributes to them.&lt;br /&gt;&lt;br /&gt;Yet I can't help wanting more.  I would like to be able to have a melding of thought and emotion, something almost spiritual in its connection.  Is that what being married is like?  I feel limited, trapped by being in physical form.  Like a stranger in my own body.  I think life as a disembodied spirit might be more amusing, as well as enlightening.  Its very strange.  Maybe I should have been born in a species of em-paths.  I think I shouldn't feel this way, that I should be happy or at least satisfied with existence as a human, yet I find it rather unfulfilling.  Fortunately, there are enough diversions and things to learn to keep it tolerable most of the time for myself.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Buddha&gt;: Existence is Dukkha.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *Keegan sighs*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Keegan&gt;: I know --- and everyone dies alone.&lt;br /&gt;&lt;br /&gt;How strange am I?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-5661383803444133049?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/5661383803444133049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/knowing-someone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5661383803444133049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/5661383803444133049'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/knowing-someone.html' title='Knowing Someone'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-3546071447267262151</id><published>2009-08-09T20:43:00.002-04:00</published><updated>2009-08-09T20:46:40.042-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Gone</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://jenden.us/storage/JD/img/why_would_you_do_that.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 292px; height: 302px;" src="http://jenden.us/storage/JD/img/why_would_you_do_that.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Somebody knocked down the robin's nest outside.  Luckily the inhabitants had already left.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-3546071447267262151?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/3546071447267262151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/gone.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3546071447267262151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/3546071447267262151'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/gone.html' title='Gone'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4453441523657088214</id><published>2009-08-07T09:07:00.012-04:00</published><updated>2010-05-21T14:07:27.540-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='mule'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy &amp; CXF JAXB</title><content type='html'>I was working on making an existing application a mule service, when I ran into the snag that Groovy classes, when exposed as an parameter to the service method, which throws an error when JAXB attempts to deserialize the object to xml (for creating the wsdl).  Every Groovy object possesses a property called metaclass that cannot be serialized because it is an interface.  At the time, I solved this problem by wrapping the Groovy stuff with Java, to expose only what I wanted.  Another way I could have done it would have been to have the Groovy class implement a Java class.&lt;br /&gt;&lt;br /&gt;I later found out a third method, when I attended a brown bag session where a colleague gave a talk about using JAXB.  Today, I found &lt;a href="http://www.predic8.com/groovy-web-services-jax-ws.htm"&gt;this&lt;/a&gt; link, which describes exactly that.  Annotations can be used to override the default JAXB behavior to exclude that messy Groovy stuff.  I haven't experimented with this yet (since I've already got my service working and there was no compelling reason to do it in Groovy instead of Java), but I wonder which of these three solutions would be the cleaner solution.  I don't have a really strong opinion on this, but its probably preferable to have extra annotations than to have extra classes.  Extra wrapping classes just result in more boilerplate code for the next guy down the road to wade through, at least annotations would only add a few lines (one line I believe in the case of CXF).  Allegedly, just adding the annotation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;@XmlAccessorType(XmlAccessType.FIELD)&lt;/pre&gt;to your class will resolve the issue.  Has anyone else done this?  How did you resolve the issue?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4453441523657088214?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4453441523657088214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/groovy-cxf-jaxb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4453441523657088214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4453441523657088214'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/groovy-cxf-jaxb.html' title='Groovy &amp; CXF JAXB'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2060956199630340995</id><published>2009-08-06T20:30:00.002-04:00</published><updated>2009-08-07T16:00:15.174-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Traffic</title><content type='html'>For the first time in my driving experience, I experienced anger at the traffic conditions this afternoon.  My normal commute is about 25 minutes, which I don't mind too much (though I'd like to shorten it next year).  1 hour after leaving work, I was still in the same town, about 2 miles away.  I seriously could have gotten out and walked faster.  My foot got tired of holding down the brake pedal, so I put myself in park in a few places, to give it a rest.  The whole ordeal lasted 1.5 hours and I was ready to pour out merciless, meaningless destruction.  Instead, I watched reruns of Sarah Connor Chronicles and installed Windows 7.  I eventually forgot why I was mad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2060956199630340995?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2060956199630340995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/traffic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2060956199630340995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2060956199630340995'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/traffic.html' title='Traffic'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7671610448894286889</id><published>2009-08-06T14:41:00.021-04:00</published><updated>2010-05-21T14:05:38.728-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>@version JavaDoc Tags</title><content type='html'>Another comment that came up in my code review yesterday was why I had an @version 1.0 in my JavaDocs for the class I wrote.  My reasoning was that, according to  Sun's &lt;a href="http://java.sun.com/j2se/javadoc/writingdoccomments/index.html"&gt;documentation&lt;/a&gt;, the author and version tags are required (though obviously it won't throw a compiler error or anything like that, it may throw an error in Sun's &lt;a href="http://java.sun.com/j2se/javadoc/doccheck/"&gt;Doc Check&lt;/a&gt; tool).  This launched a discussion about whether the version tag should indicate revisions in the version control system (in our case svn) or release tags of the software.  The practice varies from shop to shop, but my initial reaction (despite Suns' practice) considered tags to be logical, since that would indicate API changes.  However, @since I suppose is what really should be used, and a colleague pointed out that changing all the classes to match whatever release is current hides the fact that some classes (particularly abstract data classes) may not have changed at all.&lt;br /&gt;&lt;br /&gt;My own conclusion out of this was to use &lt;a href="http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html"&gt;svn keyword substitution&lt;/a&gt; to set the tags.  I used my favorite svn client, &lt;a href="http://tortoisesvn.net/"&gt;TortoiseSVN&lt;/a&gt;, to set the properties.  You can either set it as a &lt;a href="http://iandexter.net/651/adding-svn-keyword-expansion-in-tortoise-svn"&gt;global setting&lt;/a&gt; (which will add the property to new and imported files) or on &lt;a href="http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html"&gt;particular files&lt;/a&gt; (need to do for files that already exist).  This matches Sun's practice of tying @version to their source control system.&lt;br /&gt;&lt;br /&gt;While on the subject of JavaDoc, I was mocked for pointing out a spelling mistake in a JavaDoc comment.  In my view, JavaDoc is a special class of comment.  Whereas internal comments can contain all the mistakes and profanity you want, JavaDocs are something your client might actually see, and thus should be treated just the same as a mistake like&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;System.out.println("Pleez enter your name: ");&lt;br /&gt;String name = bufferedReader.readLine();&lt;/pre&gt;Am I wrong?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7671610448894286889?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7671610448894286889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/version-javadoc-tags.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7671610448894286889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7671610448894286889'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/version-javadoc-tags.html' title='@version JavaDoc Tags'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-2043746851651530150</id><published>2009-08-06T13:18:00.002-04:00</published><updated>2009-08-06T13:19:55.355-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Pieces Parts</title><content type='html'>The term 'pieces parts' is popular here at OCLC, as a way of describing components, modules, and the like.  Is this the case anywhere else?  Or is this one of our unique quirks?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-2043746851651530150?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/2043746851651530150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/pieces-parts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2043746851651530150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/2043746851651530150'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/pieces-parts.html' title='Pieces Parts'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6469530167917400673</id><published>2009-08-05T21:48:00.015-04:00</published><updated>2010-05-21T14:06:25.920-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Things I Learned From My First Code Review</title><content type='html'>Here's some interesting ideas I saw in my first code review at OCLC&lt;br /&gt;&lt;br /&gt;instead of setting to a non-null in constructor to prevent null from being returned, check before it is returned by&lt;br /&gt;doing this&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;public String getSomeString() {&lt;br /&gt;  return (headerTag == null) ? new String() : headerTag;&lt;br /&gt;}&lt;/pre&gt;instead of this&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;String foo = new String();&lt;br /&gt;...&lt;br /&gt;public String getSomeString() {&lt;br /&gt;  return foo;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;for String concantenation, StringBuffer is faster than String (&lt;a href="http://java.sun.com/developer/JDCTechTips/2002/tt0305.html"&gt;http://java.sun.com/developer/JDCTechTips/2002/tt0305.html&lt;/a&gt;).  Unlike Strings, which are immutable, StringBuffers are mutable.&lt;br /&gt;&lt;br /&gt;surround your log4j debug log statements in an&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;if (log.isDebugEnabled()) {&lt;br /&gt;  log.debug("message here")&lt;br /&gt;}&lt;/pre&gt;so that the string isn't needlessly constructed (&lt;a href="http://java.sun.com/developer/JDCTechTips/2002/tt0305.html"&gt;http://logging.apache.org/log4j1.2/faq.html#2.3&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;avoid NPEs in comparisons, do:&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;String foo = "Some_String";&lt;br /&gt;if (foo.equals(someString)) { ... }&lt;/pre&gt;instead of:&lt;br /&gt;&lt;pre class="brush:java; wrap-lines:false"&gt;if (someString.equals("Some_String")) { ... }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6469530167917400673?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6469530167917400673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/things-i-learned-from-my-first-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6469530167917400673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6469530167917400673'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/things-i-learned-from-my-first-code.html' title='Things I Learned From My First Code Review'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-4800872868252980952</id><published>2009-08-02T22:50:00.000-04:00</published><updated>2009-08-02T22:51:03.913-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><title type='text'>Stop Sign Trimming</title><content type='html'>Why is it some stop signs have the reflective trimming around the edge and some don't?  I could understand if Ohio did and Michigan didn't, but it isn't standard even in the same county, let alone state.  What gives?  If the state wants my opinion, I say keep the trimming.  It looks nicer, and it points out the octagonal shape, making it clear what it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-4800872868252980952?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/4800872868252980952/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/stop-sign-trimming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4800872868252980952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/4800872868252980952'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/stop-sign-trimming.html' title='Stop Sign Trimming'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-443213015572185941</id><published>2009-08-02T12:48:00.002-04:00</published><updated>2009-08-02T12:50:55.366-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='random'/><category scheme='http://www.blogger.com/atom/ns#' term='life'/><title type='text'>Wash &amp; Wax</title><content type='html'>I decided to wash my car yesterday (and of course it rained last night).  I was shopping for supplies to do so, when I noticed a large selection of wash &amp; wax combination bottles.  Does anyone know if these actually work?  If it is made with that turtle wax that is supposed to last 1 year, does it provide the same level of protection?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-443213015572185941?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/443213015572185941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/wash-wax.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/443213015572185941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/443213015572185941'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/wash-wax.html' title='Wash &amp; Wax'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7809281109873689900</id><published>2009-08-01T12:43:00.000-04:00</published><updated>2009-08-02T12:48:31.279-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life'/><category scheme='http://www.blogger.com/atom/ns#' term='adventures'/><title type='text'>My First Ride in the Back of a Police Car</title><content type='html'>I must admit some embarrassment about this story.  I experienced my first (and hopefully only) ride in the back of a police cruiser Friday evening. I was on my commute home and went to pass someone, but my car didn't respond.  I punched the pedal to the floor, and I began decelerating.  Shit.  I had noticed that there was 1 bar left of fuel (I have some new fangled digital display) after my commute home the evening before, but I figured there was about 2 gallons left, which should give me around 50 mi.  I detest shopping and I was going to put it off until Saturday when I do the rest of my shopping (the gas is a few cents cheaper there anyway).  I pulled off to the side and consulted my gps for the nearest gas station (3.3 miles if I followed the road).  I was pondering what to do or who I could call when a K-9 deputy sheriff approached my door.  Interestingly, he didn't ask for my license or registration, I got patted down, and taken about a mile down the road (he can do that U turn thingy I can't) and got to buy an $8 1gal tank.&lt;br /&gt;&lt;br /&gt;What I learned:&lt;br /&gt; * Get gas when there is only 1 bar left, there will be no further warnings.&lt;br /&gt; * There is a program in Franklin County called FIRST responders, which provides motorist assistance during certain hours on certain days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7809281109873689900?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7809281109873689900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/my-first-ride-in-back-of-police-car.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7809281109873689900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7809281109873689900'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/08/my-first-ride-in-back-of-police-car.html' title='My First Ride in the Back of a Police Car'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-6361508580201660445</id><published>2009-07-30T10:27:00.007-04:00</published><updated>2009-11-23T08:24:53.113-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='mule'/><title type='text'>Error in mule-cxf.xsd?</title><content type='html'>I'm reposting this, as I've reached new conclusions. Originally, I was convinced that there was an error in the xsd for the cxf transport in mule.  A collegue of mine &lt;a href="http://forums.mulesource.org/thread.jspa?messageID=4499"&gt;posted&lt;/a&gt; a question on this to mulesource, but we haven't gotten a response back yet (except from me).  Examples on their wiki feature using the inbound-endpoint in the cxf namespace with the address attribute, such as:&lt;br /&gt;&lt;code&gt;&amp;lt;cxf:inbound-endpoint address="http://localhost:63081/hello" wsdlLocation="foo/bar/hello.wsdl" /&amp;gt;&lt;br /&gt;&lt;/code&gt;And this style is correctly interpreted by Mule and runs fine.  However, the address attribute shows up in red in IntelliJ IDEA as an invalid attribute on the cxf namespace. Anyone else ran into this? I originally attributed this to its not being present in the inbound-endpoint element in the &lt;a href="http://www.mulesource.org/schema/mule/cxf/2.2/mule-cxf.xsd"&gt;cxf namespace&lt;/a&gt;, but being present in &lt;a href="http://www.mulesource.org/schema/mule/core/2.2/mule.xsd"&gt;core&lt;/a&gt;.  But the cxf inbound-endpoint is actually an extension of the one in core, this is visible in XmlSpy and it validates fine in Eclipse. I now believe this is some kind of problem with either the xml editor and/or error highlighting components of IntelliJ. I can't find any Jira cases about this or any reference to it in the forums, so I opened a Jira case &lt;a href="http://www.jetbrains.net/jira/browse/IDEA-24020"&gt;here&lt;/a&gt;. Maybe we should all just use &lt;a href="http://eclipse.org/"&gt;Eclipse&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;During this research, I did come across another problem (which I originally thought was the cause of our issue). Some IntelliJ fans &lt;a href="http://www.jetbrains.net/jira/browse/IDEA-18099"&gt;ran into&lt;/a&gt; it a while ago. There already is a Jira case with Mulesource for this &lt;a href="http://www.mulesource.org/jira/browse/MULE-4282"&gt;here&lt;/a&gt;. The cxf shema wouldn't validate because there was a bad address for an imported schema for Spring. It's a one line fix. Instead of&lt;br /&gt;&lt;code&gt;&amp;lt;xsd:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans"/&amp;gt;&lt;br /&gt;&lt;/code&gt;It should have read&lt;br /&gt;&lt;code&gt;&amp;lt;xsd:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"/&amp;gt;&lt;/code&gt;&lt;br /&gt;The fix was merged into the 2.2.2 branch last week (and into 2.1.4 as well I believe). I don't know when they're deploying these fixes though, in the mean time you can download the files &lt;a href="http://svn.codehaus.org/mule/branches/mule-2.1.x/transports/cxf/src/main/resources/META-INF/mule-cxf.xsd"&gt;here&lt;/a&gt; (for 2.1.x) or &lt;a href="http://svn.codehaus.org/mule/branches/mule-2.2.x/transports/cxf/src/main/resources/META-INF/mule-cxf.xsd"&gt;here&lt;/a&gt; (for 2.2.x). I've tried to validate with these new files and validation still fails, though its due to the spring-context.xsd not Mule. Why can't people get xsds right? It would seem kind of important, as it's what everyone will be building their xmls off of.&lt;br /&gt;&lt;br /&gt;Coincidentally, I've learned in writing this post how to paste xml/html code in blogger (found it &lt;a href="http://pleasemakeanote.blogspot.com/2008/06/posting-source-code-in-blogger.html"&gt;here&lt;/a&gt;).  Less than signs (&amp;lt;) must be written in their html equivalent, which is &amp;amp;lt;.  There's also a cool script to translate it for you &lt;a href="http://formatmysourcecode.blogspot.com/"&gt;here&lt;/a&gt;.  And to quote html special characters like I did above, use &lt;code&gt;&amp;amp;amp;&lt;/code&gt; instead of &amp;amp;. Also, Notepad++ has a built-in TextFX that can escape to HTML.&lt;br /&gt;&lt;br /&gt;-- UPDATE 2009-11-17 --&lt;br /&gt;JetBrains has released an update to IDEA 8, which includes the fix to the bug I submitted. The update notes can be found &lt;a href="http://www.jetbrains.com/idea/features/release_notes814.html"&gt;here&lt;/a&gt;&lt;br /&gt;It is available as a free upgrade for those already with IDEA 8, &lt;a href="http://www.jetbrains.com/idea/download/index.html"&gt;get yours&lt;/a&gt;.&lt;br /&gt;I believe this fix is also in the upcoming IDEA 9, so it should be in the &lt;a href="http://www.jetbrains.org/"&gt;Community Edition&lt;/a&gt;, for those who don't want to shell out for full-featured IDE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-6361508580201660445?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/6361508580201660445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/07/error-in-mule-cxfxsd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6361508580201660445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/6361508580201660445'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/07/error-in-mule-cxfxsd.html' title='Error in mule-cxf.xsd?'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3203340561656331707.post-7019921455500838335</id><published>2009-07-28T20:49:00.003-04:00</published><updated>2009-08-07T09:44:31.702-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Windows 7 *cough* 6.1 *cough*</title><content type='html'>So...I'm getting pretty sick of all this Windows 7 hype.  "Oh this is soo much better than Vista, all the bugs are fixed, angels will sing, and gumdrops will rain from heaven."  Bullshit.  Windows 7 is nothing more than a tweaked version of Windows Vista (which despite the rumors is not that horrible of an OS).  Even colleagues in my industry have been driven to excitement (a testament to the Microsoft propaganda machine). Thankfully, there are some more &lt;a href="http://blogs.zdnet.com/Bott/?p=361"&gt;level-headed&lt;/a&gt; voices out there. It is interesting to note that the official kernel version of everything release to date is 6.1, and not 7 (EDIT: 6.1.7600 for RTM).  There's some minor UI changes, supposedly some performance increases (I have yet to see anything significant).  Even LifeHacker's &lt;a href="http://lifehacker.com/5078582/top-10-things-to-look-forward-to-in-windows-7"&gt;Top 10&lt;/a&gt; good things about Win7, while all well and good, aren't very compelling.&lt;br /&gt;&lt;br /&gt;My biggest gripe about Vista is its hardware demands, which I consider unreasonable (at least in today's market).  I'm sure some day 8GB of RAM will be standard on desktops, but I think these days, 1GB should be fine.  Yet I wouldn't recommend anything less than 2GB for Vista and it doesn't look like Win7 will change a thing.  Very disappointing.  IMHO, the reason for the Win7 hype is purely a marketing campaign.  Microsoft knows that, deserved or undeserved, Vista has a bad rap in the minds of the public.  So, they've tacked on some UI changes and slapped on a shiny new label just to sell something that's not Vista (even though it is). Our dreams of a skinny little Windows have been &lt;a href="http://www.windows-now.com/blogs/robert/mark-russinovich-explains-minwin-once-and-for-all.aspx"&gt;quashed&lt;/a&gt;, at least for Win7, but it is a step in the right direction.&lt;br /&gt;&lt;br /&gt;Maybe MS has just completely lost touch with their customers.  Why isn't IT jumping on the Vista train now that we're almost 3 years after its release?  Because they're not prepared for the increased cost of hardware.  Yet what does MS do?  They include a virtual machine (which brings its own host of &lt;a href="http://www.computerworld.com/s/article/9132177/Windows_7_s_virtual_XP_mode_could_mean_support_nightmares"&gt;problems&lt;/a&gt;) for compatibility.  I don't think compatibility is too much of a concern at this point, most apps have made the changes they need to work with Vista's UAC and new driver model. What MS really needs to focus their efforts on is making a leaner, meaner Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3203340561656331707-7019921455500838335?l=wittykeegan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wittykeegan.blogspot.com/feeds/7019921455500838335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://wittykeegan.blogspot.com/2009/07/windows-7-cough-61-cough.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7019921455500838335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3203340561656331707/posts/default/7019921455500838335'/><link rel='alternate' type='text/html' href='http://wittykeegan.blogspot.com/2009/07/windows-7-cough-61-cough.html' title='Windows 7 *cough* 6.1 *cough*'/><author><name>Keegan Witt</name><uri>https://profiles.google.com/114736251165827053048</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-nh2RSGquolY/AAAAAAAAAAI/AAAAAAAACs0/hnI1ekZ2csQ/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
