<?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-5427069094580312550</id><updated>2012-01-24T08:15:14.135-08:00</updated><category term='uniting nations through a universal message'/><category term='come on out and play'/><category term='hibernate in isolation'/><category term='jMorse'/><category term='win a sticker'/><category term='team culture'/><category term='java closures'/><category term='strange loop'/><category term='fp'/><category term='life hacker'/><category term='gruru'/><category term='ranges'/><category term='maven'/><category term='searching jars'/><category term='guest post'/><category term='pojos'/><category term='duck-typing'/><category term='Apple'/><category term='new map in Java 7'/><category term='python versus ruby'/><category term='jsr'/><category term='aliases'/><category term='blog bankruptcy'/><category term='funny if it weren&apos;t true'/><category term='rails'/><category term='making deals'/><category term='Closures take 2'/><category term='remove speed bumps on the desktop'/><category term='maritime devcon'/><category term='the first post was more fun'/><category term='conficker'/><category term='closures'/><category term='cognition'/><category term='scripting Jini'/><category term='jaiku'/><category term='regret'/><category term='diablogue'/><category term='triathlon'/><category term='pay per view at a monitor near you'/><category term='java'/><category term='java 7'/><category term='seam'/><category term='downtime'/><category term='free advice'/><category term='strong typing strikes back'/><category term='jsr 181'/><category term='holiday'/><category term='Dijkstra'/><category term='avoid your local JUG today'/><category term='deque'/><category term='concurrency'/><category term='get your groovy online'/><category term='get your geek on'/><category term='neurons on rails'/><category term='No Fluff Just Stuff wins again'/><category term='kickin it old school'/><category term='no fluff just stuff'/><category term='don&apos;t get me started on Rock Band'/><category term='the local skinny'/><category term='silver bullets'/><category term='a different kind of project coin'/><category term='java 6'/><category term='patently false'/><category term='note-worthy'/><category term='binary file editor'/><category term='iPhone'/><category term='this is your brain on code'/><category term='groovy'/><category term='only you can prevent forest fires'/><category term='jml'/><category term='explict'/><category term='unit testing'/><category term='tonight&apos;s entertainment'/><category term='mind warps on the JVM'/><category term='Stuff That Happens'/><category term='Literacy 1 Ignorance 0'/><category term='openjdk'/><category term='ioc'/><category term='whose line of code is that anyway'/><category term='Vista'/><category term='java one'/><category term='strange passions'/><category term='JSRs on rails'/><category term='st louis jug'/><category term='web frameworks'/><category term='compile-time reading'/><category term='unit tests'/><category term='courage'/><category term='exchanger'/><category term='nfjs'/><category term='friday fun'/><category term='i never meta post i didn&apos;t like'/><category term='zen and the sound of one file merging'/><category term='&apos;language air miles&apos; don&apos;t count either'/><category term='multi-line strings'/><category term='inspiration'/><category term='i&apos;m not a parallel i&apos;m just drawn that way'/><category term='tech blog innovation'/><category term='Hunt and Thomas 1 Me 0'/><category term='reasons for code bloat'/><category term='jars'/><category term='Scala'/><category term='gradle'/><category term='vending machine'/><category term='thanks Ed'/><category term='guice'/><category term='come on out'/><category term='ivy'/><category term='the iStone really rocks'/><category term='monitor design patterns'/><category term='IDEs'/><category term='zen'/><category term='Future 1 Past 0'/><category term='uml'/><category term='maintenance'/><category term='job security'/><category term='code'/><category term='bash on rails'/><category term='SDK 1.0'/><category term='lambda lounge'/><category term='jvm tunneling'/><category term='no excuses'/><category term='Java 6 Leopard'/><category term='fair warning'/><category term='POJO is the new mojo'/><category term='cool conferences'/><category term='recapitulation of the situation'/><category term='telling it like it is'/><category term='defeat the original bugs'/><category term='porsche versus ferrari'/><category term='cadenzas'/><category term='happy holidays from CodeToJoy'/><category term='web services'/><category term='jJava'/><category term='pursue truth above all else'/><category term='Paris on Rails'/><category term='power of productivity'/><category term='refactoring agile'/><category term='ruby on rails'/><category term='satriani'/><category term='poll on rails'/><category term='I still *heart* Java'/><category term='strive for it'/><category term='free drinks'/><category term='seven wonders'/><category term='NFJS 1 Couch 0'/><category term='off my chest'/><category term='garbage collection'/><category term='miller principle'/><category term='thanks Grace'/><category term='Groovy likes your DB'/><category term='entropy'/><category term='pecha kucha'/><category term='2nd law of thermodynamics'/><category term='your serve'/><category term='effective presentations'/><category term='jruby'/><category term='command line tricks'/><category term='party like its 1983'/><category term='let&apos;s order in and work through lunch'/><category term='happy holidays from everyone at CodeToJoy'/><category term='Groovy 21 Friday 17'/><category term='setName on a Dog Pojo in Dublin is an Irish Setter'/><category term='sell me time with my book'/><category term='openid'/><category term='software electricians'/><category term='duct tape'/><category term='flame wars'/><category term='stack exchange'/><category term='lemmings on rails'/><category term='clojure'/><category term='the original C sharp and F sharp'/><category term='tech interviews'/><category term='exposition'/><category term='strange loop 2010'/><category term='Scala 1 American Idol Reruns 0'/><category term='the secret widget method'/><category term='junit'/><category term='brought to you by the letter G'/><category term='no fluff just stuff rides again'/><category term='swingbuilder'/><category term='annotations'/><category term='predictions'/><category term='art'/><category term='Terracotta'/><category term='true for code and for blog posts'/><category term='getting my blog on'/><category term='my thanks to The Google'/><category term='wake me at Web 3.0'/><category term='insight'/><category term='initial thoughts'/><category term='to be served and protected'/><category term='+1 for dry'/><category term='NFJS 1 The Usual Weekend 0'/><category term='grails'/><category term='linkage'/><category term='psychology'/><category term='King of the one liners'/><category term='be afraid be very afraid'/><category term='area 51 and experimental blog posts'/><category term='expense reporting'/><category term='spring'/><category term='haskell'/><category term='Evaluate 1 Status Quo 0'/><category term='integration testing'/><category term='sun'/><category term='code to joy in its purest form'/><category term='does your favorite tech blog give you prizes?'/><category term='JetBrains scores bonus points'/><category term='klingons'/><category term='13949712720901ForOSX'/><category term='jax-ws'/><category term='get the penthouse suite'/><category term='ham radio'/><category term='xml'/><category term='threads'/><category term='swim bike run'/><category term='standup meetings'/><category term='refactoring'/><category term='Scala 1 Nightclubs 0'/><category term='Beautiful Code'/><category term='parody'/><category term='what attracts you to a given language'/><category term='monads'/><category term='Groovy injection'/><category term='ether on rails'/><category term='meet me in st louis'/><category term='RMI'/><category term='gant'/><category term='oracle'/><category term='koan'/><category term='I wonder if Fermat wrote unit tests'/><category term='quick update'/><category term='experimentation with JUnit 4'/><category term='shouda bought this when I was commuting 60 miles a day'/><category term='android'/><category term='count me in'/><category term='internal DSL'/><category term='lets order pizza and watch'/><category term='jpa'/><category term='agile war room'/><category term='recommended podcasts'/><category term='scanning'/><category term='pinging my readers'/><category term='Happy 15th'/><category term='highlights'/><category term='spice up your command line today'/><category term='10 years'/><category term='modeling'/><category term='as simple as it gets'/><category term='functional programming on ACID'/><category term='anniversaries'/><category term='Daffy Duck'/><category term='evaluate'/><category term='wish me luck'/><category term='jython'/><category term='executive summary'/><category term='the best of the best'/><category term='monads are burritos'/><category term='another newly minted term from CtJ'/><category term='guard clauses'/><category term='parlour tricks'/><category term='footholds'/><category term='java concurrency in practice'/><category term='breaking barriers to understanding'/><category term='javascript'/><category term='wired'/><category term='winning is fun'/><category term='java versions'/><category term='java concurrency'/><category term='keyboard mechanics'/><category term='it is to laugh'/><category term='Neal Gafter prototype'/><category term='classpath'/><category term='contests on rails'/><category term='Gerschwin'/><category term='complexity'/><category term='tech blog comments'/><category term='GDBC'/><category term='code reviews'/><category term='top gear'/><category term='stickers'/><category term='zen and the art of data structure maintenance'/><category term='random acts of reference'/><category term='griffon'/><category term='analogies'/><category term='filling the info pipe'/><category term='the skinny'/><category term='python'/><category term='bach'/><category term='agile development'/><category term='i wonder if the Cards write unit tests'/><category term='HTH'/><category term='programming languages'/><category term='map reduce google'/><category term='hope for a flush'/><category term='stickers gone wild'/><category term='laws'/><category term='all for code and code for all'/><category term='Groovy Expando'/><category term='masters'/><category term='powerpoint'/><category term='javafx'/><category term='wayne gretzky'/><category term='Lexical bindings are free for the day at CtJ'/><category term='vaccinate your code today'/><category term='dependency injection'/><category term='ant'/><category term='hats off to the old lion'/><category term='jfugue'/><category term='must-see TV'/><category term='beethoven'/><category term='symptoms include flashing lights and enlightenment'/><category term='Ivy 1 Frustration 0'/><category term='ant sound task'/><category term='lisp'/><category term='apolitical templates'/><category term='Creativity 1 Convention 0'/><category term='jvm'/><category term='Apple 1 Bars and Nightlife 0'/><category term='lists on rails'/><category term='artistic speculation'/><category term='google chrome'/><category term='spoof'/><category term='pascal'/><category term='hope this helps'/><category term='Beta 1 Locks 0'/><category term='giving back'/><category term='zen and the art of self reference'/><category term='passion'/><category term='aim high and positively deviate today'/><category term='primes'/><category term='captcha'/><category term='Good 1 Evil 0'/><category term='copyright notices'/><category term='tech blog titles'/><category term='generics'/><category term='backstage at CtJ'/><category term='functional programming'/><category term='Church of Steveotology'/><category term='https'/><category term='ocaml'/><category term='BGGA closures'/><category term='pop psych'/><category term='Virtuosity 1 Charisma 1 (OT)'/><category term='Java Sin Tax is a surcharge on cigarette Pojos'/><category term='satire'/><category term='domain specific user groups (DSUG)'/><category term='software archaeology'/><category term='rant and roll'/><title type='text'>Code To Joy</title><subtitle type='html'>&lt;i&gt;Code To Joy&lt;/i&gt;: putting the thrill back in blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default?start-index=101&amp;max-results=100'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>281</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2553510071761016670</id><published>2011-11-14T16:30:00.000-08:00</published><updated>2011-11-14T16:36:58.492-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy Talk</title><content type='html'>I recently gave an "Intro to Groovy" talk for a local &lt;a href="http://www.cips.ca/"&gt;CIPS&lt;/a&gt; chapter.&lt;br /&gt;&lt;br /&gt;It was a special evening: I returned to my&lt;a href="http://home.upei.ca/"&gt; alma mater&lt;/a&gt;, re-united with old friends, and met enthusiastic students.&lt;br /&gt;&lt;br /&gt;I assumed the audience wasn't familiar with Java, and so the narrative was a high-level report of the blossoming ecosystem on the JVM over the past few years, with examples in Groovy. The material is &lt;a href="https://github.com/codetojoy/presentations/tree/master/CIPS_UPEI_Intro_To_Groovy"&gt;available here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My thanks to those who attended!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2553510071761016670?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2553510071761016670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2553510071761016670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2553510071761016670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2553510071761016670'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/11/groovy-talk.html' title='Groovy Talk'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6124748221698740408</id><published>2011-11-12T13:23:00.001-08:00</published><updated>2011-11-12T13:29:57.756-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strange loop'/><title type='text'>Strange Loop Videos</title><content type='html'>This won't be news to most readers, but if, like me, you were not able to attend &lt;a href="https://thestrangeloop.com/"&gt;Strange Loop 2011&lt;/a&gt;: take heart. The videos are being released online at InfoQ. &lt;a href="https://thestrangeloop.com/news/strange-loop-2011-video-schedule"&gt;Here is the schedule&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The lineup is truly outstanding. For more about the conference, check out &lt;a href="http://www.weiqigao.com/blog/2011/09/21/strange_loop_2011_we_really_dont_know_how_to_compute_and_other_insights.html"&gt;Weiqi Gao's review&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6124748221698740408?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6124748221698740408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6124748221698740408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6124748221698740408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6124748221698740408'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/11/strange-loop-videos.html' title='Strange Loop Videos'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3326407368967179148</id><published>2011-09-20T16:31:00.000-07:00</published><updated>2011-09-20T16:55:33.338-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stack exchange'/><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><title type='text'>Blogger, OpenID, and Stack Exchange</title><content type='html'>I'm a big fan of &lt;a href="http://stackexchange.com/"&gt;Stack Exchange&lt;/a&gt; and have invested a fair amount of time on various accounts on there (mostly &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;, less on &lt;a href="http://english.stackexchange.com/"&gt;English&lt;/a&gt; and &lt;a href="http://music.stackexchange.com/"&gt;Music&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;However, I have to admit that I do not keep up with their various escapades with &lt;a href="http://en.wikipedia.org/wiki/OpenID"&gt;OpenID&lt;/a&gt;. I hear about it on the podcast/&lt;a href="http://blog.stackoverflow.com/2011/05/stack-exchange-is-an-openid-provider/"&gt;blog&lt;/a&gt;, but I haven't paid much attention.&lt;br /&gt;&lt;br /&gt;However, every now and then, it seems as though I can't get into my accounts via my Blogger URL. Not good.&lt;br /&gt;&lt;br /&gt;Strictly speaking, I should research OpenID, Blogger's implementation thereof, and then study the trials and tribulations of Stack Exchange. Then, I could summarize it for you, dear reader, and we could reflect, philosophically, on the sharp corner-cases of the web while enjoying a beverage in a local pub.&lt;br /&gt;&lt;br /&gt;This isn't one of those posts. This one is simply intended as a modest link-post of gratitude (aka "this worked for me!").&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I visited a Stack Exchange site recently, I couldn't login via my Blogger URL, and may not have even been presented with the familiar login icon that I had been using.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;One Solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Follow the steps &lt;a href="http://blog.nerdbank.net/2010/03/how-to-upgrade-your-blogger-openid-to.html"&gt;in this post&lt;/a&gt; on &lt;a href="http://blog.nerdbank.net/"&gt;JMPinline&lt;/a&gt;, including creating a Google Profile and updating  with the new links.&lt;br /&gt;&lt;br /&gt;Presumably, Stack Exchange uses OpenID 2.0 now and this will upgrade your Blogger OpenID to that version.&lt;br /&gt;&lt;br /&gt;Either way, I was immediately able to login to Stack Exchange. My sincere thanks to the original author!&lt;br /&gt;&lt;br /&gt;HTH&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3326407368967179148?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3326407368967179148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3326407368967179148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3326407368967179148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3326407368967179148'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/09/blogger-openid-and-stack-exchange.html' title='Blogger, OpenID, and Stack Exchange'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3547944618781365527</id><published>2011-09-05T08:04:00.000-07:00</published><updated>2011-09-05T08:31:41.109-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i never meta post i didn&apos;t like'/><title type='text'>Your Blog... Sucks</title><content type='html'>Hello CodeToJoy Nation!&lt;br /&gt;&lt;br /&gt;Yes, yes, it has been too long since the last post. The internet has weighed in, and we have noticed.&lt;br /&gt;&lt;br /&gt;Your friend and mine, Weiqi Gao, notes that &lt;a href="http://www.weiqigao.com/blog/2011/05/20/friday_java_quiz_know_your_class_loading_moments.html"&gt;"Nobody I know posts much any more"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The inimitable &lt;a href="http://nateneff.com/"&gt;Nate Neff&lt;/a&gt; wrote to me with a succinct critique of my writings in the last year:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-style: italic;"&gt;Your blog... sucks.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;Well. On the evidence, assuming small, frequent updates are important (which is fair): guilty as charged.&lt;br /&gt;&lt;br /&gt;However, I don't consider this blog defunct at all; in fact, I often talk about "the glory days" from a few years back.&lt;br /&gt;&lt;br /&gt;I've been grappling with writing an annual retrospective, now that I have been pursuing &lt;a href="http://codetojoy.blogspot.com/2010/05/new-chapter.html"&gt;a new chapter&lt;/a&gt; for over a year. The trick here is that challenges and triumphs have been much more on the soft side of software: team dynamics instead of technical innovation. I wrote an article along these lines for the &lt;a href="http://www.nofluffjuststuff.com/home/magazine_subscribe?id=22"&gt;NFJS magazine&lt;/a&gt; back in April. The article drew on years of experience, but the inspiration originated in my new world.&lt;br /&gt;&lt;br /&gt;As I write this, I realize that I'll have to shelve that post and simply post smaller chunks. Stay tuned! I'm still here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3547944618781365527?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3547944618781365527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3547944618781365527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3547944618781365527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3547944618781365527'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/09/your-blog-sucks.html' title='Your Blog... Sucks'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5222101352343611449</id><published>2011-06-19T05:06:00.001-07:00</published><updated>2011-06-20T04:06:13.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maritime devcon'/><title type='text'>Maritime DevCon 2011</title><content type='html'>I'm back from a jaunt to Fredericton, New Brunswick, for Maritime DevCon. Here's a post that lies between a 'random walk' and a review.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From PEI originally, I've spent most of my career in St Louis/USA. I've been an active member of the user group/conference scene there. When I moved to the Maritimes in 2010, I wondered if I could find 'my people' who can/read write in the &lt;span style="font-style: italic;"&gt;original Geek&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The upshot is: these are my people. This one-day event was a gem. The organization was first-class (good food, killer door-prizes). The topics were interesting and straddled the fence between pragmatic and esoteric-but-neat (reminiscent of &lt;a href="https://thestrangeloop.com/"&gt;Strange Loop&lt;/a&gt;). Most importantly: the 'spark' was there; that palpable energy that naturally spins out of conversation between interesting techies.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Venue&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maritime DevCon was held at the &lt;a href="http://wucentre.unb.ca/"&gt;Wu Centre&lt;/a&gt; at the University of New Brunswick. About 70 people attended, notably giving up a Saturday to spend time talking tech.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Talks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devcon.careertown.ca/schedule/"&gt;Here is the schedule&lt;/a&gt;. I attended these talks:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.openstack.org/"&gt;OpenStack&lt;/a&gt; 101 (by &lt;a href="http://www.sandywalsh.com/"&gt;Sandy Walsh&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I'm not especially familiar with cloud computing, or virtualization, so I was surprised to learn that &lt;a href="http://en.wikipedia.org/wiki/OpenStack"&gt;Open Stack&lt;/a&gt; is a &lt;span style="font-weight: bold;"&gt;huge&lt;/span&gt; initiative among big players (e.g. Intel, Cisco, and... NASA!?). The architecture involved here is mind-blowing: will the real platform please stand-up?&lt;br /&gt;&lt;br /&gt;Random thoughts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I often wonder if programming language X will be the &lt;span style="font-style: italic;"&gt;Next&lt;/span&gt; Big Thing. Though it is in a different scope, virtualization is &lt;span style="font-style: italic;"&gt;Right Now&lt;/span&gt;. Every time I think I have an appreciation for its influence, I see another talk where the landscape has changed ever further.&lt;/li&gt;&lt;li&gt;Pythonistas unite! Though thinking at this level often reduces the programming language to an implementation detail, I was delighted to hear that the underlying system is written in Python.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://redis.io/"&gt;Redis&lt;/a&gt; (by &lt;a href="http://devcon.careertown.ca/participant/peter-doan/"&gt;Peter Doan&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;At other conferences, I've missed talks on Redis, the key-value store. On the way to NB, I listened to a &lt;a href="http://thechangelog.com/post/2801342864/episode-0-4-5-redis-with-salvatore-sanfilippo"&gt;changelog interview&lt;/a&gt; with the author, Salvatore Sanfilippo. Consequently, I expected a simple, near-minimalist API, and Peter confirmed that with his code examples. Works for me.&lt;br /&gt;&lt;br /&gt;Natural Language Processing with Java (by &lt;a href="http://twitter.com/#%21/chris_nicholls"&gt;Chris Nicholls&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Interesting piece on the state-of-the-art in NLP, especially &lt;a href="http://en.wikipedia.org/wiki/Sentiment_analysis"&gt;sentiment analysis&lt;/a&gt;. The two main libraries are &lt;a href="http://alias-i.com/lingpipe/"&gt;LingPipe&lt;/a&gt; (not free) and Apache's &lt;a href="http://incubator.apache.org/opennlp/"&gt;OpenNLP&lt;/a&gt;. I hadn't thought about NLP in a long time, and certainly not with respect to Twitter: (a) Twitter could be a gold-mine (b) '#' is a legit, vital punctuation mark.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; (by &lt;a href="http://chrisdail.com/"&gt;Chris Dail&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;This was a thoughtful, solid intro to Git. I've been away from Git for awhile, so this was useful refresher, and pulled together a couple of tectonic plates floating in my consciousness.&lt;br /&gt;&lt;br /&gt;I especially enjoyed a section described branching in terms of highway lanes rather than trees. I appreciated anecdotes about using the Git client for Subversion as a rebel effort to 'subvert Subversion'. Note that Chris has a &lt;a href="http://chrisdail.com/2011/05/24/migrating-to-git-from-subversion/"&gt;detailed blog post&lt;/a&gt; about migrating from Subversion to Git.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; (by &lt;a href="http://jvaill.com/"&gt;Justin Vaillcourt&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Node is another topic that I haven't seen yet. For this talk, as my friend &lt;a href="http://www.weiqigao.com/blog/"&gt;Weiqi Gao&lt;/a&gt; would say: you had to be there. This was pure, unadulterated hackage, executed by a pack of young, feral dogs with unbridled enthusiasm for technology.&lt;br /&gt;&lt;br /&gt;Justin grinned though an abbreviated talk that ranged wildly. Just when frat-house interactions with his posse threatened to steal the show, out came jaw-dropping illustrations of Node.js.&lt;br /&gt;&lt;br /&gt;A key example used the socket.io package:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a visitor hits a website and scrolls around&lt;/li&gt;&lt;li&gt;an admin console shows a thumbnail of page the visitor is viewing&lt;/li&gt;&lt;li&gt;as the visitor scrolls, navigates in his/her browser, the thumbnail scrolls in the admin console&lt;/li&gt;&lt;/ul&gt;This was done about 150-200 lines of Javascript. I don't know if this is a strong Node example. I'm still trying to wrap my mind around it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; (by &lt;a href="http://derekhat.com/about/"&gt;Derek Hatchard&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;As with Redis and Node, I'm familiar with the buzz of MongoDB but hadn't looked into it. From the perspective of &lt;a href="http://codetojoy.blogspot.com/2009/04/dear-speaker-10-thoughts-beyond-make.html"&gt;presentation techniques&lt;/a&gt;, this was a strong talk. A good arc from the motivation through to code examples, with images instead of bullet-lists.&lt;br /&gt;&lt;br /&gt;Like Redis, the MongoDB API is deceptively simple. It's hard to appreciate the power. I was happy to see explanation of sharding with MongoDB, and very happy for an introductory theme on "no silver bullet", applied to relational DBs &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; NoSQL tools.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Suggestions&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;My main suggestion is that the sessions should have written evaluations.  This benefits the speakers, the organizers, and ultimately the  attendees. Also, there should be an overall conference evaluation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bottom-line&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is non-trivial to travel from PEI to Fredericton, but DevCon was worth it. The material and the energy felt like events in larger urban centers, and that's saying something.&lt;br /&gt;&lt;br /&gt;A shout-out to &lt;a href="http://twitter.com/#%21/derekhat"&gt;Derek Hatchard&lt;/a&gt;, other organizers, and sponsors: thanks! &lt;span style="font-weight: bold;"&gt;I'll be back&lt;/span&gt; next year, as an attendee (or possibly as a speaker?): after all, these are my people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5222101352343611449?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5222101352343611449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5222101352343611449' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5222101352343611449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5222101352343611449'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/06/maritime-devcon-2011.html' title='Maritime DevCon 2011'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3182360553713934811</id><published>2011-06-12T17:29:00.000-07:00</published><updated>2011-06-12T18:43:12.905-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nfjs'/><title type='text'>Random Walk Down NFJS (2011)</title><content type='html'>Long-time readers know that I am a big fan of No Fluff, Just Stuff. There are many posts on this blog regarding &lt;a href="http://codetojoy.blogspot.com/2009/03/no-fluff-just-stuff-st-louis-review.html"&gt;reviews&lt;/a&gt;, &lt;a href="http://codetojoy.blogspot.com/2007/09/nfjs-1-boredom-0-no-fluff-just-stuff.html"&gt;keynotes&lt;/a&gt;, pianos, and so on.&lt;br /&gt;&lt;br /&gt;Often, I start writing a "random walk" post, intending it to be quick and whimsical, but I end up writing a full review. This one will be quick, otherwise it won't be written, alas. Here we go...&lt;br /&gt;&lt;br /&gt;I returned to St. Louis (again!) in May to attend the &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/home"&gt;Gateway Software Symposium&lt;/a&gt;. As you can imagine, it was fantastic to catch up with old friends in a familiar environment. Just like old times.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Code As Proof&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I attended &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/session?id=21006"&gt;Venkat Subramaniam's talk &lt;/a&gt;on concurrency without pain in Java. The talk was all-code with no slides. A few small examples began with "synchronized and suffer" (his phrase) model and scaled through various techniques, including locks, STM, and actors.&lt;br /&gt;&lt;br /&gt;All interesting stuff, but I was especially taken with the elegance of the examples. If you've studied math, you may know the minimalist charm of a proof: there is no excess fat; everything is a direct line from A to B. As a presentation style, Venkat's talk recalled that spirit. Every example added &lt;span style="font-style: italic;"&gt;one element&lt;/span&gt; to get to the next point.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HTML5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;HTML5 officially has my attention. I saw a few talks, and was taken especially with &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/session?id=21286"&gt;Nathaniel Schutta's session&lt;/a&gt; on mobile jQuery. As someone who is notoriously divided on choosing Android versus iOS as a development platform, this blew my mind. A unified UI experience for mobile! I'm still trying to get my mind around the idea (and how to monetize it in the various app stores).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sonar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The headline: Apache applies Sonar to its projects, as &lt;a href="https://analysis.apache.org/"&gt;shown here&lt;/a&gt;.  &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/session?id=22424"&gt;Matthew McCullough's talk&lt;/a&gt; convinced me that this isn't merely a collection of code metrics. With experience, I think a Sonar guru can transcend the raw data and see interesting patterns over time, such as the impact of summer weather on code quality (!). This is a Freakonomics-like enabler.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Crafting Software&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Two &lt;span style="font-style: italic;"&gt;paraphrased&lt;/span&gt; thoughts that really stuck (I hope I've captured the essence).&lt;br /&gt;&lt;br /&gt;One from &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/speakers/peter_bell"&gt;Peter Bell&lt;/a&gt;, along the lines of: on initial estimates for a project, give enough time to do the minimum spec, and include time to polish based on feedback from the first cut.&lt;br /&gt;&lt;br /&gt;From your friend and mine, &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/speakers/ken_sipe"&gt;Ken Sipe&lt;/a&gt;: two major problems with software teams are (1) poorly defined acceptance tests and (2) dysfunction in the daily stand-up. When someone with Ken's experience distills things down to two items, that's powerful stuff.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;And The Gradle Will Rock&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ken also &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/session?id=21316"&gt;spoke on Gradle&lt;/a&gt;. I'm a fan, and gave an intro talk back at GSS May 2010. The interesting story here is the growth. There is a lot of industry momentum here, and the training/book offerings are ramping up big-time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where's The Groovy!?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I caught Venkat's &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/session?id=21314"&gt;talk on Spock&lt;/a&gt;, and liked it very much. I didn't catch any Groovy or Grails talks, only because I'm very familiar with them. It was interesting to reflect on the history of these technologies. Grails has been 1.0 since Feb 2008! They grow up so fast.... *sniff*&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anapestic Tetrameter!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Nothing &lt;span style="font-style: italic;"&gt;stresses me out&lt;/span&gt; like poetic meter (pun intended). It is one of a handful of high-school subjects that I just Could Not Understand. When I saw &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/tim_berglund"&gt;Tim Berglund's &lt;/a&gt;tweet that he was working in &lt;a href="http://en.wikipedia.org/wiki/Anapestic_tetrameter"&gt;anapestic tetrameter&lt;/a&gt;, I shivered out of reflex. Gah!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Then&lt;/span&gt;, at NFJS, Jay Z showed the video. All is forgiven. Tim crafted an ode to Kent Beck's &lt;a href="http://www.amazon.com/dp/0321413091"&gt;Implementation Patterns&lt;/a&gt;. &lt;a href="http://www.dzone.com/links/r/oh_the_methods_youll_compose.html"&gt;Vote for Tim's vid&lt;/a&gt; on DZone. Vote it up on YouTube. It is wonderful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Thanks&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This may sound like trite, blanket statement, but I can't mention everyone. The weekend truly was chock-full of heartfelt re-unions and conversations, on many levels.  See you again soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3182360553713934811?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3182360553713934811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3182360553713934811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3182360553713934811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3182360553713934811'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/06/random-walk-down-nfjs-2011.html' title='Random Walk Down NFJS (2011)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6112681631626819695</id><published>2011-05-04T16:34:00.000-07:00</published><updated>2011-05-04T17:09:08.707-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='no fluff just stuff'/><title type='text'>Meet Me In St. Louis</title><content type='html'>Hello, Code to Joy Nation (esp. those in Saint Louis)!&lt;br /&gt;&lt;br /&gt;Next week, I'll be returning to Saint Louis to attend the &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2011/05/home"&gt;NFJS Gateway Software Symposium&lt;/a&gt;. I can't wait to be back in town and see everyone!&lt;br /&gt;&lt;br /&gt;Long-time readers know I'm a fan of the tour, and think the speakers are top-shelf. Many keen insights and fond memories over the years.&lt;br /&gt;&lt;br /&gt;A fond highlight was speaking at the Saint Louis show in 2010. This spring, I wrote &lt;a href="http://www.nofluffjuststuff.com/home/magazine_subscribe?id=22"&gt;an article&lt;/a&gt; for the NFJS magazine. Both were true growth experiences for me.&lt;br /&gt;&lt;br /&gt;Last year, knowing I would be leaving, I wrote a personal 10 year retrospective, highlighting &lt;a href="http://codetojoy.blogspot.com/2010/05/10-thoughts-as-attendee-at-nfjs.html"&gt;a certain piano at the Marriott West&lt;/a&gt;. Well, tune 'er up! I've missed it.&lt;br /&gt;&lt;br /&gt;If you're at the conference, be sure to say hello...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6112681631626819695?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6112681631626819695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6112681631626819695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6112681631626819695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6112681631626819695'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/05/meet-me-in-st-louis.html' title='Meet Me In St. Louis'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6693002141509104615</id><published>2011-03-29T15:14:00.000-07:00</published><updated>2011-03-30T03:45:02.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='life hacker'/><title type='text'>Local Website as Tool Belt</title><content type='html'>Quick, answer this: on your dev machine, how many keystrokes does it take for you to find the documentation for the String class in your current language?&lt;br /&gt;&lt;br /&gt;As I've paired with developers over the years, I've noticed a few patterns:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Just Google It&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gah! Consider working on a roof-top, say, at replacing shingles. Imagine needing a tool, and having to go down the ladder to get it. &lt;span style="font-style: italic;"&gt;Now&lt;/span&gt;, imagine going down the same ladder every time you need the tool. For a professional, that strikes me as painful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bookmarks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Much better. If organized well, bookmarks are undoubtedly terrific. A minor downside is that navigating a bookmark hierarchy still takes time. I can't criticize someone who chooses this style, but I can't do it. It's as though we have a toolbox up on the roof, but that it's 10 feet away from where I'm working.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Local Website&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I worked with a developer circa 2003 who ran a local copy of Tomcat. He curated his own web pages according to his needs. I thought it was pretty crazy at first, but I adopted the idea.&lt;br /&gt;&lt;br /&gt;True, this ain't "rocket surgery", but I&lt;span style="font-style: italic;"&gt; &lt;/span&gt;just&lt;span style="font-style: italic;"&gt; love&lt;/span&gt; it. It strikes me as a tool belt, where everything is within reach. Here's why:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Use the home page for your bookmarks&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Rather than organizing my bookmarks in a given browser, I simply put my favourite sites on my home page. (As you might guess, the Javadoc for Java, Groovy, etc are front and center.)&lt;br /&gt;&lt;br /&gt;The advantages are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can see a lot more information immediately, just by hitting that big, inviting Home button. I have a geek column, an intranet column, and so on. Rather than navigate a hierarchy, I let my brain pattern-match on the shapes of the categories.&lt;/li&gt;&lt;li&gt;You may end up collecting more links that you would normally bookmark. e.g. I would never bookmark the 2011 calendar, and yet this way, I have a link for it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can add various text, such as the phone extensions of teammates.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:85%;"&gt;Portability&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;When pairing with someone, often you are at their workstation. How will you find your bookmarks from there? With a local website, you can point them to your page (while you're at, have them bookmark it).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:85%;"&gt;Beyond Web Pages&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;By having Tomcat on your machine, you are opening a world far larger than mere web pages and links. You can start to share &lt;a href="http://groovy.codehaus.org/Groovlets"&gt;Groovlets&lt;/a&gt; with your team. This can be a big productivity boost, and a subtle way to introduce the concept to others. (I've been working on a writing assignment that explores this further. Stay tuned.)&lt;br /&gt;&lt;br /&gt;Another bonus: if you need to work up a sanity check with CSS or jQuery, you already have Tomcat installed and running.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Point&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;As developers, we love shortcuts in our IDE because we strive for "typing at the speed of thought". If you google something more than twice a week, consider putting it on a local web page. Over the years, I've found it to be very useful.&lt;br /&gt;&lt;br /&gt;As always, I'm interested in your tips for productivity gains. Share 'em!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6693002141509104615?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6693002141509104615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6693002141509104615' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6693002141509104615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6693002141509104615'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/03/local-website-as-tool-belt.html' title='Local Website as Tool Belt'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3595863940956165560</id><published>2011-01-31T17:04:00.000-08:00</published><updated>2011-01-31T17:53:57.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software archaeology'/><title type='text'>Software Archeology And Video Time Capsules</title><content type='html'>I was recently listening to &lt;a href="http://javaposse.com/java-posse-338-roundup-10-alternative-views-in-software-development"&gt;Episode 338&lt;/a&gt; of the Java Posse podcast, which is a recording of a session at the Roundup 2010. Near the 19:30 mark, a chap draws an analogy between software maintenance and archeology. Assuming the original team leads are no longer available, he asks (paraphrased):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What was the culture of the team?&lt;/li&gt;&lt;li&gt;What were the designs/philosophies of the original architect?&lt;/li&gt;&lt;li&gt;How can we make those thoughts more explicit?&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Software Archeology&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I found the moment to be eloquent, and reminiscent of an &lt;a href="http://www.se-radio.net/2009/11/episode-148-software-archaeology-with-dave-thomas/"&gt;episode of SE Radio&lt;/a&gt;, where Dave Thomas uses a similar metaphor: code maintenance ultimately requires us to understand a culture &lt;span style="font-style: italic;"&gt;by analyzing artifacts&lt;/span&gt;. Call it software archeology.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Artifacts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We can all name the usual artifacts: an architecture document, UML diagrams, sequence diagrams, and so on. If we are lucky, perhaps there are tests.&lt;br /&gt;&lt;br /&gt;Unfortunately, all too often, documentation is formal and poorly written. Reading it for culture is like trying to understand a society by reading its laws: useful, but abstract and without soul. Worse, the documentation may be out of date and only vaguely relevant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Potential Solution?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As consumers, we spend untold amounts of money on video equipment, which is both powerful and easy to use. We think nothing of uploading staggering amounts of video to the cloud, documenting our lives, and yet in the corporate environment, nothing. This strikes me as &lt;span style="font-style: italic;"&gt;absurd&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;In addition to striving for new wikis, language constructions, and formal diagrams, why don't we use video?&lt;br /&gt;&lt;br /&gt;Consider this: what if the team lead gave a 1-hour architecture overview, once per release, and it was recorded and checked-in to source control? What if s/he took an afternoon to make a screencast of a random walk through the IDE? That is, what if we treated video time capsules &lt;span style="font-style: italic;"&gt;as project artifacts&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;For future software archeologists, they would be worth their disk space &lt;span style="font-style: italic;"&gt;in gold&lt;/span&gt;. Imagine the simple nuances and gems that are so difficult to express otherwise (e.g. "yes, we are bending the usual use of aspects here, but there was a trade show deadline. We hope to address this technical debt").&lt;br /&gt;&lt;br /&gt;Note that in my vision, the production quality would be low: these could be one-take, banzai attempts. Naturally, no one can possibly explain all of the corners of a code-base, but this isn't about corners: this is about &lt;span style="font-style: italic;"&gt;culture&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Counterpoint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This strikes me as so obvious, that I must be missing something. Perhaps I am simply naive. Arguing against this idea, the main deterrents that I can see:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Companies may not be prepared to buy and manage video equipment. In terms of acquisitions and stewardship, it just isn't part of their DNA.&lt;/li&gt;&lt;li&gt;Managers may fear that video is somehow less secure than source-code.&lt;/li&gt;&lt;li&gt;For highly regulated industries, what happens if a team-lead describes a design flaw or technical debt? Could this be a legal liability? (This could be a major deal-breaker, but certainly not for all companies?)&lt;/li&gt;&lt;li&gt;There is no incentive for a team to prepare others for future maintenance. Even if video time capsules are effective, the status quo is good enough, and between leads, developers, and managers, no one will demand better.&lt;/li&gt;&lt;/ul&gt;What do you think? Does your team use video?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3595863940956165560?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3595863940956165560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3595863940956165560' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3595863940956165560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3595863940956165560'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/01/software-archeology-and-video-time.html' title='Software Archeology And Video Time Capsules'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7105414343118252078</id><published>2011-01-03T13:14:00.000-08:00</published><updated>2011-01-03T16:14:56.972-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='koan'/><title type='text'>Koans</title><content type='html'>First, note that &lt;a href="http://www.ociweb.com/"&gt;my former employer&lt;/a&gt; has a new look to its monthly newsletter, &lt;a href="http://ociweb.com/sett"&gt;Software Engineering Tech Trends&lt;/a&gt;. I've always appreciated the articles (and wrote two), but now that I live in an area without many local user groups, I count on SETT when planning my study path.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sett.ociweb.com/sett/settJan2011.html"&gt;January's article&lt;/a&gt; is a fantastic example. Your friend and mine, &lt;a href="http://marioaquino.blogspot.com/"&gt;Mario Aquino&lt;/a&gt;, introduces us to koans, covering exercise packages in Ruby, Javascript, and Clojure (see comments for Groovy resources, &lt;span style="font-style: italic;"&gt;Editor&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;The Javascript example is especially easy to start and work with. A browser and a text-editor: it could scarcely be easier!&lt;br /&gt;&lt;br /&gt;This is &lt;span style="font-style: italic;"&gt;neat&lt;/span&gt; stuff. Read Mario's article for the full scoop on about martial arts training and Eastern philosophies. I'm definitely a newbie, but so far, I've noticed:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Testing as a contract&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The koan style appears to embrace the view that testing is a useful prism for viewing an object. In normal software testing, the object is software, but here the focus is &lt;span style="font-style: italic;"&gt;understanding&lt;/span&gt;. Despite a different focus, the tests as a concrete contract.&lt;br /&gt;&lt;br /&gt;Not that we needed more evidence of being in a post &lt;span style="font-style: italic;"&gt;documentation-centric&lt;/span&gt; era (post to follow?!), yet here it is.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Zork&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Both the interactivity and the sense of Zen paradox reminds me of early text-based adventure games, such as&lt;a href="http://en.wikipedia.org/wiki/Zork"&gt; Zork&lt;/a&gt;. It would take serious work and creativity, but I envision a learning app that combines the spirit of the koans with a sense of an adventure game. Potentially a great way to introduce kids into programming (or to their 2nd language etc).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fun&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most of all, this stuff is outright fun. It's a potent combination of learning along with the electrochemical reward for passing tests. That's some mojo right there. What's not to love?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7105414343118252078?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7105414343118252078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7105414343118252078' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7105414343118252078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7105414343118252078'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2011/01/koans.html' title='Koans'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2681177731982518012</id><published>2010-12-23T15:08:00.000-08:00</published><updated>2010-12-23T15:26:49.405-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strange passions'/><title type='text'>Pro Tip: Ask for a 999 Cut</title><content type='html'>Hello CtJ Nation!&lt;br /&gt;&lt;br /&gt;A short post to wish readers a splendid holiday season and a happy New Year. Thanks for staying with me through 2010. It has been a hectic year, and I've been unusually quiet.&lt;br /&gt;&lt;br /&gt;As a light-hearted thank you, I'm sharing some links from the Strange Passions sessions at the recent &lt;a href="http://strangeloop2010.com/"&gt;Strange Loop 2010&lt;/a&gt; conference.&lt;br /&gt;&lt;br /&gt;I once thought &lt;span style="font-style: italic;"&gt;I &lt;/span&gt;was an interesting person, but after seeing these  talks, one is humbled and entertained at the same time.  Wonderful, wonderful stuff.&lt;br /&gt;&lt;br /&gt;My favourites are &lt;a href="http://strangeloop.blip.tv/file/4536696/"&gt;Entering Without Breaking&lt;/a&gt; (it inspired the title of this post) by Galen Collins and &lt;a href="http://strangeloop.blip.tv/file/4538358/"&gt;The Science of Musical Counterpoint and Illusion&lt;/a&gt; by Daniel Spiewak.  (If it matters, GC's talk is rated-R for occasional language.)&lt;br /&gt;&lt;br /&gt;All of the videos are &lt;a href="http://strangeloop.blip.tv/posts?view=archive&amp;amp;nsfw=dc"&gt;available here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Be safe, and be joyous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2681177731982518012?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2681177731982518012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2681177731982518012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2681177731982518012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2681177731982518012'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/12/pro-tip-ask-for-999-cut.html' title='Pro Tip: Ask for a 999 Cut'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7451507420975939133</id><published>2010-11-30T17:49:00.001-08:00</published><updated>2010-12-06T15:41:01.896-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='must-see TV'/><title type='text'>Language Panel</title><content type='html'>Here is a&lt;a href="http://www.infoq.com/presentations/Future-of-Programming-Languages"&gt; must-see video&lt;/a&gt; from &lt;a href="http://strangeloop2010.com/"&gt;Strange Loop 2010&lt;/a&gt;. It features a panel of icons and rock-stars, with another as guest host. The topic is the future of programming languages. It was a true treat to be there.&lt;br /&gt;&lt;br /&gt;Some quick thoughts on the video:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introductions part 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notice how the panelists didn't feel the need to list the languages they've worked with. Relative to their achievements, their intros are brief.&lt;br /&gt;&lt;br /&gt;There is a calm confidence in brevity. I first noticed this when Dave  Thomas introduced himself on the &lt;a href="http://www.nofluffjuststuff.com/home/main"&gt;NFJS tour&lt;/a&gt; with: "I'm a  programmer".&lt;br /&gt;&lt;br /&gt;This separates the amateurs from the pros. Pros don't introduce themselves with the number of languages they know (a pet peeve of mine). It is &lt;span style="font-style: italic; font-weight: bold;"&gt;assumed&lt;/span&gt; that everyone has worked with a dozen or more. It is true, no matter how impossible, that for every person in the room, there is someone else who has seen more languages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introductions part 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Kudos to Alex Payne for paying respect. It struck me as sincere.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introductions part 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Guy Steele is one classy guy. Note his emphasis: he likes &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; languages. Each one has value and its own charming quirks. We get the sense that Guy is more interested in &lt;span style="font-style: italic;"&gt;solving problems&lt;/span&gt; than the current fashion of the industry. He has an air that inspires me to take the high road, and stay above the language wars.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Language Wars&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alas, Guy's angelic aura only lasts for so long. The unvarnished truth is that I'm weak, and I &lt;span style="font-style: italic;"&gt;can't resist&lt;/span&gt; language wars. Though the gang were rough on Perl, Crockford's irreverent non-comment on Parrot, near the 30:00 mark is priceless.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Non Question&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I nearly asked a question about escaping the surly bonds of ASCII in future programming languages. Unfortunately, I became distracted by my inner voice:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Is this a dumb question?&lt;/li&gt;&lt;li&gt;Am I asking this to impress the panel? To impress the audience?&lt;/li&gt;&lt;li&gt;Didn't Guy Steele, in a keynote, have a Unicode symbol in Fortress? Why wasn't I paying closer attention?&lt;/li&gt;&lt;li&gt;How could I travel 1800 miles for a conference and not have prepared a few questions?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And so on. In the end, I played it safe and sat on my hands. Though I may have avoided an embarrassing moment, I also passed up a chance at potential insight.&lt;br /&gt;&lt;br /&gt;Lesson learned: brevity rocks; reticence sucks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7451507420975939133?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7451507420975939133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7451507420975939133' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7451507420975939133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7451507420975939133'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/11/language-panel.html' title='Language Panel'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7584157189176583302</id><published>2010-11-12T17:04:00.000-08:00</published><updated>2010-11-12T17:14:03.965-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='https'/><title type='text'>https download with Internet Explorer</title><content type='html'>I strive to link to posts that have saved my team's bacon, as a modest payback. It might help search engines, and will certainly help me remember the experience, in the event I encounter it again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The problem:&lt;/span&gt; Internet Explorer won't download a document (e.g. an Excel report) via https.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The cause:&lt;/span&gt; probably cache-prevention in the headers, per &lt;a href="http://blogs.msdn.com/b/ieinternals/archive/2009/10/02/internet-explorer-cannot-download-over-https-when-no-cache.aspx"&gt;Eric Law's post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The bonus:&lt;/span&gt; Eric mentions &lt;a href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt;. That tool might be very useful in general, though I haven't tried it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7584157189176583302?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7584157189176583302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7584157189176583302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7584157189176583302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7584157189176583302'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/11/https-download-with-internet-explorer.html' title='https download with Internet Explorer'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6348928287723433976</id><published>2010-11-12T16:55:00.000-08:00</published><updated>2010-11-12T17:03:44.592-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linkage'/><title type='text'>Keynote to 2-up PDF</title><content type='html'>This post is simply grateful linkage to a useful &lt;a href="http://tech.puredanger.com/2008/03/28/keynote-2up-pdf/"&gt;post by Alex Miller&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For a conference or business presentation, you may be asked for a 2-up B&amp;amp;W PDF. If you are like me, the first question is: "what is 2-up?" That question is &lt;a href="http://www.tailrecursive.org/postscript/nup.html"&gt;answered here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Easy. The next question is: how do I do that in Keynote? &lt;a href="http://tech.puredanger.com/2008/03/28/keynote-2up-pdf/"&gt;Alex's post&lt;/a&gt; gives the steps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6348928287723433976?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6348928287723433976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6348928287723433976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6348928287723433976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6348928287723433976'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/11/keynote-to-2-up-pdf.html' title='Keynote to 2-up PDF'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5005164135465516696</id><published>2010-11-07T13:44:00.000-08:00</published><updated>2010-11-09T16:22:23.269-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='expense reporting'/><title type='text'>JavaScript and Expense Reports</title><content type='html'>This is a loosely-connected collection of thoughts stemming from the recent &lt;a href="http://strangeloop2010.com/"&gt;Strange Loop conference&lt;/a&gt; and a book purchase.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For years now, I've known that thoughtful developers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;separate the JavaScript language from the DOM and wretched browsers&lt;/li&gt;&lt;li&gt;appreciate JavaScript as a lovely language inspired by (surprise!) Lisp &lt;/li&gt;&lt;/ul&gt;So, I thought I "got it". Aside from the usual web development, I've even written significant production code in ActionScript in 2003-4.&lt;br /&gt;&lt;br /&gt;But I didn't truly learn the language.&lt;br /&gt;&lt;br /&gt;It fell into the dreaded &lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;Multi-Month Void of Cognitive Decay&lt;/span&gt; (MMVCD).&lt;br /&gt;&lt;br /&gt;Here's what I mean: I only faced JavaScript every 3-6 months or so. When it did show up, the situation was urgent, and I felt as though I had to re-learn the basics. Previous 'lessons learned' were quickly lost in the fog of war. I gradually associated the frustration of re-learning with the topic itself.&lt;br /&gt;&lt;br /&gt;In this sense, poor JavaScript joined CSS and expense reporting software, falling into the dreaded MMVCD, a random window of cerebral entropy lasting between 3 and 18 months.&lt;br /&gt;&lt;br /&gt;(However, even in its worst hour, JavaScript was certainly better than either expense reports or CSS, both of which occupy the darkest corners of MMVCD)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Motivation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many friends have been interested in JavaScript (some in a &lt;a href="http://rhyolight.posterous.com/"&gt;career-altering way&lt;/a&gt;, no less). Many recommend Douglas Crockford's &lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/ref=cm_cr_pr_product_top"&gt;JavaScript: the Good Parts&lt;/a&gt;. It is mentioned frequently at conferences and user groups.&lt;br /&gt;&lt;br /&gt;The tipping point was this review by &lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742/ref=cm_cr_pr_product_top"&gt;Witek Radomski&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(0, 0, 153);"&gt;I used JavaScript as a garnish for web development... I was afraid of it. I knew I needed to confront the language and learn it properly.&lt;br /&gt;&lt;/blockquote&gt;Yow. This person saw into my soul. In fact, that review led to my recognition of the MMVCD.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JavaScript: the Good Parts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This isn't a book review, but: the book is a delight. Minus the appendices, the book is &lt;span style="font-weight: bold;"&gt;100 pages in 10 chapters&lt;/span&gt;. That is an object lesson for authors and publishers alike! (I would love to know if Crockford faced pressure to add pages.)&lt;br /&gt;&lt;br /&gt;What's more, the premise is a winner: a language can contain a beautiful, subset within a complex, (at times) unappealing landscape.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Random Thought #1: Chained Dictionaries&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On &lt;a href="http://www.se-radio.net/"&gt;SE-Radio&lt;/a&gt;, someone once joked that Lisp is nothing more than an abstract syntax tree. Funny stuff, and not entirely fair (I believe it is a comic reduction of an earnest point by Paul Graham, though I have no link to support that). Yet there is certainly a grain of truth in it.&lt;br /&gt;&lt;br /&gt;My mental model of JavaScript: it has collections of properties. JavaScript does not call them dictionaries; I will. Dictionaries can be chained. A property may be a function. That's it: simple, elegant. Though this is neither fair nor accurate, that idea leaps to mind frequently.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Random Thought #2: Inheritance is an Interface&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/scottbale"&gt;Scott Bale&lt;/a&gt; gave an excellent talk at Strange Loop 2010, based on Crockford's book. During the talk, it struck me: when we learn that a language offers inheritance, it is a fallacy (and audaciously Java-centric) to assume the existence of classes. Classes are merely one implementation of inheritance.&lt;br /&gt;&lt;br /&gt;To wit, inheritance is an interface. It is a conceptual contract.&lt;br /&gt;&lt;br /&gt;As most will already know, JavaScript offers prototype-based inheritance. This is a different ballgame, but must be understood, if we are to comprehend JavaScript. Crockford banishes the pseudo-class-based inheritance of JavaScript out of the Garden of Good Parts.&lt;br /&gt;&lt;br /&gt;(As an aside, Crockford uses the terms 'prototypal' and 'classical'. I think this is a poor choice. To me, 'classical' has connotations of timelessness or an ideal. It took me a long time to realize Crockford doesn't mean to imply that.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If, like me, you find JavaScript to be in the Multi-Month Void of Cognitive Decay, Crockford's book is a gem. I'll be working through it.&lt;br /&gt;&lt;br /&gt;I realize there is now a book on &lt;a href="http://www.amazon.com/HTML-CSS-Parts-Animal-Guide/dp/0596157606"&gt;HTML and CSS&lt;/a&gt;, but I don't think I have the stomach for it. Ping me when Expense Reports: the Good Parts is available.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Postscript&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Be sure to check out the comments for interesting links on JavaScript material by &lt;a href="http://www.lambdalounge.org/"&gt;Lambda Loungers&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5005164135465516696?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5005164135465516696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5005164135465516696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5005164135465516696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5005164135465516696'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/11/javascript-and-expense-reports.html' title='JavaScript and Expense Reports'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7827219029951390074</id><published>2010-10-17T16:20:00.000-07:00</published><updated>2010-10-18T03:40:05.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strange loop 2010'/><title type='text'>Strange Loop and Campus Memories</title><content type='html'>I've returned from &lt;a href="http://strangeloop2010.com/"&gt;Strange Loop 2010&lt;/a&gt; in Saint Louis.&lt;br /&gt;&lt;br /&gt;For photos, presentation materials, and other reviews, check out &lt;a href="http://twitter.com/strangeloop_stl"&gt;the Twitter feed&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This year, I'm not writing a full review or even my usual "random walk" through the conference. This is a quick, lyrical appreciation of the vibe. Future posts may include personal insights, one at a time. This is to serve my readers, who (correctly) point out the declining frequency of posts on here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First Days on Campus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recall your first days on a university campus, or imagine them from a Hollywood film.&lt;br /&gt;&lt;br /&gt;It is a brilliant autumn afternoon. The crisp bite of the morning chill is gone, and the trees display their fiery leaves in the sun.&lt;br /&gt;&lt;br /&gt;Everywhere, there is energy. Outside, people hustle and bustle from one building to another. Along the paths and roads, the chatter is constant. Some are merely coordinating the next stop. &lt;span style="font-style: italic;"&gt;Where&lt;/span&gt; is it? &lt;span style="font-style: italic;"&gt;When&lt;/span&gt; is it?&lt;br /&gt;&lt;br /&gt;But most are sharing &lt;span style="font-style: italic;"&gt;ideas&lt;/span&gt;. The ideas initially come from respected professors, who set student minds ablaze. Then new thoughts arrive via inspiration; others are borne through rigorous debate. Somehow, they culminate in a virtuous cycle of intelligence and enthusiasm. Like the morning chill, cynicism and defeat cannot exist in this environment. The energy burns them off.&lt;br /&gt;&lt;br /&gt;In a season of change, humanity and nature join in a triumphant, zen sense of &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;here&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;now&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Strange Loop 2010&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The 2-day conference brought me back to my first days on campus at grad school.&lt;br /&gt;&lt;br /&gt;That was the vibe. In my mind, there is no higher praise.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Postscript&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;For those not on Twitter, a final shout-out to all my tech friends in Saint Louis and beyond. It was terrific to catch up, and I only wish I had more time to chat. See you again soon.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Reviews&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;For details, my friends &lt;a href="http://www.weiqigao.com/blog/2010/10/18/strange_loop_2010_two_questions_not_answered.html"&gt;Weiqi Gao&lt;/a&gt; and &lt;a href="http://marioaquino.blogspot.com/2010/10/strangeloop-talks-day-1.html"&gt;Mario Aquino &lt;/a&gt;have posted excellent reviews.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7827219029951390074?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7827219029951390074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7827219029951390074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7827219029951390074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7827219029951390074'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/10/strange-loop-and-campus-memories.html' title='Strange Loop and Campus Memories'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7128281514291290799</id><published>2010-09-25T08:33:00.000-07:00</published><updated>2010-09-25T09:40:16.336-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hope this helps'/><title type='text'>Moving Details</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In case this helps anyone, Here are details about my recent international move. This is definitely a niche topic: no worries on skipping it. I wish I had this info when I started, and want to contribute back to the hive-mind.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Disclaimer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a journal of my experience, and not advice. I hope this opens eyes to topics of research, but ultimately, you are on your own.&lt;br /&gt;&lt;br /&gt;Although the experience was a lot of research, with seemingly unending paperwork, this post is not intended as criticism toward Canada or the USA. Any comments disparaging either country will be deleted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Executive Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am a Canadian who returned after working for several years in the USA (legally, on TN Visas). I have no dependents and didn't own a house.&lt;br /&gt;&lt;br /&gt;I found that there were three areas of concern:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;stuff&lt;/li&gt;&lt;li&gt;finances&lt;/li&gt;&lt;li&gt;car&lt;/li&gt;&lt;/ul&gt;My stuff was straight-forward. My finances were difficult. My car was surprising.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Stuff&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I went with professional movers for my furniture and books. I packed important things (e.g. guitars) into my car and drove separately.&lt;br /&gt;&lt;br /&gt;Following instructions from &lt;a href="http://www.cbsa-asfc.gc.ca/menu-eng.html"&gt;Canada Border Services&lt;/a&gt;, I prepared a manifest that enumerated each box / item, with an estimated value for each. Per instructions, it isn't necessary to list "each pair of socks". My approach was to generalize clothes and books per box, but to list electronic equipment and guitars separately.&lt;br /&gt;&lt;br /&gt;The list has two sections: stuff in my car and stuff "to follow" (that is, on the moving truck).&lt;br /&gt;&lt;br /&gt;I arrived at the border before the truck, and showed the Canadian border guards the list. I paid duty on the vehicle (see below), but IIRC, I was exempt from duty on my belongings, given (a) everything was older than 6 months and (b) I was granted credit for every year that I was away.&lt;br /&gt;&lt;br /&gt;Despite having a delivery window of 3 weeks, the movers arrived &lt;span style="font-weight: bold; font-style: italic;"&gt;6 weeks&lt;/span&gt; later. I met them at an airport, which served as a port of entry / customs. I presented my manifest list and also the paperwork I had signed at the border.&lt;br /&gt;&lt;br /&gt;The downside of pro movers is the expense and the high likelihood of delayed arrival. I had considered U-Haul but that approach has its own issues, which are obvious.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Finances&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not going into gory details here. My main lesson is that I was wise to check with financial institutions about becoming a non-resident. First, it will be an extremely good test of a brokerage's customer service: it is an exotic question.&lt;br /&gt;&lt;br /&gt;From what I can tell, a US resident can certainly have holdings with a financial institution, but upon leaving, there are restrictions on activity. e.g. One cannot make transactions. It was never clear to me if one could simply leave the account open, without doing further trading. Most of my moving research was spent on this question.&lt;br /&gt;&lt;br /&gt;Another option is to liquidate. Depending on market conditions, this could be suicidal. For 401K accounts, it is definitely painful and drastic.&lt;br /&gt;&lt;br /&gt;A final option, for residents of Canada and the USA, is a cross-border brokerage. They are typically licensed to trade in both countries. However, these brokerages have a niche, affluent market and have the leverage to charge steep fees.&lt;br /&gt;&lt;br /&gt;Note that I haven't mentioned taxes. For me, that research lays ahead, due to the timing of my move.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My Car&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First, a car is not automatically welcome in another country. e.g. Canada does not accept all US cars. I checked mine against the list at the &lt;a href="http://www.riv.ca/importingavehicle.aspx"&gt;Registrar of Imported Vehicles&lt;/a&gt; (RIV). Thankfully, it is welcome (as most are).&lt;br /&gt;&lt;br /&gt;For the Canadian side, I did the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Before moving, get a letter from your local dealer that any recall work has been performed on the car, or that it is clear of recalls.&lt;/li&gt;&lt;li&gt;Estimate the value of your car in the destination of your move. This will be used to calculate duty at the border.&lt;/li&gt;&lt;li&gt;After crossing the border, within 30-45 days (check documentation), the car must undergo a federal inspection. The paperwork is faxed to the RIV. The RIV will mail a sticker that affirms the car is formally a Canadian vehicle.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The car must also undergo the typical provincial inspection and registration.&lt;/li&gt;&lt;/ul&gt;That's some work, but wait, &lt;span style="font-style: italic;"&gt;there's more! &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is an &lt;span style="font-style: italic;"&gt;American aspect&lt;/span&gt; to vehicles: one must contact the American border (at the point of departure), 3 days in advance, to alert them that you are leaving the country. They want VIN, title, etc, faxed to their office.&lt;br /&gt;&lt;br /&gt;I discovered this about a week before my departure. Be sure to verify that they received the information. Vehicle titles are a challenge for a fax machine. There is no charge on the American side. (This is probably a procedure to curb theft.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've already blogged about my personal decision and my admiration for both countries. This post is sheer logistics, without the sentiment.&lt;br /&gt;&lt;br /&gt;If I were to do it again, I would consider selling my car before the move, paring down my belongings to an absolute minimum, and choosing U-Haul.&lt;br /&gt;&lt;br /&gt;I would also be very careful about investing in a country without a long-term plan (e.g. for retirement).&lt;br /&gt;&lt;br /&gt;The ultimate lesson is to do homework, and find professionals that you can trust. Just as you need a doctor and a dentist in life, in this arena, you need a cross-border accountant, an immigration attorney, and a financial planner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7128281514291290799?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7128281514291290799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7128281514291290799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7128281514291290799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7128281514291290799'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/09/moving-details.html' title='Moving Details'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-785395920636938117</id><published>2010-08-05T17:00:00.000-07:00</published><updated>2010-08-06T08:19:23.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meet me in st louis'/><title type='text'>Strange Loop 2010: a rhapsody</title><content type='html'>&lt;b&gt;&lt;i&gt;"Dammit, Alex!"&lt;/i&gt;&lt;/b&gt; Our hero sets down his glass of Crown Royal, and rubs his eyes. The LCD monitors glow, lighting the dark cottage like a cyber fireplace. Outside, a loon's forlorn call pierces the still night, echoing along the moonlit, glassy lake. Soon, it will be daybreak.&lt;br /&gt;&lt;br /&gt;With a furrowed brow, our man returns to planning his trip. We know this much: he will visit Saint Louis in the fall. A triumphant reunion with friends and, perhaps, with an unrequited love from Spain (with whom he might have had a torrid fling, if not for an unfortunate Google translation of 'NP-Hard problems', over &lt;i&gt;tapas&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"Focus, man!"&lt;/i&gt;&lt;/b&gt; The question is: &lt;i&gt;when?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The sentimental choice is mid-November. He could celebrate his birthday with friends. &lt;a href="http://www.cinemastlouis.org/"&gt;The Saint Louis International Film Festival&lt;/a&gt; doubles the allure, providing a perfect book-end to last year, when a wretched Romanian movie gave him startling insight. Late October works too, when cherished non-tech friends will gather to remember a weekend spent, with no electricity and a lone bottle of absinthe, in a Kansas City bus terminal. Nasty stuff, that KC.&lt;br /&gt;&lt;br /&gt;And then, there is the rub: &lt;a href="http://strangeloop2010.com/"&gt;Strange Loop&lt;/a&gt; on October 14-15. Our hero is torn. It would be great to see his geek compadres again, and Alex Miller has assembled a &lt;a href="http://strangeloop2010.com/speakers"&gt;line-up&lt;/a&gt; that is a tech &lt;a href="http://en.wikipedia.org/wiki/Murderers%27_Row"&gt;Murderers' Row&lt;/a&gt;.  But, the timing is tricky. As are the logistics. There are other choices: SLIFF, Halloween, &lt;i&gt;la mujer&lt;/i&gt;! There are a dozen reasons why it just won't work!&lt;br /&gt;&lt;br /&gt;With drink in hand, he rises to his feet and looks down at &lt;a href="http://www.codersatwork.com/"&gt;'Coders At Work'&lt;/a&gt;, laying open on the desk, radiant in the cyber glow. &lt;i&gt;Zounds:&lt;/i&gt; the table of contents reveal interviews with Guy Steele and Douglas Crockford.&lt;br /&gt;&lt;br /&gt;Both men are &lt;a href="http://strangeloop2010.com/speakers"&gt;keynote speakers at Strange Loop 2010&lt;/a&gt;. Early-bird registration ends &lt;a href="http://strangeloop2010.com/pages/register"&gt;August 6th.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Well done, sir."&lt;/b&gt;, our hero smiles. &lt;b&gt;&lt;i&gt;"Checkmate."&lt;/i&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-785395920636938117?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/785395920636938117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=785395920636938117' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/785395920636938117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/785395920636938117'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/08/strange-loop-2010-rhapsody.html' title='Strange Loop 2010: a rhapsody'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1698410673665650885</id><published>2010-06-28T15:39:00.001-07:00</published><updated>2010-06-28T15:51:01.669-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quick update'/><title type='text'>Settling In and Spooling Up</title><content type='html'>This post is overdue, but as a shout-out to friends to whom I've not yet emailed, I've made it to eastern Canada, even if my belongings have not -- yet.&lt;br /&gt;&lt;br /&gt;It has been a long journey, from a touching series of farewells in Saint Louis, though the ~1800 mile drive that touched 11 states and 2 provinces.&lt;br /&gt;&lt;br /&gt;Though not completely 'settled in' just yet, I am definitely spooling up: I've been at the new gig for over a week now.&lt;br /&gt;&lt;br /&gt;Because of the job search and subsequent move, there is a fairly large backlog of ideas for blog posts. We'll see how far I get, but I suspect the next post will be a public service to a distinct niche audience: detailing the aspects of an international move. I'll post some of the facts that I wish I had known when I started.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1698410673665650885?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1698410673665650885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1698410673665650885' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1698410673665650885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1698410673665650885'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/06/settling-in-and-spooling-up.html' title='Settling In and Spooling Up'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2268723252892879650</id><published>2010-05-31T07:32:00.000-07:00</published><updated>2010-06-01T10:24:18.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='courage'/><title type='text'>A New Chapter</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;For most of us here being islanders is a terminal condition. &lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;But those who go away aren't cured. &lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;br /&gt;They simply die of the same ailment on alien soil.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-- &lt;a href="http://www.cbc.ca/arts/story/2008/08/15/ledwell-obit.html"&gt;Frank Ledwell&lt;/a&gt;, &lt;a href="http://www.amazon.com/North-Shore-Home-Frank-Ledwell/dp/1894838041"&gt;The North Shore of Home&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;After more than a decade in St Louis, and much introspection, I am moving back to my home province, &lt;a href="http://en.wikipedia.org/wiki/Prince_Edward_Island"&gt;Prince Edward Island&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My friends and family know that I have been torn between (a) terrific friends and an increasingly hot tech scene in St Louis and (b) the distance from family and the tortures of holiday air travel. Thankfully, the burgeoning tech community on PEI has opened doors for me, and I've summoned the courage to recognize priorities outside of my career.&lt;br /&gt;&lt;br /&gt;I'm tempted to thank individual people in St Louis, but the list is simply too long and I'll be sure to miss someone. Though there is some overlap, here are some key groups, relating to tech:&lt;br /&gt;&lt;br /&gt;I've been attending the &lt;a href="http://java.ociweb.com/javasig/"&gt;St Louis Java User Group&lt;/a&gt; for many years, and countless presentations. It is such an enduring fixture in St Louis, and I appreciated the sponsors (and frequent speakers) so much that I applied to work there (see below).&lt;br /&gt;&lt;br /&gt;As a big Groovy fan, I've enjoyed the &lt;a href="http://www.meetup.com/GatewayGroovyUsers/"&gt;Gateway Groovy Users Group&lt;/a&gt;. It terrific to have a dedicated group for Groovy and Grails, and the organizers are first-class.&lt;br /&gt;&lt;br /&gt;The biggest splash in the last few years is, undoubtedly, &lt;a href="http://lambdalounge.org/"&gt;the Lambda Lounge&lt;/a&gt;. Some wondered if the St Louis area could support a user group dedicated to eclectic, hardcore nerdiness. The answer is a &lt;span style="font-style: italic;"&gt;resounding&lt;/span&gt; yes!&lt;br /&gt;&lt;br /&gt;A big thanks to everyone at &lt;a href="http://ociweb.com/"&gt;OCI&lt;/a&gt; / &lt;a href="http://stladvantage.com/"&gt;Advantage&lt;/a&gt;. I've grown so much in terms of interesting clients, writing, giving presentations, and from observing my colleagues do the same. I love the college-style culture, and am simultaneously inspired and humbled by your talent.&lt;br /&gt;&lt;br /&gt;Most of all, thanks to my friends from the various gigs, user groups, conferences, and pub nights. It has been a great run, with some fun stunts along the way.&lt;br /&gt;&lt;br /&gt;I plan to visit regularly, so between this blog, Twitter, and return trips, we'll stay in touch.&lt;br /&gt;&lt;br /&gt;To the geeks in the Maritimes: please get in touch! I'll be eager to meet up and talk tech.&lt;br /&gt;&lt;br /&gt;ps. The quote is by the late &lt;a href="http://www.cbc.ca/arts/story/2008/08/15/ledwell-obit.html"&gt;Frank Ledwell&lt;/a&gt;, a former English prof at UPEI, and a beloved Island poet. I found the poem both charming and haunting when I first read it, in 1991, and have never forgotten it.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2268723252892879650?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2268723252892879650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2268723252892879650' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2268723252892879650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2268723252892879650'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/05/new-chapter.html' title='A New Chapter'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3156234429034940709</id><published>2010-05-24T19:24:00.000-07:00</published><updated>2010-05-25T07:24:10.081-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='no fluff just stuff'/><title type='text'>10 Thoughts as an Attendee at NFJS</title><content type='html'>(Full disclosure: I work for &lt;a href="http://stladvantage.com/"&gt;a sponsor&lt;/a&gt; of the &lt;a href="http://www.nofluffjuststuff.com/home/main"&gt;Gateway Software Symposium&lt;/a&gt; and, this year, was also a speaker).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Rather than write about obvious trends (e.g. document databases are hot) or review big name speakers (how can you &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; know &lt;a href="http://twitter.com/tedneward"&gt;Ted Neward&lt;/a&gt;, &lt;a href="http://twitter.com/neal4d"&gt;Neal Ford&lt;/a&gt;, and &lt;a href="http://twitter.com/kensipe"&gt;Ken Sipe&lt;/a&gt; !), I thought I would write some quick thoughts about GSS 2010 as an attendee. Another post will be about my initial stint as a speaker.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Use Evaluations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jay Zimmerman made an excellent point: when speaking, take every opportunity to use evaluations at your talks, including your local JUGs. If your JUG doesn't have evals, then &lt;span style="font-style: italic;"&gt;make your own&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;LiquiBase and My Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I really enjoyed a talk on &lt;a href="http://www.liquibase.org/"&gt;LiquiBase&lt;/a&gt; and Agile DB Development by &lt;a href="http://twitter.com/tlberglund"&gt;Tim Berglund&lt;/a&gt;. He described a category of problems / solutions with which I was only barely aware. He highly recommends the book &lt;a href="http://www.amazon.com/gp/product/B001QAP36E/ref=pd_lpo_k2_dp_sr_2?pf_rd_p=486539851&amp;amp;pf_rd_s=lpo-top-stripe-1&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=0321293533&amp;amp;pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_r=0YC9Q19P11ZE26DWSSMF"&gt;Refactoring Databases&lt;/a&gt;, and I'll definitely check it out.&lt;br /&gt;&lt;br /&gt;Interestingly, when describing the talk to a close friend and colleague, my friend told me that his team was using LiquiBase. I was stunned. We work on the same floor, and yet I didn't know this. We all know conferences bring people together, but often it is within the same department.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hawthorne Effect / Psychology&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Several talks reminded me of how much psychology (and neuroscience) comes into play in software development. As one example, check out the &lt;a href="http://en.wikipedia.org/wiki/Hawthorne_effect"&gt;Hawthorne Effect&lt;/a&gt; (as explained to us by &lt;a href="http://twitter.com/neal4d"&gt;Neal Ford&lt;/a&gt;). What's more, use it on your team, and in your personal life. e.g. For me, I exercise more often if I track my distance / rate, so that I know where my personal trend is headed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Visualizing Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neal Ford gave a talk that listed a dozen tools for viewing code in weird and wonderful ways. The best part is that I wasn't familiar with any of them. It feels like a violation of intellectual property to enumerate them here in a garish list, but as one example, check out &lt;a href="http://www.inf.usi.ch/phd/wettel/codecity.html"&gt;Code City&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Books == Quality&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A former mentor of mine said that he has noticed that he can tell the best developers by what they read. Always ask your friends what they are reading. Seek recommendations everywhere. Some favourites from the NoFluffers are &lt;a href="http://www.amazon.com/Predictably-Irrational-Hidden-Forces-Decisions/dp/006135323X"&gt;Predictably Irrational&lt;/a&gt; and the &lt;a href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1274790205&amp;amp;sr=1-1"&gt;Design of Every Day Things&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Virtualization Imperative&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Virtualization is going to be commonplace. I realized the following, during a excellent talk by &lt;a href="http://twitter.com/prpatel"&gt;Pratik Patel&lt;/a&gt;: with free options for virtualization software and the OS, we have &lt;span style="font-style: italic;"&gt;no excuse&lt;/span&gt; not to try this at home. We should experiment so that we are ready for the inevitable in a corporate environment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fault Lines&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tim Bergland gave a talk on Decision Making that included team dynamics. He used an analogy of fault lines to represent the divisions that can occur across teams. Wonderful stuff. This is precisely the phenomenon that happens between DBAs and devs, testers and devs, and, of course, managers and everyone else.&lt;br /&gt;&lt;br /&gt;I don't have time to explore this idea further, but are there hidden fault lines? Do we intuitively partition our teams across sociological lines that, strictly speaking, do not belong in the workplace? (e.g. age, religious views, political stance). It's something to consider, and the answers may not be pretty.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Failure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://viewfromthefringe.blogspot.com/"&gt;Brian Gilstrap&lt;/a&gt; asked the Expert Panel about specific instances of failure. It was interesting to see how the panelists chose to define failure, and how the scope could range from the individual, team, or organization. Though good stories come from brilliant innovation or clever design, the best tall tales come from failures.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ntschutta"&gt;Nate Schutta&lt;/a&gt; made a great point: civil engineers around the world will study a report on why &lt;a href="http://en.wikipedia.org/wiki/I-35W_Mississippi_River_bridge"&gt;a bridge collapses&lt;/a&gt;. Though proprietary code is an issue here, why don't software engineers do the same?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Don't Fear Reinforcement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I noticed several friends attended talks on subjects with which they were familiar, as they wanted to pan for a few more gold nuggets from the talk. e.g. &lt;a href="http://twitter.com/jamescarr"&gt;James Carr&lt;/a&gt; gave a great talk on &lt;a href="http://code.google.com/p/mockito/"&gt;Mockito&lt;/a&gt;. I've been using Mockito for some time now. There is an argument for me to broaden my horizons, but I went to the talk and had some revelations about Mockito's Spy object.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10 Year Arc &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I attended NFJS shows in St Louis for nearly a decade, and almost always in the same venue. It's become a fascinating reference point as the years go by.&lt;br /&gt;&lt;br /&gt;Technically, if we had an animated graph across that timeline, you would see some technologies appear and disappear (XSLT), while others grow strong (Grails). Some of them are continually berated and yet refuse to die (Swing).&lt;br /&gt;&lt;br /&gt;I've seen speakers make a point in a given conference room, where &lt;a href="http://twitter.com/pragdave"&gt;Dave Thomas &lt;/a&gt;made the same point, &lt;span style="font-style: italic;"&gt;possibly in the same room&lt;/span&gt;, years before. I've seen &lt;a href="http://twitter.com/mark_volkmann"&gt;Mark Volkmann&lt;/a&gt; ask the expert panel "what is the next big thing?" circa 2004. Today, we would find the answers either quaint or downright prescient (re: languages on the JVM).&lt;br /&gt;&lt;br /&gt;There is a piano in the lobby of the&lt;a href="http://www.marriott.com/hotels/travel/stlwe-st-louis-marriott-west/"&gt; Marriott West&lt;/a&gt;. Once, I wondered how marvelous it would be to play it. Though barely an intermediate, I now brazenly sit down at it, and gleefully bang out a hamfisted tune.&lt;br /&gt;&lt;br /&gt;Over the years, that piano has seen a lot of speakers, attendees, trends, and technologies.&lt;br /&gt;&lt;br /&gt;But mostly, it has seen changes. I will remember it fondly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3156234429034940709?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3156234429034940709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3156234429034940709' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3156234429034940709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3156234429034940709'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/05/10-thoughts-as-attendee-at-nfjs.html' title='10 Thoughts as an Attendee at NFJS'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5922095752703810225</id><published>2010-05-19T19:47:00.001-07:00</published><updated>2010-05-19T19:54:09.368-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='no fluff just stuff'/><title type='text'>No Fluff, Just Stuff in St Louis</title><content type='html'>Like &lt;a href="http://blog.james-carr.org/2010/05/19/gateway-software-symposium/"&gt;James Carr&lt;/a&gt;, the upcoming &lt;a href="http://www.nofluffjuststuff.com/conference/st_louis/2010/05/home"&gt;Gateway Software Symposium&lt;/a&gt; will be a mix of new and old for me: I've attended many (probably every one of them) over the years; this year, I will be speaking on &lt;a href="http://gradle.org/"&gt;Gradle&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been studying Gradle exclusively in the past months, and look forward to exploring my findings in the session. I'll have gone full circle from a heckler in the back (not really) to being up front and center.&lt;br /&gt;&lt;br /&gt;Just as much, though, I look forward to the energy from the speakers and the crowd. I have always been an unabashed fan of NFJS: it was an excellent idea right from the start. Be sure to say hello at the show....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5922095752703810225?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5922095752703810225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5922095752703810225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5922095752703810225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5922095752703810225'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/05/no-fluff-just-stuff-in-st-louis.html' title='No Fluff, Just Stuff in St Louis'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7941435475399331255</id><published>2010-05-02T18:54:00.001-07:00</published><updated>2010-05-02T19:03:17.719-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='making deals'/><title type='text'>Just Do Something</title><content type='html'>Hello from CtJ HQ! It has been a long spell since posting. There are reasons why, but mostly pedestrian excuses.&lt;br /&gt;&lt;br /&gt;As many do, I have spells when I break out of my usual rhythm. Usually, this pertains to exercise or practicing a musical instrument.&lt;br /&gt;&lt;br /&gt;In these cases, I've learned to "just do something".&lt;br /&gt;&lt;br /&gt;For example, if I'm out of my routine for the gym, the experience of being a (former) triathlete makes me feel like my first work-out should be a dandy. This leads to pressure, which causes fear, etc. The "deal" is that it is OK to just run a couple of miles, at any pace I want. The true goal is to start again, with a pleasant experience; the means to the end is: &lt;span style="font-style: italic;"&gt;just do something&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This simple idea has helped me tremendously in the past, and now via this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7941435475399331255?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7941435475399331255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7941435475399331255' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7941435475399331255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7941435475399331255'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/05/just-do-something.html' title='Just Do Something'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4889700740488628870</id><published>2010-01-27T19:20:00.000-08:00</published><updated>2010-01-28T06:34:13.643-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gant'/><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='ivy'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Rosetta Stone for Java Build Tools</title><content type='html'>A &lt;a href="http://codetojoy.blogspot.com/2010/01/easters-eggs-for-groovy.html"&gt;previous post&lt;/a&gt; introduced the idea behind &lt;span style="font-weight: bold;"&gt;Easter's Eggs&lt;/span&gt;: quality examples that I'll use for reference and am sharing with the world.&lt;br /&gt;&lt;br /&gt;My latest effort is a modest work in progress. The idea is to build a &lt;a href="http://en.wikipedia.org/wiki/Rosetta_Stone"&gt;Rosetta Stone&lt;/a&gt; example for Java build tools. In particular: Ant, Ivy, Maven, Gant, and Gradle.&lt;br /&gt;&lt;br /&gt;It's called &lt;a href="http://github.com/codetojoy/easter_eggs_for_build_tools"&gt;Easter's Eggs for Build Tools&lt;/a&gt; and is hosted on GitHub. (You can download without an account.)&lt;br /&gt;&lt;br /&gt;My main motivation is that most build tools have solid examples, but when dealing with build issues, chances are, &lt;span style="font-style: italic;"&gt;I'm in a hurry&lt;/span&gt;. I don't have time to understand some new, contrived example. And for new tools, I don't care about bells and whistles. &lt;span style="font-weight: bold;"&gt;I just want to see something that works!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Consequently, I decided to develop the &lt;span style="font-style: italic;"&gt;same&lt;/span&gt; examples across different tools.&lt;br /&gt;&lt;br /&gt;Currently, it features only a simple project containing a POJO, a Hibernate mapping, and an integration test. This project is expressed in several forms, and the test should pass in each one. (Consult the respective README.txt)&lt;br /&gt;&lt;br /&gt;I don't envision &lt;span style="font-style: italic;"&gt;many&lt;/span&gt; more projects, but I'd like to develop a multi-project example and probably a war file.&lt;br /&gt;&lt;br /&gt;Some of the examples took serious effort, as I'm a newbie to some of these tools. I sincerely hope this helps someone who is looking for a foothold.&lt;br /&gt;&lt;br /&gt;Feedback is always welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4889700740488628870?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4889700740488628870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4889700740488628870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4889700740488628870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4889700740488628870'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/01/rossetta-stone-for-java-build-tools.html' title='Rosetta Stone for Java Build Tools'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1559228910287773271</id><published>2010-01-25T18:32:00.000-08:00</published><updated>2010-01-25T18:43:37.796-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='highlights'/><title type='text'>Syntax Highlighting on Blogger</title><content type='html'>A big shout-out to your friend and mine, Ken Sipe, for &lt;a href="http://kensipe.blogspot.com/2009/11/syntax-highlighting-on-blogspot.html"&gt;his recent post&lt;/a&gt; on adding syntax highlighting to Blogger. (And many thanks to &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Hosting"&gt;Alex Gorbatchev&lt;/a&gt; for the original work.)&lt;br /&gt;&lt;br /&gt;Some notes:&lt;br /&gt;&lt;br /&gt;My experience matches Ken's, in that it is best to put the links just before the &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt; tag.&lt;br /&gt;&lt;br /&gt;The highlighting doesn't take effect when writing the post, or in preview mode (presumably because the templating engine isn't emitting the &lt;code&gt;head&lt;/code&gt; section). You have to publish it.&lt;br /&gt;&lt;br /&gt;One trick for initial testing is to add highlighting to an older post that contains code, and republish.&lt;br /&gt;&lt;br /&gt;Finally, don't limit yourself to the list on this &lt;a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html"&gt;excellent post&lt;/a&gt;. Chances are, your language has support (e.g. &lt;a href="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushGroovy.js"&gt;Groovy&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1559228910287773271?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1559228910287773271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1559228910287773271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1559228910287773271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1559228910287773271'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/01/syntax-highlighting-on-blogger.html' title='Syntax Highlighting on Blogger'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2554467924542371087</id><published>2010-01-25T18:22:00.000-08:00</published><updated>2010-01-25T18:28:44.249-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='explict'/><title type='text'>5 Words on Test Organization</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Instead&lt;/span&gt; of this:&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;void testCallListReportData() {&lt;br /&gt;   controller.programService = programService&lt;br /&gt;   def program = Program.findByName(Keys.PROGRAM_ABC)&lt;br /&gt;   assertEquals Keys.PROGRAM_ABC, program.name&lt;br /&gt;   def student = Student.findByLastName(Keys.STUDENT)&lt;br /&gt;   assertEquals Keys.STUDENT, student.lastName&lt;br /&gt;   mockParams.id = program.id&lt;br /&gt;   def reportData = controller.callListReportData()&lt;br /&gt;   assertEquals Keys.PROGRAM_ABC, mockParams['PROGRAM_NAME']        &lt;br /&gt;   assertNotNull reportData&lt;br /&gt;   def thisMap = reportData[0]&lt;br /&gt;   assertEquals student.fullName(), thisMap['STUDENT_NAME']&lt;br /&gt;   assertEquals Keys.CONTACT_EMAIL, thisMap['CONTACT_EMAIL']&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prefer&lt;/span&gt; this:&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;void testCallListReportData() {&lt;br /&gt;   controller.programService = programService&lt;br /&gt;   def program = Program.findByName(Keys.PROGRAM_ABC)&lt;br /&gt;   assertEquals Keys.PROGRAM_ABC, program.name&lt;br /&gt;   def student = Student.findByLastName(Keys.STUDENT)&lt;br /&gt;   assertEquals Keys.STUDENT, student.lastName&lt;br /&gt;   mockParams.id = program.id&lt;br /&gt;  &lt;br /&gt;   // test&lt;br /&gt;   def reportData = controller.callListReportData()&lt;br /&gt;  &lt;br /&gt;   assertEquals Keys.PROGRAM_ABC, mockParams['PROGRAM_NAME']        &lt;br /&gt;   assertNotNull reportData&lt;br /&gt;   def thisMap = reportData[0]&lt;br /&gt;   assertEquals student.fullName(), thisMap['STUDENT_NAME']&lt;br /&gt;   assertEquals Keys.CONTACT_EMAIL, thisMap['CONTACT_EMAIL']&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2554467924542371087?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2554467924542371087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2554467924542371087' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2554467924542371087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2554467924542371087'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/01/5-words-on-test-organization.html' title='5 Words on Test Organization'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3584217139840505428</id><published>2010-01-11T10:20:00.000-08:00</published><updated>2010-01-11T10:42:01.730-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Easter's Eggs for Groovy</title><content type='html'>This blog receives many hits for "Groovy file" and "Groovy IO". To help newbies with Groovy, and for my own reference, I've started a small project over on GitHub called &lt;a href="http://github.com/codetojoy/easter_eggs_for_groovy"&gt;Easter's Eggs for Groovy&lt;/a&gt;. (Note: You don't need an account to download the project.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No&lt;/span&gt;, these eggs are &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; &lt;a href="http://en.wikipedia.org/wiki/Easter_egg_%28media%29"&gt;hidden tricks&lt;/a&gt; to unlock functionality. Define an "egg" to be a small example to get you started with an idea. This project has some basic eggs for Groovy. It is by no means exhaustive, but does offer the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;eggs for Groovy collection methods, regex's, and IO&lt;/li&gt;&lt;li&gt;examples of testing in Groovy. In fact, most of the code is in the tests!&lt;/li&gt;&lt;li&gt;a build structure using &lt;a href="http://gant.codehaus.org/"&gt;Gant&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Please let me know if there are any examples you'd like to see, or if this is useful for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3584217139840505428?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3584217139840505428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3584217139840505428' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3584217139840505428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3584217139840505428'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/01/easters-eggs-for-groovy.html' title='Easter&apos;s Eggs for Groovy'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4123057457463630341</id><published>2010-01-08T10:19:00.000-08:00</published><updated>2010-01-08T10:40:06.040-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><title type='text'>Grails tip for internet connections</title><content type='html'>I encountered the following issue when configuring Grails, and am posting in case it helps anyone via The Google. Thanks to &lt;a href="http://weblog.dangertree.net/"&gt;Matt Taylor&lt;/a&gt; for the info.&lt;br /&gt;&lt;br /&gt;If you receive this error message for a grails command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Error reading remote plugin list [Connection timed out: connect], building locally...&lt;br /&gt;Unable to list plugins, please check you have a valid internet connection:&lt;br /&gt;Connection timed out: connect&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;you may think the &lt;a href="http://www.grails.org/plugin/home"&gt;plugin site&lt;/a&gt; is down. Probably not: it's more likely that you're behind a proxy server. Try this command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;grails set-proxy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To determine the values requested, do the following steps:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In FireFox, go to Tools -&gt; Options -&gt; Advanced -&gt; Settings and find the value for 'Automatic proxy configuration URL'&lt;/li&gt;&lt;li&gt;View the URL and determine the values used for your IP&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4123057457463630341?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4123057457463630341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4123057457463630341' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4123057457463630341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4123057457463630341'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2010/01/grails-tip-for-internet-connections.html' title='Grails tip for internet connections'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3118588930315137462</id><published>2009-12-19T17:11:00.000-08:00</published><updated>2009-12-19T17:20:45.176-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='downtime'/><title type='text'>Friday</title><content type='html'>A recent post has been deleted from this space. It was a sincere, if boring, piece, by a guest writer, with an underlying message on the importance of logging out of all browsers on shared computers, even when at home on holidays.&lt;br /&gt;&lt;br /&gt;In its stead, I offer this: my thanks to you, the &lt;span style="font-style: italic;"&gt;CodeToJoy nation,&lt;/span&gt; for another fun year, and best wishes ahead in 2010. If you are travelling, may you be safe and on time. Keep laughing (often, that's all you can do.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3118588930315137462?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3118588930315137462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3118588930315137462' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3118588930315137462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3118588930315137462'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/12/friday_19.html' title='Friday'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8709641068684872722</id><published>2009-12-06T18:31:00.001-08:00</published><updated>2009-12-08T19:37:41.133-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='getting my blog on'/><title type='text'>On Analogies: Mozart, Mondrian, Kandel</title><content type='html'>After the Strange Loop conference, Michael Galpin wrote (as an aside) that he doesn't like &lt;a href="http://fupeg.blogspot.com/2009/10/minimalism-programming-huh.html"&gt;analogies to software engineering&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been meaning to write for awhile; this post celebrates analogies and provides a few of my current favourites.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I've been making analogies for a long time. My favourite teachers made them, and as an undergrad, when tutoring others in calculus, they came naturally to me. To this day, I'm always trying to frame problems in some other context, either to non-IT people or domain experts. I'm convinced that there is a biochemical reward for nailing one. E.g. when another techie says "&lt;span style="font-style: italic;"&gt;that's exactly right&lt;/span&gt;". (The reward is probably a cousin to that of making an excellent pun.)&lt;br /&gt;&lt;br /&gt;To be fair, Michael talks about romantic analogies to &lt;span style="font-style: italic;"&gt;software engineering&lt;/span&gt;, whereas many of my analogies have the granularity of &lt;span style="font-style: italic;"&gt;problems in&lt;/span&gt; software engineering. But no matter: be it an analogy, metaphor, or allegory, you can &lt;span style="font-weight: bold;"&gt;count me in&lt;/span&gt;. This is especially true for keynote presentations, which should be thoughtful and imaginative. If a tech talk is a pop song, a keynote speech is a symphony. (There I go again, but hey this blog was &lt;a href="http://codetojoy.blogspot.com/2007/01/tale-of-two-themes.html"&gt;started on a musical analogy&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Now, I happily grant that analogies have their place. If you're working at a start-up, frenetically trying to hit some deadline, then &lt;span style="font-weight: bold;"&gt;no one&lt;/span&gt; wants to hear how your design was inspired by a &lt;a href="http://en.wikipedia.org/wiki/Chopin_nocturnes"&gt;Chopin nocturne&lt;/a&gt;. There's a time for straight-talk. I'm with Michael there.&lt;br /&gt;&lt;br /&gt;With that background, here are some ideas that have lit my fire lately. They may or may not be pure analogies, but they have sparked my imagination.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mozart's K 522 - A Musical Joke&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wolfgang wrote a piece, &lt;a href="http://en.wikipedia.org/wiki/A_Musical_Joke"&gt;A Musical Joke (K. 522)&lt;/a&gt;, that satirizes clumsy composition. It intentionally uses common "mistakes" made by inept composers.&lt;br /&gt;&lt;br /&gt;Ever since the &lt;a href="http://lambdalounge.org/2009/05/05/may-meeting/"&gt;vending machine shoot-out&lt;/a&gt; at the Lambda Lounge, I've wanted to write a spoof version in Java: my own modest K. 522. Its ostensible goal is a &lt;span style="font-style: italic;"&gt;functional&lt;/span&gt; style of the vending machine spec: no side-effects or mutable state.&lt;br /&gt;&lt;br /&gt;However, in my spoof, the poor author goes off the tracks, because &lt;span style="font-weight: bold;"&gt;all computation&lt;/span&gt; is done by &lt;span style="font-style: italic;"&gt;throwing checked exceptions&lt;/span&gt;. The program will be absolutely gorgeous in its wretchedness!&lt;br /&gt;&lt;br /&gt;I've started this project, but unfortunately it quickly became so painful that I couldn't bear it. However, I hope one day to have an entire theme of K. 522 projects over on &lt;a href="http://github.com/codetojoy/"&gt;github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mondrian and De Stijl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm no connaisseur of fine art, but I've taken a class or two and enjoyed learning about its history. My major discovery (blogged elsewhere) is that much of art occurs in reaction to a prior context. It dawned on me that at a gallery, a new exhibit can often be a major "&lt;span style="font-style: italic;"&gt;screw you&lt;/span&gt;" to the establishment of the time. What appears to be a simple painting, when viewed in context, can be startlingly rebellious or profound.&lt;br /&gt;&lt;br /&gt;Consider this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lfuDZjhLbAM/SxxzYvSGaUI/AAAAAAAAAVQ/eVDd8d2mpeA/s1600-h/400px-Mondrian_lookalike.svg.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_lfuDZjhLbAM/SxxzYvSGaUI/AAAAAAAAAVQ/eVDd8d2mpeA/s320/400px-Mondrian_lookalike.svg.png" alt="" id="BLOGGER_PHOTO_ID_5412327721038932290" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:times new roman;"&gt;'Picture by &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://www.haykranen.com/" class="external text" rel="nofollow"&gt;Hay Kranen&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt; / &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://creativecommons.org/licenses/by/3.0/nl/deed.en" class="external text" rel="nofollow"&gt;CC-BY&lt;/a&gt;&lt;span style="font-family:times new roman;"&gt;'.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://commons.wikimedia.org/wiki/File:Mondrian_lookalike.svg"&gt;This image&lt;/a&gt; is inspired by &lt;a href="http://en.wikipedia.org/wiki/Piet_Mondrian"&gt;Piet Mondrian&lt;/a&gt;'s work, a founder of the &lt;a href="http://en.wikipedia.org/wiki/De_Stijl"&gt;De Stijl style&lt;/a&gt; (also known as NeoPlasticism).&lt;br /&gt;&lt;br /&gt;As a quick primer on De Stijl: it's a Dutch art movement founded circa 1918, intended as an &lt;a href="http://www.askart.com/askart/interest/Modernism_2.aspx?id=75"&gt;intellectual response&lt;/a&gt; to the chaos of war. As noted in &lt;a href="http://en.wikipedia.org/wiki/File:Manifest_I_of_De_Stijl.JPG"&gt;their manifesto&lt;/a&gt; (!), the artists sought to find inner harmony within themselves and universal laws of simple geometry.&lt;br /&gt;&lt;br /&gt;I have a few thoughts on this. The obvious one is apparently &lt;span style="font-style: italic;"&gt;everyone&lt;/span&gt; needs a manifesto, from artists in 1918 to software artisans in the 21st-century (exhibits &lt;a href="http://agilemanifesto.org/"&gt;A&lt;/a&gt;, &lt;a href="http://www.soa-manifesto.org/"&gt;B&lt;/a&gt;, and &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;C&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The second reaction, from a software standpoint, is &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt;. Agreed, it's clearly insane to compare WS-*, SOAP, etc with the horrors of World War I, but consider how simple this URL is:&lt;br /&gt;&lt;pre&gt;http://esite.com/product/show/1&lt;/pre&gt;Call me crazy, but I genuinely sense a kind of abstract connection to the orthogonal lines in Mondrian's work, especially against the busy, noisy chaos of Web Services.  Imagine standing outside a giant, enterprise-y WS conference with that URL on a large placard. Reaction to a prior context.&lt;br /&gt;&lt;br /&gt;Finally, recall that the REST movement similarly came from an explicit intellectual genesis, famously being &lt;a href="http://en.wikipedia.org/wiki/Roy_Fielding"&gt;a PhD thesis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note that, above, I said &lt;span style="font-style: italic;"&gt;abstract connection&lt;/span&gt;: this is &lt;span style="font-weight: bold;"&gt;not equating&lt;/span&gt; art to software engineering. They just rhyme for me, in some weird way.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kandel and Aplysia&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm currently reading an excellent book, &lt;a href="http://www.amazon.com/Search-Memory-Emergence-Science-Mind/dp/0393058638"&gt;In Search Of Memory&lt;/a&gt;, by &lt;a href="http://en.wikipedia.org/wiki/Eric_Kandel"&gt;Eric Kandel&lt;/a&gt;, a Nobel-Prize winner in neuroscience. Part biography, and part history of his scientific journey, it is wonderful.&lt;br /&gt;&lt;br /&gt;In a key chapter of his career, Kandel sought to understand the biological mechanism behind short-term memory. In the early 1960s, the conventional wisdom favoured mammals over invertebrates for research. The thinking was to stay as close to the goal (the human brain) as possible.&lt;br /&gt;&lt;br /&gt;Kandel went in the other direction. He wanted a reductionist approach that explained short-term memory in a minimalist setting. He ultimately chose a sea slug called &lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/Aplysia_californica"&gt;Aplysia Californica&lt;/a&gt;. This species matched his instinctual desire to keep things simple: &lt;span style="font-style: italic;"&gt;Aplysia&lt;/span&gt; has a small number of neural cells, which are quite large (i.e. easier to study). It also has a simple reflex (withdrawing its siphon, and inking) which ultimately proved to respond to forms of learning (e.g. habituation and sensitization).&lt;br /&gt;&lt;br /&gt;It was a wise choice. By 1969-1970, Kandel and his colleagues had discovered &lt;span style="font-style: italic;"&gt;several&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;major&lt;/span&gt; principles of the cell biology of learning and memory. In essence, they built a entire conceptual framework for learning and memory, and were able to verify it in the "laboratory" of the &lt;span style="font-style: italic;"&gt;Aplysia&lt;/span&gt;.  The humble sea slug was a gold mine for his career and for science.&lt;br /&gt;&lt;br /&gt;Although completely glorious in its own right, my take on this for us, humble software developers, is this: Kandel not only discovered terrific scientific ideas, but provides an &lt;span style="font-weight: bold;"&gt;object lesson&lt;/span&gt; on &lt;span style="font-style: italic;"&gt;how to do research&lt;/span&gt;. This is the absolute embodiment of &lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For example, imagine that you are struggling with a concurrency concept in a large project. Or the precise mechanism of transaction propogation in Spring. Or the dreaded gridbag layout in Swing. You may be resistant to starting a new tiny project -- your very own &lt;span style="font-style: italic;"&gt;Aplysia&lt;/span&gt; -- for the sake of isolating the exact issue of concern.&lt;br /&gt;&lt;br /&gt;"Who has that kind of time?", you may cry, as I often have. Well, if you want the real answer, &lt;span style="font-weight: bold;"&gt;make the time&lt;/span&gt;. Think of Kandel. Reduce, reduce, reduce: KISS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Though I can enjoy art and music as pure pleasure, I love finding parallels between disparate subjects. Often, the best way to convey these psychic fingerprints are through analogy. So, sign me up.&lt;br /&gt;&lt;br /&gt;As mentioned above, I realize these are &lt;span style="font-style: italic;"&gt;abstract &lt;/span&gt;connections. I don't fancy myself as a composer, artist, or neuroscientist. I don't equate my career to such enterprises to make it more glamorous. Thankfully, I &lt;span style="font-weight: bold;"&gt;already &lt;/span&gt;find my career to be glamorous, as it grants me elements of both art &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; science.&lt;br /&gt;&lt;br /&gt;All I'm saying is:&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;&lt;a href="http://en.wikipedia.org/wiki/File:Mug_and_Torus_morph.gif"&gt;a torus is like a mug&lt;/a&gt;.&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8709641068684872722?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8709641068684872722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8709641068684872722' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8709641068684872722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8709641068684872722'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/12/on-analogies-mozart-mondrian-kandel.html' title='On Analogies: Mozart, Mondrian, Kandel'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lfuDZjhLbAM/SxxzYvSGaUI/AAAAAAAAAVQ/eVDd8d2mpeA/s72-c/400px-Mondrian_lookalike.svg.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6163624620494292542</id><published>2009-11-08T18:52:00.000-08:00</published><updated>2009-11-08T19:53:29.437-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='free advice'/><title type='text'>Career Cultivation and Creativity</title><content type='html'>Dean Wampler wrote &lt;a href="http://blog.polyglotprogramming.com/2009/11/6/cultivateyourcareertoday"&gt;an excellent article&lt;/a&gt; about the importance of cultivating your career, and provides some ways to do so. A thoughtful piece with some great ideas.&lt;br /&gt;&lt;br /&gt;In classic piggyback style, I thought I might add some suggestions. I'll keep this brief, as I fear an audience mismatch: those who might benefit most from these kinds of blog posts are the people &lt;span style="font-style: italic;"&gt;who don't read blogs&lt;/span&gt;. This means, sadly, we may well be yammering to ourselves in a cyber echo chamber.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Developing Experience&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dean suggests trying new technologies at work (testing is a great opportunity), or an open-source project.&lt;br /&gt;&lt;br /&gt;One other option is a public repository such as &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;. In my experience, posting a project on a public server really forces you to dot the i's: you want a good build process, unit tests, clean/idiomatic code and so on. The public nature of the effort removes the laziness that can happen on homegrown "Sunday night" projects.&lt;br /&gt;&lt;br /&gt;Another option is to build a website. If you want to learn Rails, then &lt;span style="font-style: italic;"&gt;really use it&lt;/span&gt;. Hosting is cheap, as a career investment.&lt;br /&gt;&lt;br /&gt;You might protest&lt;span style="font-style: italic;"&gt;: What would I build? All the great ideas are taken! &lt;/span&gt;Well, first remember that you aren't trying to get rich, you're trying to get experience. That said, it will take some &lt;span&gt;creativity&lt;/span&gt;. All too often we concentrate on creative &lt;span style="font-style: italic;"&gt;technical&lt;/span&gt; solutions, but do not apply it to our &lt;span style="font-style: italic;"&gt;careers&lt;/span&gt;. In this instance, there are lots of ideas: consider a &lt;a href="http://kottke.org/08/02/single-serving-sites"&gt;single service site&lt;/a&gt;, help a &lt;a href="http://github.com/NathanNeff/enrollio/"&gt;volunteer organization&lt;/a&gt;, etc.&lt;br /&gt;&lt;br /&gt;If you play it right, you might learn something and make a name for yourself in the process. A friend of mine wrote &lt;a href="http://www.onlinetasklist.com/"&gt;Online Task List&lt;/a&gt;: he learned a ton about web development and now has hundreds of real-life users (including me).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Use Technology&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Everyone talks about social media, but there are many other technologies such as screencasting and the mighty YouTube.&lt;br /&gt;&lt;br /&gt;As an aside, I am stunned that it is 2009 and I see 6-page résumés: each job has the same lengthy details, no matter if it is a senior position in 2008 or an intern level gig in 1999. There is a painful list of technologies that includes things like log4j. I realize résumés are tuned for search engines, but &lt;span style="font-style: italic;"&gt;no one cares &lt;/span&gt;that you know log4j!&lt;br /&gt;&lt;br /&gt;What I'd like to see is someone on YouTube standing at a white-board, taking 5-10 minutes to explain the &lt;code&gt;inverse=true&lt;/code&gt; concept in Hibernate. Or your definition of unit tests versus integration tests. What is your favourite data structure? &lt;span style="font-style: italic;"&gt;Anything! &lt;/span&gt;If you're good, you will shine through.&lt;br /&gt;&lt;br /&gt;If I were to receive a minimalist résumé with contact info and a URL to your YouTube vid, I guarantee you'll have my attention. (Here, I'm assuming a thoughtful, tailored cover letter as part of the offering.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In both solving problems and cultivating careers, don't discount creativity.&lt;br /&gt;&lt;br /&gt;We are only bounded by our imaginations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6163624620494292542?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6163624620494292542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6163624620494292542' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6163624620494292542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6163624620494292542'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/11/career-cultivation-and-creativity.html' title='Career Cultivation and Creativity'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2797401048559454608</id><published>2009-10-27T18:27:00.000-07:00</published><updated>2009-10-27T20:01:44.100-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strange loop'/><title type='text'>A Random Walk On A Strange Loop: Day 2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Full Discloseth:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;All of this may or may not matter to you: "A Longer Post" is an anagram of "Strange Loop". I live in St Louis, MO. &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Some speakers and the organizer are friends of mine.&lt;/span&gt;&lt;span style="font-style: italic;"&gt; I work for &lt;a href="http://img21.yfrog.com/i/y61u.jpg/"&gt;a sponsor&lt;/a&gt; of the recent &lt;a href="http://thestrangeloop.com/"&gt;Strange Loop conference&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a continuation of some thoughts on the conference.  See many &lt;a href="http://thestrangeloop.tumblr.com/"&gt;more resources here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hamlet D'Arcy: Groovy Compiler Metaprogramming...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Hamlet gave a splendid talk on the power of manipulating Groovy's AST. As a warm-up to Groovy, he showed a &lt;a href="http://en.wikipedia.org/wiki/Quine_%28computing%29"&gt;quine&lt;/a&gt;: absolutely &lt;span style="font-style: italic;"&gt;perfect&lt;/span&gt; for this conference. Looking back, I'm surprised they weren't all over the place.&lt;br /&gt;&lt;br /&gt;Hamlet's main example was to introduce code into the AST during one of Groovy's compilation stages. I was reminded of a comment on Java Posse where someone said that AOP had to be invented in Java to solve a particular problem, and that the problem simply didn't exist in dynamic languages. This talk exemplified this in spades.&lt;br /&gt;&lt;br /&gt;As an aside, Hamlet was a real trooper with the microphone. It was an awkward set-up, but he handled it gracefully. (I tend to get rattled under such conditions, so big props...).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Matt Taylor: jQuery, the Javascript Library of the Future&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;This talk wins the prize for making me want to a buy a book on the subject. If you haven't seen Javascript for awhile, good news: the libraries are fantastic, with jQuery arguably leading the way.&lt;br /&gt;&lt;br /&gt;Matt's presentation and slides (featuring a hall-of-fame &lt;a href="http://twittch.com/"&gt;Twittch&lt;/a&gt; comic) were right on target, but the money maker is &lt;a href="http://storage.dangertree.net/jQuery/sample.html"&gt;the demo&lt;/a&gt;. Seriously: check it out now.&lt;br /&gt;&lt;br /&gt;It may be simple jQuery in a browser, but it is really a clever layout and a testament to jQuery. Matt showed some snazzy selectors and hinted that you can do more if you know CSS. I maintain that if &lt;span style="font-style: italic; font-weight: bold;"&gt;you don't know&lt;/span&gt; CSS, you could use something like this to explore and learn more about it. The demo is a bit like an IDE for the browser. Also, if you are using a giant template system (ahem), then jQuery might be useful to introspect pieces of the HTML fractal with which you must deal.&lt;br /&gt;&lt;br /&gt;I'm sold. I hate CSS and a lot of web design but this library looks great.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Michael Galpin: Mobile Development 101...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Michael gave a classic, spot-on talk on 2 major platforms: iPhone and Android. I say 'classic' in the sense that the trade-offs were presented in a balanced and honest manner. This is one talk where I wish there was more time for questions. There were many.&lt;br /&gt;&lt;br /&gt;After all, there is a big fork in the road for mobile development, and you can't take &lt;span style="font-style: italic;"&gt;both&lt;/span&gt; paths. Choosing one is a big decision. I'd especially liked to have heard more about development as a potential side-venture, rather than within an enterprise, and the necessary resources (e.g. accountant, attorney, trademark, etc). Not very techie, but mobile is the new gold-rush.&lt;br /&gt;&lt;br /&gt;I respected that Michael didn't proselytize which path to choose: he just laid out the options. I have the high respect for people who can present both sides of a topic without tipping their hand (even if they are passionate in one direction).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Alex Payne: Keynote on 'Minimalism in Software'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've been somewhat scooped by &lt;a href="http://fupeg.blogspot.com/2009/10/minimalism-programming-huh.html"&gt;Michael Galpin&lt;/a&gt; (above) on this one: I also give Alex high marks and found his keynote to be really thought-provoking, even if it was disagreement. I may write a critique in later a post. However, unlike Michael G, I &lt;span style="font-style: italic;"&gt;do &lt;/span&gt;like&lt;span style="font-style: italic;"&gt; &lt;/span&gt;artistic/&lt;a href="http://codetojoy.blogspot.com/2007/01/tale-of-two-themes.html"&gt;musical analogies&lt;/a&gt;. If anything, I wonder if Alex went &lt;span style="font-style: italic;"&gt;far enough&lt;/span&gt; with his analogy.&lt;br /&gt;&lt;br /&gt;More later, after the web has a chance to see Alex's talk. The nano-gist: after an introduction to Minimalism (versus &lt;span style="font-style: italic;"&gt;minimalism&lt;/span&gt;), Alex listed some methods to achieve it in technology (see the slides or &lt;a href="http://www.weiqigao.com/blog/2009/10/24/day_two_of_strange_loop_2009.html"&gt;this recap by Weiqi Gao&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Regrets and 2nd Chances&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I saw some other talks but want to focus on regrets -- actually, second chances -- as the content will be online. I'm looking forward to the Strange Passion sessions, talks by the &lt;a href="http://en.wikipedia.org/wiki/Sensei"&gt;&lt;span style="font-style: italic;"&gt;sensei&lt;/span&gt;s&lt;/a&gt; Jeff Brown and Ken Sipe, and definitely James Williams' talk on Griffon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yes, yes, Alex Miller likes nachos. But I once read that he also likes building things, including events, and bringing people together. Strange Loop really was a dandy, and we are all better for it. Congrats! And thanks...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Full Discloseth:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I work for &lt;a href="http://img21.yfrog.com/i/y61u.jpg/"&gt;a sponsor&lt;/a&gt; of the recent &lt;a href="http://thestrangeloop.com/"&gt;Strange Loop conference&lt;/a&gt;. &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Some speakers and the organizer are friends of mine.&lt;/span&gt; &lt;span style="font-style: italic;"&gt;I live in St Louis, MO. &lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;"Lagoon Strep" is an anagram of "Strange Loop". &lt;/span&gt;&lt;span style="font-style: italic;"&gt;All of this may or may not matter to you. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;a href="http://codetojoy.blogspot.com/2009/10/random-walk-on-strange-loop-day-1.html"&gt;Go Steal Porn&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2797401048559454608?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2797401048559454608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2797401048559454608' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2797401048559454608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2797401048559454608'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/10/random-walk-on-strange-loop-day-2.html' title='A Random Walk On A Strange Loop: Day 2'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2124264778929383786</id><published>2009-10-26T18:27:00.000-07:00</published><updated>2009-10-27T20:04:23.718-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strange loop'/><title type='text'>A Random Walk On A Strange Loop: Day 1</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Full Discloseth:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;I work for &lt;a href="http://img21.yfrog.com/i/y61u.jpg/"&gt;a sponsor&lt;/a&gt; of the recent &lt;a href="http://thestrangeloop.com/"&gt;Strange Loop conference&lt;/a&gt;. Some speakers and the organizer are friends of mine. I live in St Louis, MO. Finally, I've run "strange loop" through an anagram generator and laughed for hours at the various and sundry output. All of this may or may not matter to you.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;As always, all opinions are solely mine, and genuine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Random Walk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not a journalist and won't try to report on the conference. Chances are, it would be a futile endeavour. I use the "random walk" title as signal that this post is an &lt;a href="http://en.wikipedia.org/wiki/Impressionism"&gt;Impressionist&lt;/a&gt;, personal experience.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Vibe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; want to set the scene: the event was held at &lt;a href="http://www.landmarktheatres.com/Market/St.Louis/TivoliTheatre.htm"&gt;the Tivoli&lt;/a&gt; in University City. "The Tiv" is a 1920s era movie theater with lots of unabashedly glitzy character. It was a marvelous choice and worked out really well. About 300 people attended, cramming the lobby and the facilities: the geek vibe was strong. (There was much more room in the theatres; i.e. during the talks.)&lt;br /&gt;&lt;br /&gt;There were also cameras! The talks will be on video, thanks to DZone. I'll post them here along with any links to slides.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mario Aquino: Zen Mind/Warrior Spirit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides are here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;One measure of a good movie is how long it stays with you afterwards. Mario's talk passes that same test. In a lyrical style with captivating slides, he combined ideas from Zen philosophy and a 'warrior code' to forge parallels to agile teams in software development.&lt;br /&gt;&lt;br /&gt;Among my revelations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The struggle of meditation is to quiet the inner voice. Pure TDD is similar, as the inner voice always wants to write 'the real code' first. Testing first &lt;span style="font-style: italic; font-weight: bold;"&gt;is&lt;/span&gt; meditation. Perhaps that's why it takes focus.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Team culture is more than the sum of its parts. Like a warrior clan, there is a sense of something larger. Good teams have a sense of the 'common good' (aka convention) and the discipline to stay with it.&lt;/li&gt;&lt;li&gt;I once read about an Allied WW2 bombing squadron that suffered terrible losses over Europe. Despite being decimated, the remaining planes returned to Britain &lt;span style="font-style: italic;"&gt;in formation&lt;/span&gt;. I think of this often when I work, alone, in a team war room on a weekend. &lt;/li&gt;&lt;li&gt;Mario mentioned &lt;a href="http://twitter.com/coreyhaines"&gt;Corey Haines&lt;/a&gt;, who lives a nomadic existence as a programmer. This reminded several of us about &lt;a href="http://en.wikipedia.org/wiki/Paul_Erd%C5%91s"&gt;Paul Erdős&lt;/a&gt;, a rockstar mathematician who lived the same lifestyle.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Mark Volkmann: Tackling Concurrency with STM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides are here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Mark gave an excellent overview: the pros and cons of lock-based concurrency versus using Software Transactional Memory (STM). I especially liked the open question of whether its time has come: after all, garbage collection took many years to become mainstream. The unvarnished truth is that we don't know, but things certainly seem to be brewing.&lt;br /&gt;&lt;br /&gt;Mark examined the details of STM in Clojure, using diagrams to give a sense of the internal representation. It is hard to recreate here, but I left with a better sense of Rich Hickey's position that the time dimension is vital to concurrency (see Hickey's &lt;a href="http://jaoo.dk/aarhus-2009/file?path=/jaoo-aarhus-2009/slides/RichHickey_TheClojureConcurrencyStory.pdf"&gt;slides here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Charles Nutter: Ruby Mutants&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides are here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I don't know Ruby, but I couldn't pass up a chance to see Charles. He's a class act in the Ruby community and obviously a major force. Not knowing Ruby, I was definitely a stranger in a strange land -- in fact some goons at the door frisked me, finding a Grails book and some Python code in an inside pocket. &lt;span style="font-style: italic;"&gt;Not necessary, gang!&lt;/span&gt; (&lt;span style=";font-family:times new roman;font-size:85%;"  &gt;also: not true&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Charles mentioned "Java Next" and his criteria for choosing a Java successor. I loved that some popular JVM languages -- claimed by others as Java Next -- did not meet his criteria. He respected said languages but stated, matter-of-fact, that they didn't meet his aesthetic. This is a clear sign that the JVM community is healthy.&lt;br /&gt;&lt;br /&gt;He went on to examine two Ruby mutants: Duby and Surinx. There are some compelling slides that compare and contrast these two 'unfortunately named' mutants to Ruby itself. I'm struggling here to capture the essence of this talk, but do check it out: I thought it was fantastic stuff and an object lesson as a presentation, in terms of pace, tone, and code samples.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bob Lee: Keynote on Future of Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://thestrangeloop.com/sessions/slides"&gt;slides are here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;There is one aspect of Bob's keynote that I found especially noteworthy, and I'm dedicating this section to it. It was an excellent talk, with lots of interesting material, but this really resonated.&lt;br /&gt;&lt;br /&gt;A friend of mine once kept a log, for years, about bugs that he found. Over time, he compiled &lt;span style="font-style: italic;"&gt;evidence&lt;/span&gt; about software development in a given language. Based on this record, he developed a philosophy towards his coding conventions. (More to come in a subsequent post about evidence-based software practices: it ain't gonna be easy.)&lt;br /&gt;&lt;br /&gt;I was impressed at the time, and impressed again by Bob, when he argued for ARM blocks. He began with some Java puzzlers, to show the difficulty of correctly using IO and try-catch-finally blocks. All well and good. But then he reported examinations of large codebases, including &lt;span style="font-style: italic; font-weight: bold;"&gt;the JDK itself&lt;/span&gt;: there are &lt;span style="font-weight: bold;"&gt;plenty&lt;/span&gt; of instances where the code does not behave in a strictly-correct manner.&lt;br /&gt;&lt;br /&gt;More than Java 7 features, this is the big take-away: when presenting a case to an audience (be it a keynote, or your team), do the research and present evidence. Compelling.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Strange Passions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sadly, I didn't make it to the &lt;a href="http://thestrangeloop.com/passions"&gt;Strange Passions&lt;/a&gt; track, or the party at Blueberry Hill. However, there was a lot of buzz about the track idea (which is fantastic) and the individual talks. Sounds like it was a huge hit. I hope the passion talks are on video.&lt;br /&gt;&lt;br /&gt;More to come, re: Day #2.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Full Discloseth:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;All of this may or may not matter to you: "go steal porn" is an anagram of "strange loop". I live in St Louis, MO. &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Some speakers and the organizer are friends of mine.&lt;/span&gt;&lt;span style="font-style: italic;"&gt; I work for &lt;a href="http://img21.yfrog.com/i/y61u.jpg/"&gt;a sponsor&lt;/a&gt; of the recent &lt;a href="http://thestrangeloop.com/"&gt;Strange Loop conference&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codetojoy.blogspot.com/2009/10/random-walk-on-strange-loop-day-2.html"&gt;A Longer Post&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2124264778929383786?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2124264778929383786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2124264778929383786' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2124264778929383786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2124264778929383786'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/10/random-walk-on-strange-loop-day-1.html' title='A Random Walk On A Strange Loop: Day 1'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8076760756406594416</id><published>2009-10-12T18:44:00.000-07:00</published><updated>2009-10-12T19:08:45.143-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='the best of the best'/><title type='text'>Ignorance is Bliss</title><content type='html'>Like many, I have loved &lt;a href="http://en.wikipedia.org/wiki/Calvin_and_Hobbes"&gt;Calvin and Hobbes &lt;/a&gt;for a long time. Not that this blog compares, but the spoofs on here are influenced by Calvin's weird, wonderful world where we only bounded by our imaginations.&lt;br /&gt;&lt;br /&gt;I recently &lt;a href="http://chutzpah.typepad.com/slow_movement/2008/07/calvin-hobbes-2.html"&gt;found a post&lt;/a&gt; that contains, my all-time favourite C&amp;amp;H. I probably shouldn't encourage a likely violation of copyright, but I'm weak. I've tried, in vain, to describe this one to people dozens of times. I laugh out loud (especially the visual of frame 5, "&lt;span style="font-style: italic;"&gt;I don't want to know about it"&lt;/span&gt;) every time since I first saw it in the early 1990s.&lt;br /&gt;&lt;br /&gt;This comic is such biting satire toward software development that I no longer hang it up at work gigs, lest it is interpreted as some kind of protest.&lt;br /&gt;&lt;br /&gt;The genius is that it has &lt;span style="font-weight: bold;"&gt;no&lt;/span&gt; ties to IT: a friend once commented that her mother, &lt;span style="font-style: italic;"&gt;a judge&lt;/span&gt;, had it laminated and placed prominently on her refrigerator. Truly philosophical, it is timeless and universal.&lt;br /&gt;&lt;br /&gt;I love Dilbert too, but if I had to choose: you can keep it. Give me Calvin and Hobbes, please. I only wish that &lt;a href="http://en.wikipedia.org/wiki/Bill_Watterson"&gt;Watterson&lt;/a&gt; would come out of retirement and do a few more, whenever his muse strikes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8076760756406594416?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8076760756406594416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8076760756406594416' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8076760756406594416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8076760756406594416'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/10/ignorance-is-bliss.html' title='Ignorance is Bliss'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3103639290993574337</id><published>2009-09-29T04:31:00.000-07:00</published><updated>2009-09-29T06:17:27.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='duct tape'/><title type='text'>The Emperor's New Prose: Duct Tape Blogging</title><content type='html'>I've been a fan of Joel Spolsky's for a long time. He has written some excellent, influential stuff. Unfortunately, his latest blog entry, &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;The Duct Tape Programmer&lt;/a&gt;, falls short of the mark, and has sparked &lt;a href="http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer"&gt;some&lt;/a&gt; &lt;a href="http://www.tbray.org/ongoing/When/200x/2009/09/25/On-Duct-Tape"&gt;debate&lt;/a&gt; throughout the web.&lt;br /&gt;&lt;br /&gt;I wasn't going to respond until I saw supportive tweets such as 'thoughtful, provoking essay'. (Damn you, Twitter, now you've drawn me into this.)&lt;br /&gt;&lt;br /&gt;Joel's piece isn't a thoughtful, provoking essay. &lt;a href="http://www.joelonsoftware.com/articles/fog0000000043.html"&gt;This one is&lt;/a&gt;, but Duct Tape Programmer is just a quick rant. Like I said, I'm a fan of Joel, but let's not be sycophants here!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Gist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I freely admit that I haven't read the book, Coders At Work, but here is &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;Joel's article&lt;/a&gt;. Here's my summary of his points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Keep things as simple as possible, but no simpler.&lt;/li&gt;&lt;li&gt;'Simple as possible' is context dependent.&lt;/li&gt;&lt;li&gt;It's the features, stupid.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The first item is a favourite quote of mine, often attributed to Einstein (though I have not verified that). An example in software: your webapp may not need GWT on a full blown J2EE stack, but you'll probably need a database. The first case is not simple as possible; yet without a DB, it is &lt;span style="font-style: italic;"&gt;too&lt;/span&gt; simple.&lt;br /&gt;&lt;br /&gt;His other point is that the definition of 'simple as possible' depends on circumstances: the context of a start-up company is much different than a mature app at a large enterprise. Naturally, the start-up will have a much more stringent definition of 'simple as possible'.&lt;br /&gt;&lt;br /&gt;Finally, Joel admires those that concentrate on features, and who ship code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Surprise&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I agree with Joel. His thesis isn't particularly original, but as I see it, it is virtually indisputable.&lt;br /&gt;&lt;br /&gt;However, I take issue with some of the details. My point is that this just isn't a thoughtful post.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;At Issue: What is Duct Tape?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Joel gives lots of examples of complex technologies: multi-threading, COM, and CORBA. Hard stuff, no doubt. He goes on to write:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:verdana;" &gt;... any kind of coding technique that’s even &lt;/span&gt;&lt;em style="color: rgb(51, 51, 255); font-family: verdana;"&gt;slightly&lt;/em&gt;&lt;span style="color: rgb(51, 51, 255);font-family:verdana;" &gt; complicated is going to doom your project.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, against the backdrop of extremely complicated technologies, he doesn't define 'slightly complicated'. There's not even an example! From what I can tell there isn't even an example of duct tape!&lt;br /&gt;&lt;br /&gt;Is OO slightly complicated? AOP? Functional programming? Transactions? Languages without garbage collection? &lt;span style="font-style: italic;"&gt;with&lt;/span&gt; garbage collection? The notion of 'simple' is much more nuanced than Joel implies.&lt;br /&gt;&lt;br /&gt;This rhetoric reminds me of the &lt;a href="http://en.wikipedia.org/wiki/Straw_man"&gt;straw-man argument&lt;/a&gt; and definitely is the logical fallacy of &lt;a href="http://en.wikipedia.org/wiki/False_alternative"&gt;false alternative&lt;/a&gt;. Joel assured me on Twitter that the COM example is real, and not a straw-man. I'm sure it is true (I didn't think Joel was being deceitful), but berating the most extreme case with no comment on the middle-ground does not make a thoughtful article.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;At Issue: Design Patterns&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quick -- what is the most commonly used design pattern, using the vocabulary of the seminal work, &lt;a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612"&gt;Design Patterns&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;I don't know, but I'd wager that it is the &lt;a href="http://en.wikipedia.org/wiki/Iterator_pattern"&gt;Iterator&lt;/a&gt;. In fact, if you work with Java, it is so common that it may not 'count' in your mind. And yet, there it is: a freaking &lt;span style="font-style: italic;"&gt;commodity&lt;/span&gt;, no less.&lt;br /&gt;&lt;br /&gt;Joel takes a shot at a 'Design Patterns meet-up'. It's true that people can go crazy with esoterica, but again, nuances are lost with broad strokes. It is easy to deride the architecture astronauts!&lt;br /&gt;&lt;br /&gt;There may well be times when a design pattern is the right fit, and it is &lt;span style="font-weight: bold;"&gt;our job as professionals to be prepared&lt;/span&gt;. True -- we have to be intellectually honest and disciplined -- but that doesn't mean we shouldn't be informed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;At Issue: Unit Tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hoo-boy, Joel fired a shot across the bow of the agile ship. A brave man.&lt;br /&gt;&lt;br /&gt;I'm a big fan of unit testing and am convinced that they helps us make better software. However, &lt;span style="font-style: italic; font-weight: bold;"&gt;if&lt;/span&gt; the context is a start-up in an ultra-competitive space, and we are racing for the '50% good' mark, then I &lt;span style="font-style: italic;"&gt;agree&lt;/span&gt; that unit tests would slow things down. If I were in that environment, I would shower every 2 hours just to get the smell off me.&lt;br /&gt;&lt;br /&gt;The issue here is that most of us are &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; in that context, and the post implies that unit tests are used for 'endless polishing' to get to the '99% sparkling' mark. That's just bogus.&lt;br /&gt;&lt;br /&gt;Unit tests are the first client of any software. They find bugs. They highlight problems in an API. They serve as executable documentation. They get us to the X% mark faster, where X is way higher than 50 and not as obsessive as 99. &lt;span style="font-style: italic;"&gt;Most projects are shooting for X.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;We all agree that simplicity and features are of paramount importance. We all agree that we shouldn't listen to architecture astronauts with high-falutin', ego-driven schemes that are not appropriate for the situation. As usual, the devil is in the definitions (what is&lt;span style="font-style: italic;"&gt; appropriate&lt;/span&gt;?).&lt;br /&gt;&lt;br /&gt;But to the Twitterverse: just because an excellent writer wrote a piece, it doesn't make it excellent. Call them out, when &lt;a href="http://en.wikipedia.org/wiki/The_Emperor%27s_New_Clothes"&gt;they have no prose&lt;/a&gt;, and write your own 'duct tape post' instead of broad, incendiary brush strokes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3103639290993574337?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3103639290993574337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3103639290993574337' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3103639290993574337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3103639290993574337'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/09/emperors-new-prose-duct-tape-blogging.html' title='The Emperor&apos;s New Prose: Duct Tape Blogging'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5206706407105594271</id><published>2009-09-14T18:45:00.000-07:00</published><updated>2009-09-15T18:00:13.323-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming on ACID'/><title type='text'>STM and Clojure: An Article Recommendation</title><content type='html'>Your friend and mine, &lt;a href="http://java.ociweb.com/mark/"&gt;Mark Volkmann&lt;/a&gt;, has written an &lt;a href="http://ociweb.com/mark/stm/article.html"&gt;excellent, thorough article&lt;/a&gt; over at the &lt;a href="http://ociweb.com/jnb"&gt;OCI Java News Brief&lt;/a&gt; (I work for an affiliate of OCI).&lt;br /&gt;&lt;br /&gt;The article first places Software Transactional Memory (STM) within the milieu of other concurrency techniques. I especially like the emphasis on &lt;span style="font-style: italic;"&gt;transactional&lt;/span&gt;, as I found that as a stumbling block in the past. (It does not necessarily mean a database!)&lt;br /&gt;&lt;br /&gt;The article goes on to work though some serious study of STM in Clojure. Great stuff....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5206706407105594271?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5206706407105594271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5206706407105594271' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5206706407105594271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5206706407105594271'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/09/stm-and-clojure-article-recommendation.html' title='STM and Clojure: An Article Recommendation'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-795022751414864488</id><published>2009-09-14T18:30:00.000-07:00</published><updated>2009-09-14T18:36:33.392-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fair warning'/><title type='text'>PostgreSQL and Unicode</title><content type='html'>I ran into this recently and thought I would post it, just in case in helps someone.&lt;br /&gt;&lt;br /&gt;In PostgreSQL 8.3, the &lt;code&gt;chr()&lt;/code&gt; function accepts &lt;a href="http://www.postgresql.org/docs/8.3/static/functions-string.html"&gt;a Unicode codepoint&lt;/a&gt;. This is useful to insert (or in our case, correct) Unicode strings.&lt;br /&gt;&lt;br /&gt;You might think that this feature has been around since... version 6, or 7, or surely 8.2 ?&lt;br /&gt;&lt;br /&gt;No. Be careful: the documentation for 8.2 &lt;a href="http://www.postgresql.org/docs/8.2/static/functions-string.html"&gt;mentions only ASCII&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-795022751414864488?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/795022751414864488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=795022751414864488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/795022751414864488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/795022751414864488'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/09/postgresql-and-unicode.html' title='PostgreSQL and Unicode'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7978025315737344639</id><published>2009-09-13T17:16:00.000-07:00</published><updated>2010-01-26T18:09:09.095-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internal DSL'/><title type='text'>Vending Machine: A DSL in Groovy</title><content type='html'>In a previous post, I explained a modest example of the &lt;a href="http://codetojoy.blogspot.com/2009/08/vending-machine-modest-groovy-example.html"&gt;Vending Machine in Groovy&lt;/a&gt;. I've since taken the code and tried my hand at writing an &lt;a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;internal DSL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm a relative newbie to internal DSLs, but I've pushed my example up to GitHub (&lt;a href="http://github.com/codetojoy/vending_machine_groovy_dsl_internal/"&gt;here&lt;/a&gt;). (This post is light on explaining the details, since the code is available.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Observation #1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The best discovery is the magic of disappearing code. In this example, the main program simply evaporates and becomes this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;// load the DSL engine/rules&lt;br /&gt;def dslEngine = new File("${args[0]}").text&lt;br /&gt;&lt;br /&gt;// load the command input&lt;br /&gt;def input = new File("${args[1]}").text.toLowerCase()&lt;br /&gt;&lt;br /&gt;// dslEngine creates 'machine', which accepts the input:&lt;br /&gt;def dslScript = " $dslEngine ; machine.accept { $input } "&lt;br /&gt;&lt;br /&gt;// let Groovy do the rest!&lt;br /&gt;new GroovyShell().evaluate(dslScript)&lt;br /&gt;&lt;/pre&gt;Amazing! There are 2 input arguments to the program. One is the DSL "engine" or context. It looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;class Machine {&lt;br /&gt;   def machineState = new MachineState()&lt;br /&gt;&lt;br /&gt;   def service(def coinList, def inventoryMap) {&lt;br /&gt;      machineState.availableChange = new MoneyState(coinList)&lt;br /&gt;      machineState.inventoryState = new InventoryState(inventoryMap)&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   def getN() { machineState.addInsertedMoney(MoneyState.NICKEL) }&lt;br /&gt;   def getD() { machineState.addInsertedMoney(MoneyState.DIME) }&lt;br /&gt;   def getQ() { machineState.addInsertedMoney(MoneyState.QUARTER) }&lt;br /&gt;&lt;br /&gt;   def getCoin_return() { machineState.insertedMoney = MoneyState.ZERO }&lt;br /&gt;&lt;br /&gt;   // snip&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The other argument is the set of commands. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;SERVICE ([50, 50, 50, 50], [ [N:'A', P:'65', C:'10'] ])&lt;br /&gt;&lt;br /&gt;VERIFY "[50, 50, 50, 50] [0, 0, 0, 0] [ [N:'A', P:'65', C:'10'] ]"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that the SERVICE command looks like a method call, with parentheses and a comma. That's because it &lt;span style="font-style: italic; font-weight: bold;"&gt;is&lt;/span&gt; a method call. Similarly, VERIFY is as well, though no parentheses are necessary for the single string argument.&lt;br /&gt;&lt;br /&gt;The other commands are simpler:&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;N ; D ; Q ; a$ ; COIN_RETURN&lt;br /&gt;&lt;/pre&gt;These are direct method/property calls as well (e.g. &lt;code&gt;machine.getN()&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;Observation #2&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Articles on internal DSLs often talk about the contortions that one must go through to simplify the syntax for the end-user. Often, one uses techniques that would otherwise be considered poor style. (&lt;a href="http://www.amazon.com/Programming-Groovy-Productivity-Developer-Programmers/dp/1934356093"&gt;Venkat Subramaniam&lt;/a&gt; jokes that "designing the DSL" is "finding the right tricks").&lt;br /&gt;&lt;br /&gt;I discovered that as well. In Groovy, it is relatively easy to have a decent DSL, but there is a never-ending desire to improve upon it. In the current version, I ran into a wall for using the dollar-sign as a token (see the compromise above: quoting that character in this post is giving Blogspot fits). Along with the parentheses on SERVICE, this pains me. I literally think about it while running on a treadmill.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Observation #3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the first example, I adopted a file based approach for the input, over an interactive command-line. This has paid off in spades, because my suite of input files act as acceptance tests. Morphing the Java-esque example into a DSL was considerably easier with the existence of those files.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With the right support and on the right scale, internal DSLs are terrific. For example, parts of (or, &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; of?) Grails and Gant are internal DSLs and I love it.&lt;br /&gt;&lt;br /&gt;On a smaller scale, I'm not so sure. I'm still disturbed about the issue of &lt;a href="http://codetojoy.blogspot.com/2008/06/domain-specific-error-messages.html"&gt;Domain Specific Error messages&lt;/a&gt;. That is: can a domain expert (without development skills) really handle the power of an internal DSL (including the errors)?&lt;br /&gt;&lt;br /&gt;Either way, internal DSLs are undeniably a fun exercise and a great way to learn more about a language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7978025315737344639?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7978025315737344639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7978025315737344639' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7978025315737344639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7978025315737344639'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/09/vending-machine-dsl-in-groovy.html' title='Vending Machine: A DSL in Groovy'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6267348420286883368</id><published>2009-08-30T18:38:00.000-07:00</published><updated>2009-08-30T19:04:29.414-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='get your groovy online'/><title type='text'>Groovy Console App and WIDE</title><content type='html'>In April 2008, I blogged about &lt;a href="http://codetojoy.blogspot.com/2008/04/wide-web-enabled-ide.html"&gt;the WIDE: web-enabled IDE&lt;/a&gt;. I wondered if web tools might augment some of the standard stuff available in the IDEs.&lt;br /&gt;&lt;br /&gt;(I realize many have 'scratchpads' but I wanted something more. Also, by environment, I don't mean a single app).&lt;br /&gt;&lt;br /&gt;In particular, I've thought about a website dedicated to string and regex utilities. Whenever I find myself writing a little script to parse a data string, or to toy with a regex, I always think "there must be a better way".&lt;br /&gt;&lt;br /&gt;Well, we're one huge step closer: check out the &lt;a href="http://groovyconsole.appspot.com/"&gt;Groovy Web Console&lt;/a&gt;, by Guillaume Laforge.&lt;br /&gt;&lt;br /&gt;It laughs at basic string utilities:&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;def s = "does this string fit into a 32-char column?"&lt;br /&gt;println s.size()&lt;br /&gt;&lt;/pre&gt;And provides a test-bed for regular expressions:&lt;br /&gt;&lt;br /&gt;(Note, this is a Java-Groovy hybrid. It's only somewhat 'Groovy'. Making it Groovier is left to the reader)&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;import java.util.regex.Pattern&lt;br /&gt;&lt;br /&gt;def s = "1 - 314-867- 5309"&lt;br /&gt;def p = Pattern.compile(/.*1.*(\d\d\d).*(\d\d\d).*(\d\d\d\d).*/)&lt;br /&gt;def m = p.matcher(s)&lt;br /&gt;if (m.matches()) {&lt;br /&gt;  println "area code = ${m[0][1]}"&lt;br /&gt;  println "exchange = ${m[0][2]}"&lt;br /&gt;  println "digits = ${m[0][3]}"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Count me in... I'm definitely going to have this site at hand in my environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6267348420286883368?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6267348420286883368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6267348420286883368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6267348420286883368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6267348420286883368'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/08/groovy-console-app-and-wide.html' title='Groovy Console App and WIDE'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-853644678971638854</id><published>2009-08-30T17:23:00.000-07:00</published><updated>2009-08-30T18:15:08.676-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='this is your brain on code'/><title type='text'>The IDE is a Browser: Neuroscience and Language Design</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Lizard Brain Web Design&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last winter, I saw a great talk by Scott Davis called &lt;a href="http://www.therichwebexperience.com/conference/orlando/2009/12/session?id=15940"&gt;"Lizard Brain Web Design"&lt;/a&gt;. The theme was to apply psychology and neuro sci ideas to web sites, and to explain why simplicity and good design can really work. For example, we want the site to stay "out of the way" so that the users stay in a primal, "lizard" mode of consciousness with respect to the site. In this way, they can concentrate on what matters.&lt;br /&gt;&lt;br /&gt;During the talk, I remember thinking that all of the principles discussed apply to more than surfing content on the web. They also apply to surfing &lt;span style="font-style: italic;"&gt;code in an IDE&lt;/span&gt;. That is, topics such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Whitespace is a critical aspect of design&lt;/li&gt;&lt;li&gt;Group related items (locality of reference)&lt;/li&gt;&lt;li&gt;Our minds can only stack N items (N = 7 ?)&lt;/li&gt;&lt;li&gt;Principle of least surprise&lt;/li&gt;&lt;/ul&gt;apply just as well to our APIs, our code organization, and coding conventions.&lt;br /&gt;&lt;br /&gt;For months now, I've wondered if there were studies that applied neuro sci to developers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Subitizing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's play a game: as you add a parameter to a method, how many parameters triggers your sense of "this is too many -- I need to refactor this".&lt;br /&gt;&lt;br /&gt;Seriously, go ahead, think of a number, N, for your threshold.&lt;br /&gt;&lt;br /&gt;You probably said N = 3 or 4. True, that's what everyone says, but here is one reason why. The delightful book &lt;a href="http://www.amazon.com/Mind-Hacks-Tricks-Using-Brain/dp/0596007795"&gt;Mind Hacks&lt;/a&gt; discusses &lt;span style="font-style: italic;"&gt;subitizing&lt;/span&gt; (item #35): given a set of N objects, where N is 4 or less, we process counting in a &lt;span style="font-style: italic;"&gt;much&lt;/span&gt; faster way. The book claims 250 ms for the first 4 items and a full second (!) for every 4 items after that.&lt;br /&gt;&lt;br /&gt;There is debate as to how this works (see Mind Hacks for academic references), but one conjecture is that when N &lt;= 4, the "counting" is a side effect of visual processing: i.e. it is done by the lizard, reptilian level of the brain. When N goes past 4, we have to do some work. &lt;br /&gt;&lt;br /&gt;Now, let's be clear: the book talks about counting shapes. Stars, circles, beads on an abacus. I have no idea if this applies to Java or C# parameters. &lt;br /&gt;&lt;br /&gt;But I'm willing to bet money that it does.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Eye-Tracking and Variable Names&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/node/3069"&gt;This article&lt;/a&gt; came across the transom recently, and dovetailed with the above ideas. The gist is that the researchers used scientific techniques (e.g. eye-tracking) to evaluate productivity of programming styles.&lt;br /&gt;&lt;br /&gt;The claim in the paper is that the Scala style of using comprehensions is more productive than Java's iterative loops. Also, for small code blocks, well-named intermediate variables may not matter.&lt;br /&gt;&lt;br /&gt;I didn't read the paper, and I have no idea of the validity of the science. However, I find the approach to be very fascinating. I'm sure scientific methods have been used for a long time with respect to lines of code, and productivity, but I wonder if neuroscience will have a future impact on language &lt;span style="font-style: italic;"&gt;design&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;It would be fascinating to see if researchers start hooking up developers to &lt;a href="http://en.wikipedia.org/wiki/Functional_magnetic_resonance_imaging"&gt;functional MRI&lt;/a&gt; machines, to see how the brain works while coding. (I know that my &lt;a href="http://en.wikipedia.org/wiki/Amygdala"&gt;amygdala&lt;/a&gt; lights up when I see a 80-line method!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Imagine a geek conference where a new language is unveiled: instead of its design being driven by a sense of tradition or aesthetic, what if its design was modeled on hard evidence from a neuro lab?&lt;br /&gt;&lt;br /&gt;Neat stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-853644678971638854?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/853644678971638854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=853644678971638854' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/853644678971638854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/853644678971638854'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/08/ide-as-browser-neuroscience-and.html' title='The IDE is a Browser: Neuroscience and Language Design'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4679683257887164733</id><published>2009-08-25T10:09:00.000-07:00</published><updated>2010-01-26T18:10:12.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='count me in'/><title type='text'>An Understated Feature in Groovy</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have worked with Groovy for awhile, but have been averse to one feature: the implicit return of the last expression evaluated. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;def getFoo() {&lt;br /&gt;    def foo = null&lt;br /&gt;&lt;br /&gt;    if (something) {&lt;br /&gt;        foo = new Foo()&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    foo // no 'return' necessary&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In the above code, I would use &lt;code&gt;return&lt;/code&gt; because it felt safer to me. I tended to agree &lt;a href="http://stuffthathappens.com/blog/2007/09/25/paying-my-taxes/"&gt;with Eric's post&lt;/a&gt; (with respect to explicit returns).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Revelation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I &lt;span style="font-style: italic;"&gt;get it&lt;/span&gt; now, and it's all thanks to the &lt;a href="http://groovy.codehaus.org/Collections"&gt;enhanced collection methods&lt;/a&gt; in Groovy.&lt;br /&gt;&lt;br /&gt;Consider the &lt;code&gt;collect&lt;/code&gt; method. It transforms a list by applying a function. In pseudocode:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;[ a, b, c, d] =&gt; [ f(a), f(b), f(c), f(d) ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;With that in mind, here's another example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;class Composer {&lt;br /&gt;    def name&lt;br /&gt;    // def era, etc&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;def list = [ 'Bach', 'Beethoven', 'Brahms' ]&lt;br /&gt;&lt;br /&gt;// the closure returns the new Composer object, as it is the last&lt;br /&gt;// expression evaluated.&lt;br /&gt;&lt;br /&gt;def composers = list.collect { item -&gt; new Composer(name : item) }&lt;br /&gt;&lt;br /&gt;assert 'Bach' == composers[0].name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The idea is simply to build a list of &lt;code&gt;Composer&lt;/code&gt; objects from a list of strings. As noted in the comment, the closure passed to &lt;code&gt;collect&lt;/code&gt; uses the implicit return to great effect. At one time, I would have taken 3-4 lines to express that idea.&lt;br /&gt;&lt;br /&gt;But now, this code is not merely concise: it is truly &lt;span style="font-style: italic;"&gt;elegant&lt;/span&gt;. Very reminiscent of other languages such as Python.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Take-Home Message&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are many lists of &lt;a href="http://joe.kueser.com/2007/10/06/what-makes-groovy-sogroovy/"&gt;excellent Groovy features&lt;/a&gt;. However we rarely see 'implicit return' listed. I'm a fan: it greases the wheels for other features.&lt;br /&gt;&lt;br /&gt;I realize it is available in many languages: I just haven't used it in Groovy. I suspect in a few weeks I won't be able to live without it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4679683257887164733?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4679683257887164733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4679683257887164733' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4679683257887164733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4679683257887164733'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/08/understated-feature-in-groovy.html' title='An Understated Feature in Groovy'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3624872683744709979</id><published>2009-08-17T17:54:00.000-07:00</published><updated>2009-08-17T18:07:44.447-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='guest post'/><title type='text'>The Case for Grails</title><content type='html'>&lt;a href="http://www.blogger.com/profile/14700866414917837527"&gt;David Jacobs&lt;/a&gt;, a friend and colleague, posted a comment in response to other comments on a &lt;a href="http://codetojoy.blogspot.com/2009/06/case-for-groovy.html"&gt;previous post&lt;/a&gt;. The comments focused on scaffolding in Grails.&lt;br /&gt;&lt;br /&gt;I thought it was worthy of a full-blown post, and he has kindly granted me permission. David's thesis is that there is much more to Grails than just scaffolding and quick demos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;By David Jacobs:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've now been using Grails on my primary project for about 16 months (not just toying with it--this is at my "real job" on a large project for one of the 50 largest companies in America). My appreciation of it has continued to grow, and I have complete confidence in it as an appropriate choice for 95%+ of business applications.&lt;br /&gt;&lt;br /&gt;Scaffolding is NOT a primary benefit of Grails. It enables cool 5 minute demos, but the real world benefits of Grails are much deeper. There are simplified (auto-wired) conventions, built in tools, or plugins for nearly every aspect of web development. This enables a massive increase in productivity by enabling and encouraging clean solutions that don't re-invent the wheel. Perhaps even more importantly, this keeps the code lean, which is very important for long-term maintenance, refactoring, and preventing "sleeper defects" that tend to hide in bloated code.&lt;br /&gt;&lt;br /&gt;I needed to add caching for some web service calls to improve performance: 11 lines of code (entirely declarative).&lt;br /&gt;&lt;br /&gt;To meet a versioning requirement (lock, copy as new revision), I needed to implement deep cloning of a persistent domain tree with child associations (mostly collections) five levels deep, with multiple branches, touching about 30 persistent objects. Some needed to be copied by reference (for example, a createdByUser association), and some cloned as new (recursively deep cloned). My implementation is completely generic and won't require changes if the domain model is changed. Pass the method a domain object instance, it hands you back a copy with all of the children copied and properly attached to their new parents. Then you call .save(), and all of the new ids are generated and your database has been updated. This one is a testament to the power of Grails metaprogramming with GORM and Groovy: 22 lines of code.&lt;br /&gt;&lt;br /&gt;I needed to create a utility application for mocking a third-party SSO module to enable logins on staging/demo servers. It validates user inputs, makes an AJAX request to the target app with modified request headers to initiate a browser session, and launches it with the intended user now logged in. It uses a proper MVC architecture, the layout is configured with SiteMesh, it has configuration/build management and versioning, URL mapping/redirection to keep it friendly, and log4j integrated and configured. From creating the project to building the WAR file, it took 4 hours.&lt;br /&gt;&lt;br /&gt;Point proven?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3624872683744709979?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3624872683744709979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3624872683744709979' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3624872683744709979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3624872683744709979'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/08/case-for-grails.html' title='The Case for Grails'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6734543901500816465</id><published>2009-08-16T19:14:00.000-07:00</published><updated>2010-01-26T18:10:36.153-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vending machine'/><title type='text'>Vending Machine: A Modest Groovy Example</title><content type='html'>I wasn't ready for the &lt;a href="http://lambdalounge.org/meeting-archive/"&gt;Language Shootout at the Lambda Lounge&lt;/a&gt;, but I've completed an example of the vending machine, and &lt;a href="http://github.com/codetojoy/vending_machine_groovy_javaesque/tree/master"&gt;placed it up at GitHub&lt;/a&gt;. (The Language Shootout used a small specification to illustrate languages ranging from Haskell to Fan, and everything in between.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Highlights&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As Lambda Loungers know, these examples are not intended to be submissions for &lt;a href="http://en.wikipedia.org/wiki/Turing_Award"&gt;the Turing Award&lt;/a&gt;. My example is a modest program, but offers this to Groovy newbies:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The project uses &lt;a href="http://gant.codehaus.org/"&gt;Gant&lt;/a&gt;, has test cases, and is fairly complete.&lt;/li&gt;&lt;li&gt;The program accepts an input file, and supports a VERIFY action to "assert" the expected state of the machine. In some ways, the file could be an acceptance test (reminiscent of &lt;a href="http://en.wikipedia.org/wiki/Framework_for_Integrated_Test"&gt;FIT&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;One interesting idea (IMHO) is the execution of data as code. More below.&lt;/li&gt;&lt;li&gt;The example has some internal uses of &lt;code&gt;Expando&lt;/code&gt;, and many uses of the elegant closure-based iterations.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Evaluating Data&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Consider a command like so:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;// N = Name, P = Price, C = Count&lt;br /&gt;SERVICE [5,5,5,5] [[N:'A', P:'65', C:'10'],[N:'B', P:'100', C:'10']]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The pattern here is: &lt;code&gt;Action Coins Inventory&lt;/code&gt;. In this example, &lt;code&gt;Coins&lt;/code&gt; is evaluated as a Groovy &lt;code&gt;list&lt;/code&gt;; &lt;code&gt;Inventory&lt;/code&gt; is a Groovy &lt;code&gt;map&lt;/code&gt;. This not only simplifies parsing, but affects the architecture of the example. This is hardly new (&lt;span style="font-style: italic;"&gt;hello, Lisp&lt;/span&gt;!), but a powerful tool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java-esque&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As with many languages, Groovy supports a wide-range of styles. I've dubbed this example as "Java-esque". Here's why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Actions (like SERVICE) are objects. This is a nod to Java's style.&lt;/li&gt;&lt;li&gt;It does not use the MOP (see &lt;a href="http://github.com/rhyolight/groovy-vending/tree/master"&gt;Matt Taylor's example&lt;/a&gt;), and is not really a DSL.&lt;/li&gt;&lt;li&gt;It eschews some common Groovyisms (e.g. using an expression as the return value, without specifying the &lt;code&gt;return&lt;/code&gt; keyword).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Known Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is no REPL-loop or interaction with the user: only file input. Also, it emits no output per se, and does not acknowledge corner-cases, such as requiring exact change. It simply allows verification of expected state.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lessons Learned&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I love evaluation of data as code. I always have.&lt;/li&gt;&lt;li&gt;Tests are essential with Groovy, &lt;span style="font-weight: bold;"&gt;and&lt;/span&gt; they become inextricably tied to your experience as a developer. This is hard to explain, but because of the dynamic types, the tests cement themselves into your dev cycle in a way that is much stronger than Java. If you cheat with a large method that does not have a test, you'll probably pay for it.&lt;/li&gt;&lt;li&gt;It is important to read the output when a test fails. Often, I just scan it and blithely assume I know where the problem is. This usually leads to frustration, until I realize that the test was &lt;span style="font-weight: bold;"&gt;trying&lt;/span&gt; to help me &lt;span style="font-style: italic;"&gt;all along&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;As an aside, this is my first project in Git. It is excellent and definitely worth studying.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;The Gist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I hope this example helps someone. I hope to write some others, including a full-on Groovy MOP version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6734543901500816465?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6734543901500816465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6734543901500816465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6734543901500816465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6734543901500816465'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/08/vending-machine-modest-groovy-example.html' title='Vending Machine: A Modest Groovy Example'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1770962262759595357</id><published>2009-07-29T05:43:00.000-07:00</published><updated>2009-07-29T10:35:30.285-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code reviews'/><title type='text'>More On Code Reviews</title><content type='html'>Your friend and mine, &lt;a href="http://marioaquino.blogspot.com/"&gt;Mario Aquino&lt;/a&gt;, has an &lt;a href="http://marioaquino.blogspot.com/2009/07/my-code-review-criteria_26.html"&gt;excellent post&lt;/a&gt; on material for code reviews. In classic blogger tradition, why leave a comment when I can write a post?&lt;br /&gt;&lt;br /&gt;I agree with his points, and will add my own below. Don't leave a comment saying 'what about unit tests?'. Mario has already covered a lot, so consider his post.&lt;br /&gt;&lt;br /&gt;I once wrote about the &lt;a href="http://codetojoy.blogspot.com/2007/02/universal-issues.html"&gt;Universal Issues&lt;/a&gt; that affect a software project. They influence this list.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Architectural Harmony&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mario writes about harmony within a source-file. One can expand that to the level of architecture: is this code in the proper place, with respect to the architecture? Is it in the right package/module?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Client-Side Specifics&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Does the code follow known conventions for a GUI? e.g. In a Swing app, does it use the event-dispatch thread appropriately? What about i18n?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Server-Side Boundaries&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Similar to the architectural harmony above, is the code correct with respect to transactions? concurrency? In a framework situation, these are often handled at an outer scope, but it is important to place ourselves in the appropriate context.&lt;br /&gt;&lt;br /&gt;Concurrency is a fun topic because developers have an involuntary reflex: we look upwards to the ceiling whenever asked about multi-threading. Try it, and see for yourself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Is Immortal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As I've said before, versioning is the toughest problem in software engineering, especially given that data lives forever. I've been on projects where data must persist across versions, and in this case, it is vital to give consideration to this aspect during a code review. The gotchas are downright ghostly and ghastly: i.e. hard to see, and expensive.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Thought On Delivery&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is dangerous to riff through such a list in &lt;span style="font-style: italic;"&gt;every&lt;/span&gt; code review.  It will frustrate the developer and eventually turn people off from asking for code reviews. Though always wise to keep these things in mind, it is important to know &lt;span style="font-style: italic;"&gt;when&lt;/span&gt; to &lt;span style="font-weight: bold;"&gt;ask out loud&lt;/span&gt;. That is a true art, and can only be gained by experience and a sensitivity to the working conditions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1770962262759595357?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1770962262759595357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1770962262759595357' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1770962262759595357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1770962262759595357'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/07/more-on-code-reviews.html' title='More On Code Reviews'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5451377969899560685</id><published>2009-07-28T19:49:00.000-07:00</published><updated>2009-07-28T20:04:57.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cool conferences'/><title type='text'>The Strange Loop (Why You Need To Be In St Louis, Oct 09)</title><content type='html'>Alex Miller is organizing a terrific conference in St Louis (October 2009). Check out all the details &lt;a href="http://thestrangeloop.com/"&gt;over at the website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are in the midwest USA, you won't find a better value. Hell, if you are &lt;span style="font-style: italic;"&gt;on another continent&lt;/span&gt;, you won't find a better value. Come on over.&lt;br /&gt;&lt;br /&gt;You may think I'm biased, but check out &lt;a href="http://thestrangeloop.com/sessions"&gt;the session list&lt;/a&gt;, and see for yourself. Lots of interesting, off-the-beaten-path stuff by first class speakers, with even more to be announced: I believe the 'Strange Passions' track is still open.&lt;br /&gt;&lt;br /&gt;Alex envisioned an esoteric conference that he would like to attend -- and the dream is forming right before our eyes. Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5451377969899560685?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5451377969899560685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5451377969899560685' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5451377969899560685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5451377969899560685'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/07/strange-loop-why-you-need-to-be-in-st.html' title='The Strange Loop (Why You Need To Be In St Louis, Oct 09)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7714623620562170567</id><published>2009-06-11T10:24:00.000-07:00</published><updated>2009-06-11T11:10:42.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brought to you by the letter G'/><title type='text'>The Case for Groovy</title><content type='html'>This month's &lt;a href="http://java.ociweb.com/javasig/"&gt;StL JUG&lt;/a&gt; features &lt;a href="http://weblog.dangertree.net/"&gt;Matt Taylor&lt;/a&gt; speaking on TDD with Groovy (tonight!).&lt;br /&gt;&lt;br /&gt;Like last month's &lt;a href="http://codetojoy.blogspot.com/2009/05/case-for-clojure.html"&gt;post on Clojure&lt;/a&gt;, I'll play law professor, and try my hand at making some arguments that Groovy is the JVM-based language you should learn (if you can only pick one). Like last time, I'm treating this as an exercise, though this is easy, as I am a Groovy fan.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Grails&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Long ago, I would say that the first reason for Groovy was its learning curve. That is still important (see below), but my new first reason is: &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I imagine most readers are familiar with Grails: a Rails-influenced web framework that stands on the shoulders of giants -- namely, Hibernate and Spring. The reason I put this item up front and center is that you &lt;span style="font-weight: bold;"&gt;can make money&lt;/span&gt; with it. There are real jobs to be had here, folks. This is a powerful framework with plenty of momentum.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Griffon, GORM, Gradle, Gant, ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In addition to Grails, there are several other projects that are intimately related to the Java platform. e.g. &lt;a href="http://groovy.codehaus.org/Griffon"&gt;Griffon&lt;/a&gt; brings Grails-like conventions to Swing apps. Straight from Grails, &lt;a href="http://grails.org/GORM"&gt;GORM&lt;/a&gt; is a DSL for Hibernate mappings. &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt; is a next-gen build system that stands on top of Ant and Maven, without all that nasty XML. &lt;a href="http://groovy.codehaus.org/Gant"&gt;Gant&lt;/a&gt; is somewhat similar, used by Grails.&lt;br /&gt;&lt;br /&gt;The upshot is that the Groovy community is vibrant and doing many different things: surely something &lt;span style="font-weight: bold;"&gt;will be useful &lt;/span&gt;to your project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Language&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Up to this point, I haven't written about the language itself. IMO, Groovy seems familiar to Java, but with all of the ceremony stripped away.  Tremendous amounts of boilerplate are removed: getters/setters are gone; access modifiers have reasonable defaults; regular expressions are trivially easy; and so on.&lt;br /&gt;&lt;br /&gt;But there's more: dynamic typing, closures, the Meta-Object Protocol, and other features provide a rich feature-set that is quite different from a merely trimmed Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tools and Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Groovy-Recipes-Greasing-Pragmatic-Programmers/dp/0978739299"&gt;Scott Davis has written an excellent book&lt;/a&gt; with the subtitle "&lt;span style="font-style: italic;"&gt;Greasing &lt;/span&gt;the Wheels of Java". That is spot-on. For XML, web services, scripting Java libraries, etc, Groovy is amazingly useful and effective.&lt;br /&gt;&lt;br /&gt;One of these aspects is testing (this is where Matt's talk applies). Groovy has tremendous support for unit-tests, including mocks and stubs. The dynamic nature of the language offers a lot of options.  Come on out to the talk to see more on this item.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Gentle Learning Curve, With Growth&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you know Java, Groovy is extremely easy to learn: in fact, almost all Java will run &lt;span style="font-style: italic;"&gt;as&lt;/span&gt; Groovy. The curve actually goes &lt;span style="font-style: italic;"&gt;downhill&lt;/span&gt; (in a good, effortless way).&lt;br /&gt;&lt;br /&gt;Now, you may dismiss this. As a reader of this and other fine blogs, you may be confident that you can learn &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; language, thanks. I'm sure you can. The usefulness of the learning curve is that your work (e.g. a utility) is far more likely to be used by other &lt;span style="font-weight: bold;"&gt;Java&lt;/span&gt; developers. In a team environment, that's important. Groovy is unmatched in this regard: it promotes social computing.&lt;br /&gt;&lt;br /&gt;That is, if you want it to do so. If you want to do something wild, Groovy allows you to grow into that as well. In this spirit, it is reminiscent of Python: the curve is always reasonable but seems to climb forever. As mentioned, the dynamic nature of the language will definitely, quickly, take you to places that you haven't been using only Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I realize there are no code samples in this post. I apologize. Again, this is a quick list of 'arguments' for learning Groovy as your next language on the JVM. There is a ton of material out there, both in free documentation and in books.&lt;br /&gt;&lt;br /&gt;(Full disclosure, some of the following authors are friends.)&lt;br /&gt;&lt;br /&gt;For Groovy books, start with either &lt;a href="http://www.amazon.com/Programming-Groovy-Productivity-Developer-Programmers/dp/1934356093/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1244743040&amp;amp;sr=1-1"&gt;Programming Groovy&lt;/a&gt; or &lt;a href="http://www.amazon.com/Groovy-Recipes-Greasing-Pragmatic-Programmers/dp/0978739299"&gt;Groovy Recipes&lt;/a&gt;.  For Grails books, pick up either &lt;a href="http://pragprog.com/titles/dkgrails/grails"&gt;Grails: A Quick-Start Guide&lt;/a&gt; or the ultimate reference, &lt;a href="http://apress.com/book/view/1590599950"&gt;The Definitive Guide to Grails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Either way, give Groovy a shot, or come on out to the &lt;a href="http://ociweb.com/javasig"&gt;StL JUG&lt;/a&gt;. It is time well-spent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7714623620562170567?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7714623620562170567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7714623620562170567' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7714623620562170567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7714623620562170567'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/06/case-for-groovy.html' title='The Case for Groovy'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2853783700714080223</id><published>2009-06-04T06:17:00.000-07:00</published><updated>2009-06-04T10:44:57.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tonight&apos;s entertainment'/><title type='text'>Haskell and MacRuby at Lambda Lounge</title><content type='html'>A quick reminder that tonight's Lambda Lounge features talks on Haskell and MacRuby. Both speakers are friends: they really know their stuff, so it should be a fantastic evening.&lt;br /&gt;&lt;br /&gt;For more details, check out &lt;a href="http://lambdalounge.org/2009/06/01/june-meeting-haskell-and-macruby/"&gt;this post&lt;/a&gt; over on the LL site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2853783700714080223?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2853783700714080223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2853783700714080223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2853783700714080223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2853783700714080223'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/06/haskell-and-macruby-at-lamba-lounge.html' title='Haskell and MacRuby at Lambda Lounge'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8896026464865644436</id><published>2009-05-28T19:44:00.000-07:00</published><updated>2009-05-28T20:03:13.994-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pop psych'/><title type='text'>Beware Of Mumpsimus</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;In first year of university, I took a class that used the wonderful book &lt;a href="http://college.cengage.com/collegesurvival/ellis/master_student/10e/students/"&gt;Becoming A Master Student&lt;/a&gt;. The book had many stories that have stayed with me over the years.&lt;br /&gt;&lt;br /&gt;One is the &lt;a href="http://www.worldwidewords.org/qa/qa-mum1.htm"&gt;story of mumpsimus&lt;/a&gt;. You can read more at the link, but the gist is that a monk used a Latin word, &lt;span style="font-style: italic;"&gt;mumpsimus&lt;/span&gt;, for decades before discovering it was bogus. Upon the revelation, the monk replied that he didn't care: he had been using it for 40 years and so it would it remain.&lt;br /&gt;&lt;br /&gt;In my freshman year, I was an uncomfortable chemistry major. Little did I know that I would be writing about that story many years, later vis-a-vis computer science. (The story itself may go back centuries!)&lt;br /&gt;&lt;br /&gt;I mentioned mumpsimus in the comments of the last post. I had speculated on using &lt;code&gt;protected&lt;/code&gt; methods over &lt;code&gt;private&lt;/code&gt; methods. The feedback was unified in its rejection of the idea, yet I mused that I would probably continue my style. Ouch. That is mumpsimus indeed: after seeking opinions, I launched a heroic denial of the responses and continued on my merry way. Nice.&lt;br /&gt;&lt;br /&gt;Another example is the defeat of mumpsimus. Years ago, in C++, I would define class members like so:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;class Person {&lt;br /&gt;  int m_id;&lt;br /&gt;  string m_name;&lt;br /&gt;  int m_age;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When I turned to Java, I held on to that style -- for about 1 day. When I saw what IDEs could do for automatically generating getters and setters, it became obvious that the prefix had to go. Thankfully, logic carried the day over mumpsimus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The point here is that we have a name for a particular mindset, and a reminder that it is important to re-evaluate ideas with an honest understanding of our biases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8896026464865644436?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8896026464865644436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8896026464865644436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8896026464865644436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8896026464865644436'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/05/beware-of-mumpsimus.html' title='Beware Of Mumpsimus'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7230127592397223205</id><published>2009-05-27T04:32:00.000-07:00</published><updated>2009-05-27T05:00:08.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='to be served and protected'/><title type='text'>Java Methods: protected is the new private?</title><content type='html'>In code reviews (including my code), when I see a Java method marked as &lt;code&gt;private&lt;/code&gt;, I ask if there are any unit tests for it.&lt;br /&gt;&lt;br /&gt;Since tests are written in other files in parallel packages, the answer, of course, is no.&lt;br /&gt;&lt;br /&gt;I've recently realized that I've obtained the following habit: my methods are either &lt;code&gt;public&lt;/code&gt; or &lt;code&gt;protected&lt;/code&gt;. I have no use for &lt;a href="http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html"&gt;&lt;code&gt;default&lt;/code&gt;&lt;/a&gt; or &lt;a href="http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html"&gt;&lt;code&gt;private&lt;/code&gt;&lt;/a&gt;. I don't like &lt;code&gt;default&lt;/code&gt; because I feel compelled to write a comment saying that it is package-level access; I don't like &lt;code&gt;private&lt;/code&gt; because of the lack of testing options.&lt;br /&gt;&lt;br /&gt;Before you start hammering in comments, here are some thoughts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This is not for a formal API to another team or other 3rd party. In that case, I would be more careful and rigid. You may argue there is no distinction, in which case: commence hammering.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I realize that &lt;code&gt;protected&lt;/code&gt; is not &lt;code&gt;default&lt;/code&gt; and that it is leaking encapsulation somewhat. I can cheerily say that I don't care. I like scanning a file and seeing either &lt;code&gt;public&lt;/code&gt; or &lt;code&gt;protected&lt;/code&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I'm not trumpeting that I write more unit-tests than others on my team. Just because a method is &lt;code&gt;protected&lt;/code&gt; doesn't mean that I've written the tests!&lt;/li&gt;&lt;/ul&gt;What do you think? Has your style changed over the years, with respect to access modifiers on methods?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7230127592397223205?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7230127592397223205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7230127592397223205' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7230127592397223205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7230127592397223205'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/05/java-methods-protected-is-new-private.html' title='Java Methods: protected is the new private?'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-881068979985146427</id><published>2009-05-13T19:16:00.000-07:00</published><updated>2009-05-13T20:16:07.598-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='fp'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>The Case for Clojure</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At NFJS shows, a common question is "I only have time to learn one new language on the JVM: which should I pick?".&lt;br /&gt;&lt;br /&gt;The easy answer is true: it doesn't matter. Just pick one already!&lt;br /&gt;&lt;br /&gt;However, I think people can reasonably ask for more information.&lt;br /&gt;&lt;br /&gt;Even though my personal favourite is Groovy, I fancy that, like a good law professor, I could argue a decent case for any of them.&lt;br /&gt;&lt;br /&gt;In this post, I'll write a bit on Clojure. To be honest, the title is deceiving: I don't know Clojure, and this isn't a full-blown legal case. I'm really inviting you to some resources (see below).&lt;br /&gt;&lt;br /&gt;However, I know enough to see the benefit. This is an earnest post.&lt;br /&gt;&lt;br /&gt;Mark Volkmann is giving &lt;a href="http://java.ociweb.com/javasig/"&gt;a Clojure talk&lt;/a&gt; on Thursday at the St Louis JUG. Quoting from his intro, Clojure is a dynamically-typed, functional programming language that runs on the JVM.&lt;br /&gt;&lt;br /&gt;From past talks, and from Mark's intro, here are some reasons I think Clojure is worthy of your consideration:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Let's Lisp Again, &lt;a href="http://www.youtube.com/watch?v=5krtVb9zZFI"&gt;Like We Did Last Semester&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you liked Lisp back in university, welcome back: Clojure has a Lisp-like syntax and style. Both the syntax and functional programming seems new again, in part thanks to &lt;a href="http://www.pragprog.com/titles/shcloj/programming-clojure"&gt;Stuart Halloway's book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here, 'new' means a shot-in-the-arm to the FP community and a welcoming online scene. Let's face it: it can be &lt;span style="font-style: italic;"&gt;lonely&lt;/span&gt; when studying older languages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Got Lisp?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you don't know Lisp or functional programming, adding Clojure to your repetoire is almost like right-brain thinking. It is profoundly different from Java, C#, and other imperative languages.  This is important in order to truly grow. To borrow from natural languages: it's cool if you know French and Spanish, but it's &lt;span style="font-style: italic;"&gt;cooler&lt;/span&gt; if you know French and Chinese (or Spanish and Chinese).&lt;br /&gt;&lt;br /&gt;Bonus: though not unique to FP, Clojure can execute data &lt;span style="font-style: italic;"&gt;as code&lt;/span&gt;. This is powerful, and quite underrated, IMHO. This goes all the way back to grand-daddy Lisp, so you'll be learning from one of &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fitknowledgeexchange.techtarget.com%2Fwhatis%2Fcode-to-joys-7-wonders-of-programming-languages%2F&amp;amp;ei=togLSsXmOYq7mQem66maCA&amp;amp;usg=AFQjCNHszwYHNZ1Adskr59Tkd1_H-EmuXw"&gt;the undisputed giants&lt;/a&gt;. What's more both Lisp and Clojure have a minimal, consistent syntax. Though it is, er, mind-expanding at first, many people become true fans of the philosophy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Transactional Memory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Concurrency is the new memory management. Memory management was a beast until garbage collection evolved, over decades, to be a shining sword.&lt;br /&gt;&lt;br /&gt;Now, on the JVM, we've tamed the memory beast and wrestle with concurrency. Consider &lt;a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601"&gt;books like this&lt;/a&gt;: JCiP is an outstanding book, but it is a tough go, in part because the developer must coordinate lock-level tools. Or, worse, a &lt;span style="font-style: italic;"&gt;team &lt;/span&gt;of people must coordinate lock-level tools.&lt;br /&gt;&lt;br /&gt;What if we had something really different -- a pseudo-intelligent agent &lt;span style="font-style: italic;"&gt;like&lt;/span&gt; a garbage collector, except &lt;span style="font-style: italic;"&gt;aimed at concurrency&lt;/span&gt;? That's what Clojure offers: a unique alternative that might (and that's all we can say: &lt;span style="font-style: italic; font-weight: bold;"&gt;might&lt;/span&gt;) slay the beast of our time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Come on out to &lt;a href="http://java.ociweb.com/javasig/"&gt;the JUG&lt;/a&gt; on Thursday, or if you aren't in St Louis, check out Mark's &lt;a href="http://jnb.ociweb.com/jnb/jnbMar2009.html"&gt;excellent article on Clojure&lt;/a&gt;. It is quite thorough, and has received kudos from the Clojure community.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-881068979985146427?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/881068979985146427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=881068979985146427' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/881068979985146427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/881068979985146427'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/05/case-for-clojure.html' title='The Case for Clojure'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3148733583390148159</id><published>2009-05-13T10:17:00.000-07:00</published><updated>2009-05-13T10:27:12.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='no excuses'/><title type='text'>Mandatory Listening: Michael Nygard on SE-Radio</title><content type='html'>Ted Neward &lt;a href="http://blogs.tedneward.com/2007/10/08/A+Book+Every+Developer+Must+Read.aspx"&gt;has told us&lt;/a&gt; to buy Michael Nygard's &lt;a href="http://www.pragprog.com/titles/mnee/release-it"&gt;Release It&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;I&lt;/span&gt; &lt;a href="http://codetojoy.blogspot.com/2008/11/car-pooling-with-ebay-erlang-and.html"&gt;have told you&lt;/a&gt; to listen to Software Engineering Radio.&lt;br /&gt;&lt;br /&gt;Perhaps you haven't listened. Perhaps you've been busy, or perhaps you reject advice from respected IT leaders (and me) on principle.&lt;br /&gt;&lt;br /&gt;Well, now there are &lt;span style="font-style: italic;"&gt;no&lt;/span&gt; excuses: check out &lt;a href="http://www.se-radio.net/podcast/2009-05/episode-134-release-it-michael-nygard"&gt;SE-Radio episode 134 with Michael Nygard&lt;/a&gt;. You may &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; refute an implicit &lt;span style="font-style: italic;"&gt;double&lt;/span&gt; recommendation!&lt;br /&gt;&lt;br /&gt;Believe me, you won't regret it. Then read the book and check out his talks on the NFJS tour.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3148733583390148159?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3148733583390148159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3148733583390148159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3148733583390148159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3148733583390148159'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/05/mandatory-listening-michael-nygard-on.html' title='Mandatory Listening: Michael Nygard on SE-Radio'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8723114591006180648</id><published>2009-05-05T20:36:00.000-07:00</published><updated>2009-05-05T20:51:25.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='a different kind of project coin'/><title type='text'>Language Shootout At Lambda Lounge</title><content type='html'>Gmail has been recommending "vending machines" ads to me for some weeks now.&lt;br /&gt;&lt;br /&gt;Here's why: &lt;a href="http://lambdalounge.org"&gt;the Lambda Lounge&lt;/a&gt; has issued the &lt;a href="http://stllambdalounge.files.wordpress.com/2009/03/vendingmachinespecification.pdf"&gt;Vending Machine&lt;/a&gt; exercise as a way to showcase the idioms of different languages (and there has been good discussions on the mailing list, hence the Google ads).&lt;br /&gt;&lt;br /&gt;If you are in St Louis, drop by on Thursday night (&lt;a href="http://lambdalounge.org/2009/05/05/may-meeting/"&gt;details here&lt;/a&gt;), to see some live demos! There are a &lt;span style="font-style: italic;"&gt;wide&lt;/span&gt; variety of languages on display.&lt;br /&gt;&lt;br /&gt;For best results, take a shot with a language of your choice. Though somewhat behind, I've been working on a Groovy version.&lt;br /&gt;&lt;br /&gt;Stay tuned to the website (or &lt;a href="http://lambdalounge.org/mailing-list/"&gt;the mailing list&lt;/a&gt;) to find resources to examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8723114591006180648?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8723114591006180648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8723114591006180648' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8723114591006180648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8723114591006180648'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/05/language-shootout-at-lambda-lounge.html' title='Language Shootout At Lambda Lounge'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-185646078734001590</id><published>2009-04-24T05:19:00.000-07:00</published><updated>2009-04-24T05:50:26.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='patently false'/><category scheme='http://www.blogger.com/atom/ns#' term='satire'/><title type='text'>What is this, the developer's version of The Onion?</title><content type='html'>I've started a new venture: &lt;a href="http://twitter.com/statuses/user_timeline/33727328.rss"&gt;Patently False&lt;/a&gt;. Tech headlines and gossip from the cutting edge of satire.&lt;br /&gt;&lt;br /&gt;Here &lt;a href="http://twitter.com/statuses/user_timeline/33727328.rss"&gt;is an RSS feed&lt;/a&gt; and &lt;a href="http://twitter.com/patentlyfalse"&gt;here is a Twitter feed&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Story&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CodeToJoy's model has been, vaguely, &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCalvin_and_Hobbes&amp;amp;ei=ILHxSaGeKcOe-AbBy42hDw&amp;amp;usg=AFQjCNFNzwBNQNIJ4aX42lzxQ-pfRanhWQ"&gt;Calvin and Hobbes&lt;/a&gt;, with posts that range from &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fitknowledgeexchange.techtarget.com%2Fwhatis%2Fcode-to-joys-7-wonders-of-programming-languages%2F&amp;amp;ei=M7HxScDRNcfN-Qap_JGmDw&amp;amp;usg=AFQjCNHszwYHNZ1Adskr59Tkd1_H-EmuXw"&gt;the earnest&lt;/a&gt; to &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fcodetojoy.blogspot.com%2F2007%2F11%2Flas-vegas-lobbies-for-java-6-on-leopard.html&amp;amp;ei=RLHxScWpB5av-AaR642_Dw&amp;amp;usg=AFQjCNEBmqSvfL1vt5PUhWjVNqQYM2eT4w"&gt;the absurd&lt;/a&gt;. Long-time readers can stay with me, and adjust easily as the sincerity scale changes.&lt;br /&gt;&lt;br /&gt;However, I realize that it's difficult for newbies to pin down the vibe. The title of this post is a comment that was left on Reddit or DZone, months ago. For CodeToJoy, the answer is "it depends on the post".&lt;br /&gt;&lt;br /&gt;Though my writing certainly doesn't compare to genius of C&amp;amp;H or The Onion, I've decided to branch out. &lt;a href="http://twitter.com/patentlyfalse"&gt;Patently False&lt;/a&gt; will be all absurdity, all the time -- a &lt;span style="font-weight: bold;"&gt;resounding yes&lt;/span&gt; to this post's title. To combat ambiguity, I put a disclaimer right in the title.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Organization&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Also, I've decided to go ultra-lightweight: headlines only, on Twitter. On Google Reader, I've noticed that &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.theonion.com%2F&amp;amp;ei=hrPxSe7oIoSV-gaRhbyvDw&amp;amp;usg=AFQjCNEpHfwDik4DUv9pVS4vWrzk-a_aXQ"&gt;The Onion&lt;/a&gt; can make me laugh with a good headline.  Sometimes, the stories seem like a forced, obligatory exercise.&lt;br /&gt;&lt;br /&gt;There is a &lt;a href="http://patentlyfalse.blogspot.com/"&gt;blog site&lt;/a&gt;, with an official introduction and explanation of the &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FInterrobang&amp;amp;ei=-bTxScP7OdnG-QaNo83ADw&amp;amp;usg=AFQjCNGoJEMwfEpDJE9z7pjfe1SurjNU3w"&gt;interrobang&lt;/a&gt;, but for now that is mostly a holding area.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Subscribe today....  I reserve the right to do longer, full spoof pieces on CodeToJoy: this blog won't change. After all, the nation of The Joyous must be served!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-185646078734001590?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/185646078734001590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=185646078734001590' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/185646078734001590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/185646078734001590'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/what-is-this-developers-version-of.html' title='What is this, the developer&apos;s version of The Onion?'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8107168575804785233</id><published>2009-04-20T17:25:00.000-07:00</published><updated>2009-04-21T06:12:30.871-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='sun'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Top Ten Reasons Java Developers Fear The Oracle Buyout</title><content type='html'>It is huge news indeed, and so without further ado, here are the Top Ten Reasons why Java developers fear the Oracle buyout:&lt;br /&gt;&lt;br /&gt;#10 Any Java class with the name &lt;code&gt;Table&lt;/code&gt; in it will have a 30 character limit&lt;br /&gt;&lt;br /&gt;#9 Your favorite open-source IDE will become a Toad plugin&lt;br /&gt;&lt;br /&gt;#8 Applications will become known as &lt;span style="font-style: italic;"&gt;Enterprise Stored Procedures&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#7 Ignoring silly hexadecimal, the CEO will insist the venerable &lt;code&gt;CAFEBABE&lt;/code&gt; header be changed to &lt;code&gt;IAMLARRY&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;#6 Prospective JavaOne speakers will need to win a yacht race as part of the acceptance process. JavaOne itself will be held on a desert island.&lt;br /&gt;&lt;br /&gt;#5 The beloved Java Posse will suddenly resurface as the &lt;span style="font-style: italic;"&gt;PL/SQL Posse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#4 The classloader will become a fork of MySQL and require a series of certification tests before modification&lt;br /&gt;&lt;br /&gt;#3 The next version of Java will be known as JDK 7g&lt;br /&gt;&lt;br /&gt;#2 A new Swing API will replace EventListener with TNSListener, requiring annoying server configuration.&lt;br /&gt;&lt;br /&gt;and the top reason Java developers fear the Oracle buyout:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;#1 DBAs will park in reserved slots, acquire window offices, and gleefully demand that &lt;span style="font-weight: bold;"&gt;everything&lt;/span&gt; goes into Fourth Normal Form.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you like this kind of humor, come on over to a brand-new Twitter feed...&lt;br /&gt;&lt;br /&gt;Introducing &lt;a href="http://twitter.com/patentlyfalse"&gt;@patentlyfalse&lt;/a&gt; (read &lt;a href="http://patentlyfalse.blogspot.com/"&gt;more here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Even if you aren't on Twitter, &lt;a href="http://twitter.com/statuses/user_timeline/33727328.rss"&gt;here is an RSS feed&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8107168575804785233?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8107168575804785233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8107168575804785233' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8107168575804785233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8107168575804785233'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/top-ten-reasons-java-developers-fear.html' title='Top Ten Reasons Java Developers Fear The Oracle Buyout'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-827669543520602052</id><published>2009-04-19T13:26:00.000-07:00</published><updated>2009-04-19T14:01:40.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thanks Ed'/><title type='text'>Historical Footnote on Design Patterns</title><content type='html'>When it rains, it pours. I recently attended an excellent talk on "&lt;a href="http://tech.puredanger.com/presentations/design-patterns-reconsidered"&gt;Design Patterns Reconsidered&lt;/a&gt;" by &lt;a href="http://tech.puredanger.com"&gt;Alex Miller&lt;/a&gt;.  Around the same time, I was listening to a &lt;a href="http://se-radio.net/"&gt;Software Engineering radio&lt;/a&gt; podcast (on &lt;a href="http://www.amazon.com/Adrenaline-Junkies-Template-Zombies-Understanding/dp/0932633676"&gt;Adrenalin Junkies&lt;/a&gt;) and heard a comment that merits amplification.&lt;br /&gt;&lt;br /&gt;Many people know (or would know, if they attended Alex's talk) that the seminal book, &lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612"&gt;Design Patterns&lt;/a&gt;, was heavily influenced by books on architecture by &lt;a href="http://en.wikipedia.org/wiki/Christopher_Alexander"&gt;Christopher Alexander&lt;/a&gt;. In Design Patterns, the now-famous Gang of Four certainly discuss Alexander, and list patterns-based literature of the era, vis-a-vis software architecture -- but there isn't much on the semantic gap between architecture and computer science. How did we discover Alexander in the&lt;span style="font-style: italic;"&gt; first place&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;On the podcast, a woman points out that &lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439"&gt;Peopleware&lt;/a&gt; is one of the first known books on software to reference Alexander's works (though note that the context is organizing office space).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Tom_DeMarco"&gt;Tom deMarco&lt;/a&gt; acknowledges the comment, but states that &lt;a href="http://en.wikipedia.org/wiki/Edward_Yourdon"&gt;Edward Yourdon&lt;/a&gt; was a major factor in bringing the book into consciousness of IT (in the early 1970s). Though he can only comment for himself (and not the Gang of Four), deMarco goes on to say that he owes "a personal debt" to Yourdon.&lt;br /&gt;&lt;br /&gt;Perhaps, we all owe thanks?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-827669543520602052?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/827669543520602052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=827669543520602052' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/827669543520602052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/827669543520602052'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/historical-footnote-on-design-patterns.html' title='Historical Footnote on Design Patterns'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6221498293711412851</id><published>2009-04-18T11:01:00.000-07:00</published><updated>2009-04-18T11:08:59.686-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTH'/><title type='text'>Trimming a string column in PostgreSQL</title><content type='html'>In case this helps anyone... I had to figure it out recently and though it isn't hard, it isn't obvious either.&lt;br /&gt;&lt;br /&gt;Here's how to truncate a string column in Postgres. Assume the column is of length &lt;code&gt;M&lt;/code&gt; where &lt;code&gt;M &amp;gt; N&lt;/code&gt; and we want it to be &lt;code&gt;N&lt;/code&gt; with simple trim:&lt;br /&gt;&lt;pre&gt;alter table T alter column C type varchar(N)&lt;br /&gt;      using substring(C from 1 for N);&lt;br /&gt;&lt;/pre&gt;The key is that &lt;code&gt;C&lt;/code&gt; references both the column name (in the first instance) and the &lt;span style="font-style: italic;"&gt;value&lt;/span&gt; (in the second instance).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6221498293711412851?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6221498293711412851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6221498293711412851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6221498293711412851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6221498293711412851'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/trimming-string-column-in-postgresql.html' title='Trimming a string column in PostgreSQL'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7448096635435723950</id><published>2009-04-16T17:29:00.000-07:00</published><updated>2009-04-16T19:16:51.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads'/><category scheme='http://www.blogger.com/atom/ns#' term='klingons'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Monads 102: using Haskell online (or 'Finding your inner Klingon')</title><content type='html'>&lt;span style="font-weight: bold;"&gt;The Goal&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This post is a long-delayed follow-up to a talk I gave at &lt;a href="http://lambdalounge.org/meeting-archive/"&gt;the Lambda Lounge&lt;/a&gt;. It will use a simple code example to show some intermediate ideas of monads in Haskell.&lt;br /&gt;&lt;br /&gt;The best part is that the code can be pasted into &lt;a href="http://codepad.org/"&gt;Codepad&lt;/a&gt; (no affiliation) and tinkered with. No download necessary!&lt;br /&gt;&lt;br /&gt;(Note that &lt;a href="http://www.sdtimes.com/content/article.aspx?ArticleID=33399"&gt;a recent review of RWH&lt;/a&gt; calls Haskell "like Klingon, but with math". Hence the subtitle.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where is Monads 101?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is no Monads 101 post on this blog. This is part of the zen of monads, as explained in &lt;a href="http://codetojoy.blogspot.com/2009/03/monads-are-burritos.html"&gt;Monads are Burritos&lt;/a&gt;. I did my best at the Lambda Lounge, and have some fun ideas for the future, but for now, this post is intended for readers who have some background in Haskell.&lt;br /&gt;&lt;br /&gt;Ok, ok, as a super brief recap, check out &lt;a href="http://twitpic.com/1xavz"&gt;this photo&lt;/a&gt;.  Recall that&lt;br /&gt;&lt;br /&gt;1. &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt; is a type constructor (i.e. it is a generic type that wraps another type)&lt;br /&gt;&lt;br /&gt;2. &lt;code style="font-weight: bold;"&gt;a -&amp;gt; m a&lt;/code&gt; is a function that injects/wraps something of type &lt;span style="font-weight: bold;"&gt;a&lt;/span&gt; into something of type &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt;.  In Haskell, this is called &lt;code&gt;return&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;3. &lt;code style="font-weight: bold;"&gt;m a -&amp;gt; (a -&amp;gt; m b) -&amp;gt; m b&lt;/code&gt; is a function that takes a monad &lt;code style="font-weight: bold;"&gt;m a &lt;/code&gt;and another function, &lt;code style="font-weight: bold;"&gt;a -&amp;gt; m b&lt;/code&gt;. It returns &lt;code style="font-weight: bold;"&gt;m b&lt;/code&gt;. Loosely speaking, it breaks the inner type out of &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt; and applies the function, resulting in a computed value back inside another &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt;. The 'breaking out of' part is unspecified and unique to each monad. This whole doozie is called bind and uses this symbol: &lt;code style="font-weight: bold;"&gt;&amp;gt;&amp;gt;=&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It is vital to understand that &lt;code style="font-weight: bold;"&gt;a&lt;/code&gt;, &lt;code style="font-weight: bold;"&gt;b&lt;/code&gt;, and &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt; above are types (e.g. &lt;code&gt;Integer&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;). Haskell has a gorgeous fluidity between data variables and type variables that can be confusing at first.&lt;br /&gt;&lt;br /&gt;A monad is a type that supports all three of the above. I warned you that this was &lt;span style="font-style: italic;"&gt;Monads 102&lt;/span&gt;. If you aren't comfortable at this point, that's fine. This is non-trivial stuff.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Goals&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We'll take a code example that defines a trivial function called &lt;code&gt;tuple&lt;/code&gt;. This example won't change but we'll send in some different monadic values and see what happens.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example: Maybe (with Integer)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Here is the full example... Paste this into &lt;a href="http://codepad.org/"&gt;Codepad&lt;/a&gt;:&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;-- see comments below&lt;br /&gt;tuple mx = mx &amp;gt;&amp;gt;= \x -&amp;gt; return (x, x + 1 )&lt;br /&gt;&lt;br /&gt;mx = Just 10&lt;br /&gt;&lt;br /&gt;main = (print (tuple mx))&lt;br /&gt;&lt;/pre&gt;Here is a version with comments:&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;-- In English, tuple accepts a mx, a monad.&lt;br /&gt;-- The monad pulls x out, and builds a simple tuple&lt;br /&gt;-- which is returned in a monad of the same type.&lt;br /&gt;-- Here mx is a variable name. It is of type 'm a'&lt;br /&gt;-- where m and a are types&lt;br /&gt;--&lt;br /&gt;-- 1. tuple takes m a and returns m (a, a)&lt;br /&gt;-- 2. note that \x -&amp;gt; ... is a lambda expression&lt;br /&gt;--    with a parameter 'x'. This expression is&lt;br /&gt;--    the function a -&amp;gt; m b that is passed to bind.&lt;br /&gt;-- 3. &amp;gt;&amp;gt;= is called 'bind' because it binds the&lt;br /&gt;--    value of x&lt;br /&gt;-- NOTE: mx defines the way &amp;gt;&amp;gt;= behaves!!!&lt;br /&gt;&lt;br /&gt;tuple mx = mx &amp;gt;&amp;gt;= \x -&amp;gt; return (x, x + 1 )&lt;br /&gt;&lt;br /&gt;-- mx is of type Maybe Integer&lt;br /&gt;&lt;br /&gt;mx = Just 10&lt;br /&gt;&lt;br /&gt;-- main just prints the result&lt;br /&gt;&lt;br /&gt;main = (print (tuple mx))&lt;br /&gt;&lt;/pre&gt;The output should be:&lt;br /&gt;&lt;pre&gt;Just (10,11)&lt;br /&gt;&lt;/pre&gt;Try some other values for &lt;code&gt;mx&lt;/code&gt;. Experimentation here will be worth a zillion words and comments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example: Maybe (with Double)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the Codepad editor, change the value of &lt;code&gt;mx&lt;/code&gt; to:&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;mx = Just 3.14&lt;br /&gt;&lt;/pre&gt;and run again. Since Haskell is Klingon-esque about types, this is a big deal. The &lt;code&gt;tuple&lt;/code&gt; function works with &lt;code&gt;Maybe Integer&lt;/code&gt; as well as &lt;code&gt;Maybe Double&lt;/code&gt;. In fact, it should work with any &lt;code style="font-weight: bold;"&gt;m a&lt;/code&gt; where &lt;code style="font-weight: bold;"&gt;a&lt;/code&gt; supports addition.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Example: Maybe (with Nothing)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, again in &lt;a href="http://codepad.org/"&gt;Codepad&lt;/a&gt;, change the value of &lt;code&gt;mx&lt;/code&gt; to:&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;mx = Nothing&lt;br /&gt;&lt;/pre&gt;The output should be the same: &lt;code&gt;Nothing&lt;/code&gt;. What is happening? Recall that the monad supplies the bind function by 'breaking out' the inner type: but each monad can define that behaviour.&lt;br /&gt;&lt;br /&gt;In the case of &lt;code&gt;Maybe&lt;/code&gt;, that behaviour is defined in part as: if the value is &lt;code&gt;Nothing&lt;/code&gt;, then don't even &lt;i&gt;bother&lt;/i&gt; calling the supplied function! Hence, the result is &lt;code&gt;Nothing&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example: List&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's where things get fun... Let's wish &lt;code&gt;Maybe&lt;/code&gt; a fond farewell and use another monad: &lt;code&gt;List&lt;/code&gt;.  Remember that &lt;code&gt;tuple&lt;/code&gt; isn't going to change here.&lt;br /&gt;&lt;br /&gt;In&lt;a href="http://codepad.org/"&gt; Codepad&lt;/a&gt;, do this:&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;mx = [1,2,3,4]&lt;/pre&gt;Try and guess what the output should be, then run it.&lt;br /&gt;&lt;br /&gt;You should see:&lt;pre&gt;[(1,2),(2,3),(3,4),(4,5)]&lt;br /&gt;&lt;/pre&gt;The reason for this is that the &lt;code&gt;List&lt;/code&gt; monad uses a different definition for 'breaking out' when applying &amp;gt;&amp;gt;= / &lt;code&gt;bind&lt;/code&gt;.  Clearly, the &lt;code&gt;List&lt;/code&gt; definition is to apply the provided function to &lt;i&gt;each element&lt;/i&gt; in the list.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The upshot here is that &lt;code&gt;tuple&lt;/code&gt; isn't changing. The monads are changing. (Or for you Zen types, &lt;i&gt;your mind is changing. &lt;/i&gt;For Klingons, the semantics of the syntax is bending to your will.)&lt;br /&gt;&lt;br /&gt;It is important to note that &lt;code&gt;tuple&lt;/code&gt; is indeed a lame function with no utility. The types &lt;code&gt;Maybe&lt;/code&gt; and &lt;code&gt;List&lt;/code&gt; are useful; as monads, they are very basic. If you were to describe the 'breaking out' in pseudocode, they seem trivial:&lt;br /&gt;&lt;br /&gt;Given &lt;code style="font-weight: bold;"&gt;m &amp;gt;&amp;gt;= f&lt;/code&gt; where &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt; is &lt;code style="font-weight: bold;"&gt;m a&lt;/code&gt; and &lt;code style="font-weight: bold;"&gt;f&lt;/code&gt; is &lt;code style="font-weight: bold;"&gt;a -&amp;gt; m b&lt;/code&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;When &lt;code style="font-weight: bold;"&gt;m&lt;/code&gt; is &lt;code&gt;Maybe&lt;/code&gt;: if it has something, it applies &lt;code style="font-weight: bold;"&gt;f&lt;/code&gt;; else it does nothing.&lt;/li&gt;&lt;li&gt;When &lt;span style="font-weight: bold;"&gt;m&lt;/span&gt; is &lt;code&gt;List&lt;/code&gt;: it applies &lt;code style="font-weight: bold;"&gt;f&lt;/code&gt; for each element in the list.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Don't be fooled! There are other monads in Haskell that are &lt;i&gt;much&lt;/i&gt; more sophisticated (an intense example is the &lt;code&gt;STM&lt;/code&gt; monad for software transactional memory).&lt;br /&gt;&lt;br /&gt;The important thing is to understand that the power is in the 'breaking out', which is individual to the monad. Yet against that flexibility, we have seen with &lt;code&gt;tuple&lt;/code&gt; that monadic code remains constant.&lt;br /&gt;&lt;br /&gt;That's monads in a nutshell: rigidity and flexibility in a powerful combination.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7448096635435723950?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7448096635435723950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7448096635435723950' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7448096635435723950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7448096635435723950'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/monads-102-using-haskell-online-or.html' title='Monads 102: using Haskell online (or &apos;Finding your inner Klingon&apos;)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1665576495066670592</id><published>2009-04-15T10:22:00.000-07:00</published><updated>2009-04-15T14:41:05.175-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recommended podcasts'/><title type='text'>I love the Deep Fried Bytes, man!</title><content type='html'>(The title of this post comes from &lt;a href="http://blog.qoqoa.com/2009/03/02/lovin-the-groovy/"&gt;a quote by Dick Wall&lt;/a&gt;, professing his love for Groovy in the face of charges to the contrary.)&lt;br /&gt;&lt;br /&gt;A while back (&lt;a href="http://twitter.com/codetojoy"&gt;on Twitter&lt;/a&gt;), I made a comment about the podcast &lt;a href="http://deepfriedbytes.com/"&gt;Deep Fried Bytes&lt;/a&gt;. There was a brief exchange with the guys at DFB: it was friendly, but I felt like we weren't communicating. I allow that to happen 2-3 times before I bail and use email or the blog.&lt;br /&gt;&lt;br /&gt;(Random tangent: It is mystifying why others try to &lt;span style="font-weight: bold;"&gt;debate&lt;/span&gt; religion or politics in 140 chars. It comes across as an intellectual boxing fight, except with &lt;a href="http://en.wikipedia.org/wiki/NERF"&gt;Nerf&lt;/a&gt; gloves. Or an obscure debate between two Zen masters).&lt;br /&gt;&lt;br /&gt;I first heard of the podcast during a talk by&lt;a href="http://kensipe.blogspot.com/"&gt; Ken Sipe&lt;/a&gt; (on F#). I loaded up on episodes for F#, C#, and some other Microsoft technologies. I'm not proud of this, but I'm not familiar with the dotNet space; I haven't used Visual Studio in years.&lt;br /&gt;&lt;br /&gt;I loved the podcasts because they were geeky, but also because the topics are a new world to me. I felt like a spy listening in on a secure line. This is not a criticism: the 'casts are a great way to catch up on what is happening over there.&lt;br /&gt;&lt;br /&gt;I have since learned that the podcast isn't solely Microsoft: e.g. they have a great episode on architecture with a guy from Digg, one with the Rails Rumble champs, and so on. Also, the April 1 podcast is simply &lt;span style="font-style: italic;"&gt;brilliant&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So, I invite you to join me and sit on the porch with these guys and have some iced tea. They have asked me about some topics of interest but I refuse to offer any: I &lt;span style="font-style: italic;"&gt;want&lt;/span&gt; them to surprise me and stretch my boundaries.&lt;br /&gt;&lt;br /&gt;Keep up the good work, mates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1665576495066670592?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1665576495066670592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1665576495066670592' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1665576495066670592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1665576495066670592'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/i-love-deep-fried-bytes-man.html' title='I love the Deep Fried Bytes, man!'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5653332829593260070</id><published>2009-04-13T18:13:00.000-07:00</published><updated>2011-06-19T12:12:50.613-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='off my chest'/><title type='text'>Dear Speaker: 10 Thoughts Beyond 'Make Eye-Contact'</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lfuDZjhLbAM/SePp4G6cMwI/AAAAAAAAAU0/1obzbdv0_zA/s1600-h/iStock_000000428225Small.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_lfuDZjhLbAM/SePp4G6cMwI/AAAAAAAAAU0/1obzbdv0_zA/s320/iStock_000000428225Small.jpg" alt="" id="BLOGGER_PHOTO_ID_5324356334619734786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Motivation&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Recently, I read a post by James Duncan Davidson called &lt;a href="http://duncandavidson.com/2009/03/dear-speakers.html"&gt;Dear Speakers&lt;/a&gt;. He tweeted criticisms about speakers (no names used) and later blogged his thoughts. The tweets were not mean-spirited but also not inside jokes among friends.&lt;br /&gt;&lt;br /&gt;I believe that James is offering earnest advice, but the post really irritates me. Here's why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Critiquing a speaker during a presentation, even without using names, is both gutless and rude. I wonder if James offered any advice, in person, to the speakers afterwards. New technology doesn't excuse us from acting like civilized adults. True, I'm the guy that &lt;a href="http://codetojoy.blogspot.com/2007/08/closures-are-hot.html"&gt;does this&lt;/a&gt; (yes, juvenile). But I asked first and looked people straight in the eye.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;James provides some random, tactical details as advice. They are fine tips but they strike me as being mere trees in the forest. I have wanted to write about the forest for some time now, so here I am.&lt;/li&gt;&lt;li&gt;However, the post really irks me &lt;span style="font-style: italic;"&gt;because I attended &lt;/span&gt;&lt;span&gt;a technical talk&lt;/span&gt; by JDD on the No Fluff Just Stuff tour, circa 2002. I won't comment on it here, but: if we had the technology back then, how would JDD feel if I tweeted, even without mentioning his name?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;What are my qualifications to talk on this?&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Frankly, I'm no more qualified to talk about this than anyone else.&lt;br /&gt;&lt;br /&gt;FWIW, I have emceed a couple of weddings, and have given some technical talks, all with widely mixed results. In my team's war room, I'm not at all shy about launching into an impromptu lecture on whatever I find interesting. I have taken the venerable Dale Carnegie course on public speaking (highly recommended). All of this may or may not impress you.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;[&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;Editor's note&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;: I have since spoken at the &lt;/span&gt;&lt;a style="color: rgb(0, 0, 153);" href="http://www.nofluffjuststuff.com/conference/st_louis/2010/05/home"&gt;Gateway Software Symposium 2010&lt;/a&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; and the &lt;/span&gt;&lt;a style="color: rgb(0, 0, 153);" href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;. This still may or may not impress you.]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I fully concede I have broken many of the following rules. Sometimes, it has haunted me for weeks afterwards.&lt;br /&gt;&lt;br /&gt;So I'm a modest presenter. However, I have seen &lt;span style="font-style: italic;"&gt;dozens&lt;/span&gt; of talks: tech talks, conference sessions, keynote addresses, etc. I've attended my local JUG and NFJS for years, and am lucky to see terrific speakers on a regular basis via &lt;a href="http://ociweb.com/"&gt;my employer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is very hard to describe what works, but I know when I see it. The best analogy is music: I can't tell you why I admire certain guitar players.  There is no formula, and it is highly subjective, yet there seem to be common elements across my favourites.&lt;br /&gt;&lt;br /&gt;Writing about this is like describing a dream: it's impossible to articulate the elements of my favourite guitar players, or my favourite speakers. But spurred to action by James' post, here are 10 things to consider.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Take a class&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before you can give a tech presentation, you should be able &lt;span style="font-style: italic;"&gt;to give a presentation&lt;/span&gt;.  JDD's post, and the comments, concentrate on things like pacing, pause words ("um", "so"), eye contact, etc. A lot of advice is written as "just keep these 1000 things in mind the next time you are feeling the adrenalin rush of the flight-or-fight syndrome while in front of a crowd".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gee, thanks.&lt;/span&gt; Here's some real advice: if you want to learn to be a better speaker, with a chance to receive &lt;span style="font-style: italic;"&gt;genuinely constructive&lt;/span&gt; criticism, take a class. There are classes at your local college. There are higher end classes like Dale Carnegie and Toastmasters. Or take &lt;a href="http://codetojoy.blogspot.com/2007/08/essence-of-improv.html"&gt;an improv class&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It doesn't matter: just pick one and get out there.&lt;br /&gt;&lt;br /&gt;(I have no affliation with Dale Carnegie, but a quick plug. When I was 13, I was so shy that I had to steel my resolve to call a store and ask about their hours of operation. I took Dale C at age 22 and have never looked back.&lt;span style="font-style: italic;"&gt; No one&lt;/span&gt; describes me as shy now.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Know your audience&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I learned this one the hard way. Above, I mentioned several types of talks: tech talks, keynotes, etc. Be sure to think about your gig, and match your preparation to it.&lt;br /&gt;&lt;br /&gt;For example, at a brown bag tech lunch, you have about 3 minutes to show some code. These people are voyeurs, and &lt;span style="font-style: italic;"&gt;code is their porn&lt;/span&gt;. If you show up with 10 slides about cargo cults and the history of computing, they aren't going to be happy.  Similarly, if you are up for a keynote, and don't have some kind of polish, things are going to be rough as well.&lt;br /&gt;&lt;br /&gt;Also, you need to understand the technical level of your audience. This should be fairly obvious, as I'm sure you suffered through mismatches as an attendee.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Know your audience, seriously&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm repeating this one because of the hidden audiences.&lt;br /&gt;&lt;br /&gt;At NFJS, Scott Davis recently joked about those long, gorgeous Flash intros on artsy/marketing websites. He said, "who are those for? Everyone clicks Skip Intro".&lt;br /&gt;&lt;br /&gt;My first thought was: they are for other people &lt;span style="font-style: italic;"&gt;who write Flash intros&lt;/span&gt;. It is an arms race among a small elite to impress each other. This is an example of a hidden audience.&lt;br /&gt;&lt;br /&gt;As an example, a fancy Keynote presentation can be very slick and alluring, but if you have 3D dancing slide transitions that emit pyro-lasers onto the ceiling, are you trying to impress the audience, or are you trying &lt;span style="font-style: italic;"&gt;to impress other speakers?&lt;/span&gt; or other Keynote users? &lt;span style="font-style: italic; font-weight: bold;"&gt;or your own ego? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That is to say, who is your real audience?&lt;br /&gt;&lt;br /&gt;Always, always, always keep the real audience as priority #1. Be slick, be funny, be wacky, but only insofar as it advances your message.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Steal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you don't play guitar, you might think that each solo, each lick, is its own creative snowflake, a sonic fingerprint that is unique in the universe.&lt;br /&gt;&lt;br /&gt;This is just one of many lies you've been led to believe.&lt;br /&gt;&lt;br /&gt;Guitarists copy, steal, and nick from each other all the time, and always have. The reason you may not be able to tell is that the good ones are clever about it: they take the essence of an idea, and make it their own.&lt;br /&gt;&lt;br /&gt;With respect to speaking, I'm &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; talking about stealing &lt;span style="font-style: italic;"&gt;content&lt;/span&gt;. I'm talking about &lt;span style="font-style: italic;"&gt;style&lt;/span&gt;. Once you've identified your style (see below) think about who you like as a speaker, and why. Then, pattern your talk using similar elements.&lt;br /&gt;&lt;br /&gt;A great example for keynote addresses is referencing a topic far removed from the ostensible subject, and then tying it in. A fantastic example is Dave Thomas' talks and writings on cargo cults.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Be true to yourself&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This item is in a delicious tension with the previous one.&lt;br /&gt;&lt;br /&gt;Some speakers are animated and theatric. Some are dry and yet genuinely funny. Some are no-nonsense and try to maximize the amount of content provided to you. This is all fine and well.&lt;br /&gt;&lt;br /&gt;No one should label or box themselves in, but it is wise to think about the speaker you want to be. If you have a naturally dry sense of humor, then it may be futile to try and speak as a different character. Public speaking is inherently outside our comfort zone, so there is no need to double that by pretending to be someone you're not.&lt;br /&gt;&lt;br /&gt;That said, it can be electrifying to go on stage. Many entertainers have alter egos that appear out of nowhere when the lights go up. If that happens, great, but it isn't necessary.&lt;br /&gt;&lt;br /&gt;The upshot: take risks but follow your intuition.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Have a message&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; Everyone knows the old saw, "tell 'em what you're gonna tell 'em, then tell 'em, then tell 'em what you told 'em".  That's good stuff.&lt;br /&gt;&lt;br /&gt;The key point: have something to tell them.&lt;br /&gt;&lt;br /&gt;I'm old-fashioned but I was taught that an essay should have a thesis statement. A movie should have a story. A novel should have a narrative, and so on.&lt;br /&gt;&lt;br /&gt;In the same way, I think that a talk should have an essential message that can be condensed into a short outline or a simple phrase. If someone asks "what was your talk about?", you should be able to answer, coherently, in 30 seconds.&lt;br /&gt;&lt;br /&gt;This may seem obvious for an expansive keynote address, but I think it applies even to the humble brown-bag tech lunch. My goal for such a lunch is to present a topic to the audience so that they can decide if they want to pursue it further. Consequently, the message is invariably along the lines of "This tool offers A, B, and C, but suffers from X. If you value X, then you may want to wait but if, like me, you value A above the others, then check this out".&lt;br /&gt;&lt;br /&gt;The good news is that thinking about this up front will focus your preparation. As well, a creative challenge is to express your message without actually saying it, but this can be tricky (see the last item).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Prepare&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This one is cheap and easy, but I am compelled to write it.&lt;br /&gt;&lt;br /&gt;Prepare your talk. Practice, rehearse, check your time. Remember that time can &lt;span style="font-style: italic;"&gt;evaporate&lt;/span&gt; on stage, especially if there are questions.&lt;br /&gt;&lt;br /&gt;More than this, though, take every opportunity to prepare the equipment. If possible, go to the venue days beforehand. On the day of the talk, get there very early, and remember &lt;span style="font-style: italic;"&gt;to test your equipment&lt;/span&gt;! Just showing up isn't enough!&lt;br /&gt;&lt;br /&gt;I once had a golden opportunity to rehearse with some equipment, on the day before an event, and passed up the chance. It was a major error. The mic was hard to use and I didn't find out until "go time", despite having ample opportunity to prepare. Shameful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Respect questioners, but keep it moving&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Assume that a questioner is at the right technical level and earnestly trying to advance the cause of the talk on behalf of you and the audience.&lt;br /&gt;&lt;br /&gt;If they are, no problem: be polite and answer the question.&lt;br /&gt;&lt;br /&gt;However, it might not be true, or may become apparent after a couple of questions. E.g.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The person might not be at the right level technical level for the group (e.g. if someone asks 'does CSS support aspect-oriented monads?' or 'what is a database?').&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The person might have their own hidden audience and start to grand-stand to impress others or themselves. &lt;/li&gt;&lt;li&gt;Everyone is a comic. Often, this sets a warm atmosphere, but one can go out of control after scoring some laughs.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;(The unvarnished truth is that I'm guilty of all of these, as an audience member. Hopefully not too often!)&lt;br /&gt;&lt;br /&gt;I defer to your intuition on how to be graceful, but it is important in these instances to acknowledge the person, be respectful, and then move on. The goal is to &lt;span style="font-style: italic;"&gt;convey your message to the group&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Squash the impasse with the venerable "let's go offline". If you really follow-up later in an earnest manner, it is better for everyone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9. Learn from criticism&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm paraphrasing the master, Dale Carnegie, on this one, as he said it best.&lt;br /&gt;&lt;br /&gt;There are two ways to handle criticism: if it's accurate, learn and adapt from it; if it isn't accurate, be a duck and let that water just roll off your back.&lt;br /&gt;&lt;br /&gt;The trick is to identify accuracy. This is difficult but clearly it requires objective reflection. And a keen sense for the difference between fact and opinion.&lt;br /&gt;&lt;br /&gt;I think there is an asymptotic effect here: if you give a sufficient number of talks (see item #1!), and adapt, earnestly and honestly, to enough criticism, the curve will invariably tend towards you being an excellent speaker.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10. Break the damn rules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just like in music, the most creative and wonderful things come when we break the rules. (Note that here I mean tactical rules like "use slides", and not themes, e.g. "respect your audience".)&lt;br /&gt;&lt;br /&gt;However, it isn't just a matter of ignoring the rules like a bull in a china shop. To truly break the rules, one should first understand them.&lt;br /&gt;&lt;br /&gt;In this way, one becomes a master. Note that the road is not easy: for every brilliant, rule-breaking, game-changing creation, there are countless disasters laying in the ditch. Talk is cheap: you must be prepared for failure if you try something crazy.&lt;br /&gt;&lt;br /&gt;Again, it comes back to intuition: if you feel you're ready and can accept the consequences, go for it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rule-breaker? A Masterful (and high risk) Example&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I'm bummed that someone, in the comments on JDD's post, already pointed out the video below. A friend and I saw Clifford Stoll at SD West circa 2000. It was the single best talk I have ever seen, and represents my own Platonic ideal as a speaker. I've searched for it but no luck. (I tried to capture its spirit in &lt;a href="http://codetojoy.blogspot.com/2007/06/beethoven-didnt-use-powerpoint.html"&gt;Beethoven didn't use Powerpoint&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Talking about it is like trying to describe a dream. Or for someone to describe seeing &lt;a href="http://en.wikipedia.org/wiki/Stevie_Ray_Vaughan"&gt;Stevie Ray Vaughn&lt;/a&gt; play live.&lt;br /&gt;&lt;br /&gt;The version below is similar in nature. It doesn't (can't!) compare to the dream I saw, but it is great stuff.&lt;br /&gt;&lt;br /&gt;I include it also for the duality: on one hand, this breaks all of the little tactical rules ('make eye-contact'); on the other hand, it preserves -- even &lt;span style="font-style: italic;"&gt;illustrates&lt;/span&gt; -- the core principles behind a great presentation.&lt;br /&gt;&lt;br /&gt;Though again, you better be &lt;span style="font-weight: bold;"&gt;careful&lt;/span&gt; about running around your conference room like a mad scientist, I conclude with these questions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Did he think about his thesis?&lt;/li&gt;&lt;li&gt;Did he know his audience? (&lt;span style="font-style: italic;"&gt;a slide-rule!?&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Do you think he was earnest in conveying his message?&lt;/li&gt;&lt;/ul&gt;(&lt;span style="font-style: italic;"&gt;Hint&lt;/span&gt;: yes).&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Gj8IA6xOpSk&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Gj8IA6xOpSk&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5653332829593260070?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5653332829593260070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5653332829593260070' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5653332829593260070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5653332829593260070'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/dear-speaker-10-thoughts-beyond-make.html' title='Dear Speaker: 10 Thoughts Beyond &apos;Make Eye-Contact&apos;'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_lfuDZjhLbAM/SePp4G6cMwI/AAAAAAAAAU0/1obzbdv0_zA/s72-c/iStock_000000428225Small.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6294654654110056943</id><published>2009-04-01T07:45:00.000-07:00</published><updated>2009-04-01T12:37:18.188-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='generics'/><category scheme='http://www.blogger.com/atom/ns#' term='openjdk'/><title type='text'>Cult attacks OpenJDK, demands deified generics in Java</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lfuDZjhLbAM/SdNXe1NzZ4I/AAAAAAAAAUk/yvW4AKpwtjs/s1600-h/iStock_000002252405Small.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 244px;" src="http://4.bp.blogspot.com/_lfuDZjhLbAM/SdNXe1NzZ4I/AAAAAAAAAUk/yvW4AKpwtjs/s320/iStock_000002252405Small.jpg" alt="" id="BLOGGER_PHOTO_ID_5319691772047353730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CodeToJoy Newswire&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Parody City, CA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;April 1, 2009 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The OpenJDK team announced today that its source-control system received a "prolonged, sustained attack". The attack came from a small sect of developers who are strangely zealous about strong, runtime typing. The group's attempted upload to the site repeatedly stated "Give us deified generics in Java!".&lt;br /&gt;&lt;br /&gt;One insider reported: "Apparently these people are not capable of submitting a reasonable proposal, nor are they satisified with mere reified generics. They are continually attempting to inject a syntax such as:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;class MyCollection&amp;lt;we_kneel_before_thee T&amp;gt; extends Collection&amp;lt;T&amp;gt;;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;which we think is both unpleasant and inappropriate."&lt;br /&gt;&lt;br /&gt;There is no word on the affiliation behind the deification of generics, but sources say they suspect the misfits have ties to the ML-family of languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6294654654110056943?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6294654654110056943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6294654654110056943' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6294654654110056943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6294654654110056943'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/cult-attacks-openjdk-demands-deified.html' title='Cult attacks OpenJDK, demands deified generics in Java'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lfuDZjhLbAM/SdNXe1NzZ4I/AAAAAAAAAUk/yvW4AKpwtjs/s72-c/iStock_000002252405Small.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8380031306999304448</id><published>2009-04-01T06:15:00.000-07:00</published><updated>2009-04-01T07:57:03.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='conficker'/><title type='text'>Conficker inspires F# team to release immutable browser</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lfuDZjhLbAM/SdNSOfVJGEI/AAAAAAAAAUc/xd4_l8QJpY0/s1600-h/iStock_000001282558Small.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_lfuDZjhLbAM/SdNSOfVJGEI/AAAAAAAAAUc/xd4_l8QJpY0/s320/iStock_000001282558Small.jpg" alt="" id="BLOGGER_PHOTO_ID_5319685993736509506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CodeToJoy Newswire&lt;br /&gt;Parody City, CA&lt;br /&gt;April 1, 2009&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hot on the heels of the worldwide Conficker scare, insiders reveal that Microsoft has asked its nascent F# team to improve web security by writing an immutable browser.&lt;br /&gt;&lt;br /&gt;Code-named Atom, the browser will allow users to manually type in a URL, and to scroll the results, but there is &lt;span style="font-style: italic;"&gt;no&lt;/span&gt; mouse support within the HTML.&lt;br /&gt;&lt;br /&gt;Said someone close to the team: "The aim is to bring pure functional programming to the web. Atom will have no support for Ajax or any other Javascript. In fact, the users are not allowed to click on the page, or to have plugins of any kind. This will thwart the hacking community and save untold numbers of person-years."&lt;br /&gt;&lt;br /&gt;When pressed on the utility and security of having to manually enter URLs, the source replied, "It is definitely less convenient, but since we cannot secure the OS level, this really the next best route. Plus, we are excited to bring the principles of functional programming to the desktop".&lt;br /&gt;&lt;br /&gt;In early market trading, shares of URL-shortening sites &lt;a href="http://tinyurl.com/"&gt;tinyurl.com&lt;/a&gt; and &lt;a href="http://is.gd/"&gt;is.gd&lt;/a&gt; went up 4109%.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8380031306999304448?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8380031306999304448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8380031306999304448' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8380031306999304448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8380031306999304448'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/04/conficker-inspires-f-team-to-release.html' title='Conficker inspires F# team to release immutable browser'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lfuDZjhLbAM/SdNSOfVJGEI/AAAAAAAAAUc/xd4_l8QJpY0/s72-c/iStock_000001282558Small.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5624190111439528327</id><published>2009-03-30T06:00:00.000-07:00</published><updated>2009-03-30T06:00:00.249-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monads are burritos'/><title type='text'>Monads are Burritos</title><content type='html'>Earlier in the month, I gave at talk at the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt;. The title was Monads are Burritos.&lt;br /&gt;&lt;br /&gt;The slides &lt;a href="http://stllambdalounge.files.wordpress.com/2009/03/post_monads_lambdalounge_talk.pdf"&gt;are here&lt;/a&gt;. Some example code in Haskell &lt;a href="http://puredanger.com/lambdalounge/200903/MonadExamples.jar"&gt;is here&lt;/a&gt;. (I have provided examples both with and without the do-syntax: the latter is much cleaner and easier to use, but only once you understand the former. Be warned: the examples are rough, if you don't know Haskell).&lt;br /&gt;&lt;br /&gt;The following are among my goals when it comes to talks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I usually have a small set of ideas that I want to state, much like a thesis statement in an essay.&lt;/li&gt;&lt;li&gt;I strive to make the experience of attending a talk vastly different from the raw material on the slides. A goal is to reward those who come to my party. Imagine a 1920s ballroom on a Sunday morning. The slides should be like empty beer bottles, overturned tables, and bras hanging from the ceiling fan: &lt;span style="font-style: italic;"&gt;mere artifacts&lt;/span&gt; indicating that something larger has taken place.&lt;/li&gt;&lt;/ul&gt;I may or may not have achieved these goals, but the result is the same: the slides will seem odd. So, here is an overview of my thesis points.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Monads are not Burritos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Brent Yorgey has &lt;a href="http://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/"&gt;a wonderful post&lt;/a&gt; on the tarpit of writing monad tutorials. Generally, someone goes off into the mountains for a few weeks, works hard, and has some kind of epiphany: say, for example, that monads are like burritos. Afterwards, they rave like a lunatic to puzzled listeners/readers.&lt;br /&gt;&lt;br /&gt;To me, monads have nothing to do with burritos, but I liked the post so much that I named my talk after it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Find your own Burrito&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some have challenged the FP world to explain monads in 2 sentences. I can't do that, but in 1993 I couldn't have done it for objects. In my freshman year, I couldn't have done it for recursion.&lt;br /&gt;&lt;br /&gt;In other words, &lt;span style="font-style: italic;"&gt;even if I did&lt;/span&gt; think that monads are burritos, it doesn't matter. You have to do the work and find out your own revelation. That is to say, you have to find &lt;span style="font-style: italic;"&gt;your own burrito&lt;/span&gt;. Just as we did for polymorphism, encapsulation, inheritence, and so on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dude...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The comic &lt;a href="http://www.demetrimartin.com/"&gt;Demitri Martin&lt;/a&gt; has a puzzle wherein he wonders what the smartest thing anyone has said that starts with "Dude...".  My favourite of his: "Dude, these are isotopes". (FWIW, he means "dude" here in a gender-neutral, skater-scene tone.)&lt;br /&gt;&lt;br /&gt;I have two offerings (one of which was given at the talk):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dude, a monad &lt;span style="font-style: italic;"&gt;is a burrito&lt;/span&gt;, if a burrito is a functor-like object with a generic type, a sense of encapsulation, and the ability to combine small computations into larger ones!&lt;/li&gt;&lt;li&gt;Dude, a monad is a programmable semi-colon!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Examples?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;This post won't give examples, or even really try to explain the zen of monads. This is really intended as an explanation for the beer bottles and overturned tables. (Here are &lt;a href="http://twitpic.com/1xavz"&gt;some more&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I may post some code later on, as a supplement to those who were there for the talk.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5624190111439528327?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5624190111439528327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5624190111439528327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5624190111439528327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5624190111439528327'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/monads-are-burritos.html' title='Monads are Burritos'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6669053138988956233</id><published>2009-03-26T19:20:00.000-07:00</published><updated>2009-03-26T19:56:13.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='refactoring agile'/><title type='text'>Applying Project Coin to Agile Development</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Project Coin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As noted in Alex Miller's various &lt;a href="http://tech.puredanger.com/2009/03/08/project-coin-proposals/"&gt;Java7 posts&lt;/a&gt;, &lt;a href="http://openjdk.java.net/projects/coin/"&gt;Project Coin&lt;/a&gt; is a set of small language changes proposed for Java7. As noted on a recent &lt;a href="http://javaposse.com/index.php?post_id=442910"&gt;Java Posse podcast&lt;/a&gt;,  these changes should be on the same order of magnitude as the new for-loop in Java 5. That is to say, the change should be small: a coin, as it were.&lt;br /&gt;&lt;br /&gt;All well and good, but this post is not about Java. This post is about the reaction to the project. Though I prefer Project Coin it could also be called &lt;span style="font-style: italic;"&gt;Project Breathmint&lt;/span&gt;, because it is refreshing (even &lt;span style="font-style: italic;"&gt;fun&lt;/span&gt;) to talk about small features that do not ignite the flames of debate as much as say... *pause for effect* closures. These are lightweight changes that can really make a pleasant difference.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Idea&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My proposal is to consider your own Project Coin for &lt;span style="font-style: italic;"&gt;your project&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are many casualties in the lack of communication between developers and the stakeholders of a project, even on agile teams. One such casualty is this: customers, domain experts, and especially support staff often &lt;span style="font-style: italic;"&gt;despise&lt;/span&gt; a given defect or quirk that is quite easy to fix.  A recent case for me is a recurring exception trace in a log file (it occurs often because of a poor API design: the exception is thrown in a reasonable, normal situation). The support staff have learned to pattern-match it, but it gives them fits.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Execution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We should not lose focus of the main money-maker: delivering maximum bang-for-the-buck features to customers, where said features are prioritized by stakeholders. However, it seems reasonable for a team to draft a Project Coin once per quarter. The first benefit will be reaped immediately: communication. Even if an item proves to be too large to be a coin, the dialogue among the team will be worth it.&lt;br /&gt;&lt;br /&gt;Once the list is compiled, the team could shoot for one coin per iteration (e.g. every 2 weeks).  Naturally, if an item doesn't make it, that is acceptable: these are literally bonus points.&lt;br /&gt;&lt;br /&gt;The Project Coin items are perfect for newcomers to the project, for junior developers,  or for Friday afternoons when we need a break. A danger is that someone will go hog-wild with a complete framework to fix a small problem, but daily stand-ups and code reviews should keep that in check. (Your team &lt;span style="font-style: italic;"&gt;does&lt;/span&gt; have dailies and code reviews, right?)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I can't say that I've put this into practice. However, my team has talked about this idea in nebulous terms. Now that we have the coin metaphor from Java, perhaps it can become a reality for many agile teams.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6669053138988956233?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6669053138988956233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6669053138988956233' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6669053138988956233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6669053138988956233'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/applying-project-coin-to-agile.html' title='Applying Project Coin to Agile Development'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2269584513846370192</id><published>2009-03-24T18:18:00.001-07:00</published><updated>2009-03-24T21:46:59.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thanks Grace'/><title type='text'>Ada Lovelace Day: Grace Hopper</title><content type='html'>&lt;span style="font-weight: bold;font-size:100%;" &gt;Full Disclosure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;New readers may want to know that this blog is &lt;a href="http://lafalafu.com/krc/privilege.html"&gt;on this list&lt;/a&gt; for posting &lt;a href="http://codetojoy.blogspot.com/2007/08/closures-are-hot.html"&gt;photos of women&lt;/a&gt; holding geeky stickers. For what it's worth, this blog also features &lt;a href="http://codetojoy.blogspot.com/2007/08/its-raining-closures.html"&gt;photos of men&lt;/a&gt; holding geeky stickers. Are any of them geeks? I have no idea: I didn't have time to find out. A geek is not defined by gender or looks; a geek is defined by characteristics such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Wondering, incredulously: "&lt;a href="http://www.wisdomandwonder.com/link/2110/why-mit-switched-from-scheme-to-python"&gt;Did MIT &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; ditch Scheme in 6.001&lt;/a&gt;?"&lt;/li&gt;&lt;li&gt;Being able to answer "is 47 a prime number?" in a blink of an eye&lt;/li&gt;&lt;li&gt;Enjoying weird puzzles like "what does a nanosecond look like?"&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Ada Lovelace Day&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think &lt;a href="http://findingada.com/"&gt;Ada Lovelace Day&lt;/a&gt; is a good idea. Ironically, despite being on a &lt;a href="http://lafalafu.com/krc/privilege.html"&gt;male privilege&lt;/a&gt; list, I (sadly) recognize many of the issues listed. Moreover, I have two young, wonderful cousins (girls), and I would like to help to ensure that computer science and mathematics is welcoming to them. If posts like this help the cause, then why not...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;The Star&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This post is about a wonderful pioneer of computer science. She was brilliant, witty, and an influence on me as a undergraduate student, via print and film.&lt;br /&gt;&lt;br /&gt;She also happened to be a woman. Though Ada L Day is a motivating factor, I have long wanted to write an appreciation, because of her abilities, contributions, and style.&lt;br /&gt;&lt;br /&gt;She is &lt;a href="http://en.wikipedia.org/wiki/Grace_Hopper"&gt;Grace Hopper&lt;/a&gt;, one of the first rock star programmers. I post this for a younger generation, lest we forget.&lt;br /&gt;&lt;br /&gt;I've decided not to write a biography: peruse the achievements on &lt;a href="http://en.wikipedia.org/wiki/Grace_Hopper"&gt;Wikipedia&lt;/a&gt;. They are stunning. She easily had more on her resume by 1941 than your most of your CS profs, here in 2009. Suffice it to say that she would go on to work on the &lt;a href="http://www.youtube.com/watch?v=NUnEoouyvGY&amp;amp;NR=1"&gt;Harvard Mark I&lt;/a&gt; and the UNIVAC. She also helped design COBOL (laugh if you must, but see below).&lt;br /&gt;&lt;br /&gt;When I think of her, I think of these influences:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;She famously demanded to &lt;span style="font-style: italic;"&gt;see&lt;/span&gt; a nanosecond: she would hand out wires that were the length traveled by light in 1 nanosecond. To this day, I try to use props whenever possible in discussions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I once read the transcripts from a language symposium in the 1970s. Grace said something along these lines "... if you remember one thing from this, remember that COBOL was a temporary proposal. We did not intend for that version to be the final draft."  This is fascinating but also a great presentation technique. Again to this day, I use that phrase for effect "if you remember just one thing....".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;She didn't take any crap from anyone. See her interview with David Letterman below. Though it is dumbed-down for pop culture, notice her matter-of-fact style. There is no need to showboat for TV: these are the facts, and it is all perfectly logical. I love it.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Setting an Example&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Grace Hopper was fantastic, plain and simple.  To me, her example for my young cousins -- and everyone else -- is this: if you are a geek, be the best you can be. Embrace it, live it, love it. Be so good that you transcend labels, because no one can stop a geek who &lt;span style="font-style: italic;"&gt;simply kicks ass&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/57bfxsiVTd4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/57bfxsiVTd4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2269584513846370192?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2269584513846370192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2269584513846370192' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2269584513846370192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2269584513846370192'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/ada-lovelace-day-grace-hopper.html' title='Ada Lovelace Day: Grace Hopper'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5898501592760122786</id><published>2009-03-14T12:40:00.000-07:00</published><updated>2009-03-14T20:33:47.909-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='the skinny'/><title type='text'>No Fluff Just Stuff St Louis: A Review</title><content type='html'>&lt;span style="font-style: italic;"&gt;Ed's note: I work for a sponsor of the StL NFJS and many of the local speakers are friends. That said, I have attended the Gateway NFJS for 8 years, most of which were through a previous employer. If you know me in person, you know I enjoy these shows tremendously.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Gist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last weekend, I attended the 2009 St Louis &lt;a href="http://www.nofluffjuststuff.com/home.jsp"&gt;NFJS show&lt;/a&gt;. As long-time readers will know, I really enjoy both the content of these shows as well as the energy from talking to other attendees.&lt;br /&gt;&lt;br /&gt;In this recap, I will try to highlight my experience with the assumption that you are familiar with the format and the NFJS tour. If not, there are many resources on the web describing the basic idea of a "conference near you".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Sessions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here are some highlights from the sessions I attended. Note that later posts will have thoughts/questions that arose from these talks.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sporting a Hawaiian shirt "made from an amalgam of sofas", &lt;a href="http://tech.puredanger.com/"&gt;Alex Miller&lt;/a&gt; gave a talk on Java 7. With his &lt;a href="http://java7.tumblr.com/"&gt;Java 7 website&lt;/a&gt;, it is hard to imagine someone with a more complete view of the big picture. One slide included all potential features, and the &lt;a href="http://tech.puredanger.com/java7"&gt;current status of each&lt;/a&gt;. I especially enjoyed the background behind Project Coin, JSR 310 (Date/Time), and the fork-join frameword (jsr166y).&lt;/li&gt;&lt;li&gt;Alex is hardcore into concurrency, and gave some talks in this space as well. This is essential stuff. It is not clear to me if Java will be the longterm answer for concurrent programming on the JVM, but right now it certainly is: if you do threading, you need to see Java Concurrency Gotchas.&lt;/li&gt;&lt;li&gt;&lt;a href="http://kensipe.blogspot.com/"&gt;Ken Sipe&lt;/a&gt; gave several talks on understanding garbage collection and tweaking the JVM. I saw the one on GC in the past, and it helped me solve a tricky memory leak at a client site. I went back for more this year. If you want to be a problem solver for your project in production, his material is top shelf. Who else points to a graph spike and says with a devilish grin: "we are now watching a star die" ?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I caught &lt;a href="http://davisworld.org/"&gt;Scott Davis&lt;/a&gt;' talk on Lizard Brain Web Design. This was one of the most fun, as Scott is a terrific speaker and the topic is about the nebulous nexus of practicality and aesthetics, outside of the machinations of the IDE. Anyone can simply read the pop psych books but I enjoy how Scott brings it together into a coherent, relevant narrative. This stuff just comes alive.&lt;/li&gt;&lt;li&gt;My colleagues &lt;a href="http://www.ociweb.com/mark/"&gt;Mark Volkmann&lt;/a&gt; and &lt;a href="http://compulsiontocode.blogspot.com/"&gt;Tim Dalton&lt;/a&gt; gave excellent talks on Clojure and Scala, respectively the cutting-edge of languages on the JVM. I've seen precursors to these talks before so the material was familiar: I really want to see 'part 2' where each talks about concurrency and/or software transactional memory.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Some other major themes included Groovy, JMS, and agile practices. Incredibly, I didn't attend &lt;span style="font-style: italic;"&gt;any&lt;/span&gt; Groovy sessions as I feel very comfortable with the language, and with Grails. I've seen the JMS talks before (recommended) and others were casualties of scheduling.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Vibe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My main sources for the "vibe" of the conference are the Birds of a Feather sessions, the polls during the expert panel, and just interacting with other attendees:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I attended the BoF on dynamic languages. The discussion was solely centered on funcational languages. Several people wondered about the allure, and if the masses could make the leap. Again, a theme was the potential sea-change with respect to concurrency. I told one chap that if we could learn object-orientation (recall how tricky polymorphism was in 1994?), then we can learn FP.&lt;/li&gt;&lt;li&gt;Jay Zimmerman took some interesting, informal polls. e.g. The majority of attendees wrote unit tests and used agile practices. Agile seemed non-controversial and an ideal, much different from an NFJS from, say, 2003.&lt;/li&gt;&lt;li&gt;A common theme among conversation was: which new language should I choose? &lt;a href="http://www.nofluffjuststuff.com/conference/speaker/venkat_subramaniam.html"&gt;Venkat Subramaniam&lt;/a&gt; said it best: it doesn't matter. Just pick one and go with it. It is more important to learn ideas (from any language) than mere syntax from any one in particular. He cited the conventional wisdom that it is important to know a language from each major school (e.g. functional, object-oriented, etc).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;The Keynote&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Venkat gave the keynote: Facts and Fallacies of Everyday Software.&lt;br /&gt;&lt;br /&gt;After discreetly &lt;a href="http://codetojoy.blogspot.com/2008/03/programming-in-sock-feet.html"&gt;kicking off his shoes&lt;/a&gt;, he launched into a comical tirade about the collisions between common sense and stupidity, using some clever photos to shine the spotlight of logic on absurdity (e.g. a "No Fishing" sign on a bridge that is 1000 feet above the ground). I've seen some dandy keynotes in the past (including &lt;a href="http://pragdave.pragprog.com/"&gt;the Chairman of the Board&lt;/a&gt;) but this was the closest to a good stand-up comedy routine.&lt;br /&gt;&lt;br /&gt;In between the laughs, the thesis emerged: think! Observe and challenge the requirements, the process, and the software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I like &lt;a href="http://codetojoy.blogspot.com/2009/03/faces-of-gateway-nfjs-2009.html"&gt;to clown around&lt;/a&gt; but I truly enjoy sharing experiences about software. This NFJS was energizing, as usual, because of the quality of the speakers and the participants. There were so many conversations and ideas that it is difficult to capture here.&lt;br /&gt;&lt;br /&gt;David Geary has a great line about GWT that applies to this past weekend: it makes writing sofware fun again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5898501592760122786?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5898501592760122786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5898501592760122786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5898501592760122786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5898501592760122786'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/no-fluff-just-stuff-st-louis-review.html' title='No Fluff Just Stuff St Louis: A Review'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4581242253372908628</id><published>2009-03-12T06:36:00.001-07:00</published><updated>2009-03-12T06:51:02.929-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Make Money with tonight's StL JUG</title><content type='html'>The mobile platform is the new gold rush: &lt;span style="font-style: italic;"&gt;there's gold in them thar hills&lt;/span&gt; (*).&lt;br /&gt;&lt;br /&gt;As you know, there are 2 potential goldmines: the iPhone and Android. I won't tell you which one to pick, but consider &lt;a href="http://twitpic.com/pdc5"&gt;this depiction&lt;/a&gt; of the battle.&lt;br /&gt;&lt;br /&gt;Tonight, at the &lt;a href="http://www.ociweb.com/javasig/"&gt;StL JUG&lt;/a&gt;, &lt;a href="http://stuffthathappens.com/blog/"&gt;Eric Burke&lt;/a&gt; will introduce us to one of the major players: Android. Come on out and see what is possible. You are only bound by your imagination.&lt;br /&gt;&lt;br /&gt;If you can't make it, check out &lt;a href="http://www.youtube.com/ocitv"&gt;the related videos on OCItv&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(*) For those who are not American, it is not clear if you can actually make money with the Android app store: international business is tricky. But surely (?) you can do some free stuff and get your name out there. Often, name recognition will open doors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4581242253372908628?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4581242253372908628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4581242253372908628' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4581242253372908628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4581242253372908628'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/make-money-with-tonights-stl-jug.html' title='Make Money with tonight&apos;s StL JUG'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6760956139348234914</id><published>2009-03-10T10:04:00.000-07:00</published><updated>2009-03-10T10:24:51.754-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='griffon'/><title type='text'>Get Gregarious: Grok Griffon at Gateway Groovy Group</title><content type='html'>First, you should meet the nascent &lt;a href="http://gatewaygroovy.org/"&gt;Gateway Groovy User Group&lt;/a&gt;: it has been started by &lt;a href="http://dave-klein.blogspot.com/"&gt;Dave Klein&lt;/a&gt;, a friend, upcoming &lt;a href="http://www.javaworld.com/community/node/2539"&gt;JavaOne speaker&lt;/a&gt;, and all-around class act.&lt;br /&gt;&lt;br /&gt;On Wednesday night, March 11, the GGUG will feature &lt;a href="http://weblog.dangertree.net/"&gt;Matt Taylor&lt;/a&gt;, speaking on &lt;a href="http://griffon.codehaus.org/"&gt;Griffon&lt;/a&gt;.  Matt is not only a friend but also an excellent speaker and is seriously involved in Groovy, working for G2One/SpringSource. As I understand it, Griffon is a Grails-like framework for desktop applications.&lt;br /&gt;&lt;br /&gt;Cool people, an interesting topic, and free: that's hard to beat. Come on out and socialize! I'll see you there.&lt;br /&gt;&lt;br /&gt;ps. For the artistic types, Griffon is having a &lt;a href="http://griffon.codehaus.org/Logo+Contest"&gt;logo contest&lt;/a&gt; until March 22. Imagine the fame if you won...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6760956139348234914?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6760956139348234914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6760956139348234914' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6760956139348234914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6760956139348234914'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/get-gregarious-grok-griffon-at-gateway.html' title='Get Gregarious: Grok Griffon at Gateway Groovy Group'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2172314602792769752</id><published>2009-03-09T04:35:00.000-07:00</published><updated>2009-03-09T06:58:17.159-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='no fluff just stuff'/><title type='text'>The Faces of Gateway NFJS 2009</title><content type='html'>&lt;p&gt;Here are some photos from the recent &lt;a href="http://www.nofluffjuststuff.com/home.jsp"&gt;No Fluff Just Stuff&lt;/a&gt; show in St Louis. Stay tuned for a review and some thoughts stemming from the conference. In a nutshell, it was an excellent show with an energetic crowd.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;These are my people: smart geeks who consider Java/JVM technologies as a way to spice up an otherwise dull and dreary weekend. No boredom here!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;NFJS attendees report the final score:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_lfuDZjhLbAM/SbUAfA5EY0I/AAAAAAAAATc/vPY-DVIGrfA/s1600-h/BoredomLoses2.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_lfuDZjhLbAM/SbUAfA5EY0I/AAAAAAAAATc/vPY-DVIGrfA/s320/BoredomLoses2.JPG" alt="" id="BLOGGER_PHOTO_ID_5311151868368675650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Speakers Scott Davis, Venkat Subramaniam, and Ken Sipe ham it up to form the MVC pattern:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_lfuDZjhLbAM/SbUBmZyuBUI/AAAAAAAAATk/lvEi5rtI_yk/s1600-h/MVC.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_lfuDZjhLbAM/SbUBmZyuBUI/AAAAAAAAATk/lvEi5rtI_yk/s320/MVC.JPG" alt="" id="BLOGGER_PHOTO_ID_5311153094823642434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;NFJS attendee (Jeff G), and speakers Mark Volkmann, Tim Dalton speak to the importance of functional programming and concurrency:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_lfuDZjhLbAM/SbUC5D2f3bI/AAAAAAAAAT0/zmJOiW_VWXM/s1600-h/FP.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_lfuDZjhLbAM/SbUC5D2f3bI/AAAAAAAAAT0/zmJOiW_VWXM/s320/FP.JPG" alt="" id="BLOGGER_PHOTO_ID_5311154514863054258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;NFJS attendees report the score from the lobby:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_lfuDZjhLbAM/SbUDc7EYFVI/AAAAAAAAAT8/UbKmCI5tJNw/s1600-h/BoredomLoses1.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_lfuDZjhLbAM/SbUDc7EYFVI/AAAAAAAAAT8/UbKmCI5tJNw/s320/BoredomLoses1.JPG" alt="" id="BLOGGER_PHOTO_ID_5311155130980635986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;NFJS attendee, speakers Alex Miller and Mark Volkmann define a monad (from functional programming):&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a  href="http://2.bp.blogspot.com/_lfuDZjhLbAM/SbUEKd1BN_I/AAAAAAAAAUE/QOPEXIKV7d0/s1600-h/MonadTwo.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_lfuDZjhLbAM/SbUEKd1BN_I/AAAAAAAAAUE/QOPEXIKV7d0/s320/MonadTwo.JPG" alt="" id="BLOGGER_PHOTO_ID_5311155913405577202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;NFJS attendee, and NFJS organizers form the MVC pattern:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a  href="http://1.bp.blogspot.com/_lfuDZjhLbAM/SbUEiMC91kI/AAAAAAAAAUM/YwYoQY2Gwos/s1600-h/NFJS_MVC_Lobby.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_lfuDZjhLbAM/SbUEiMC91kI/AAAAAAAAAUM/YwYoQY2Gwos/s320/NFJS_MVC_Lobby.JPG" alt="" id="BLOGGER_PHOTO_ID_5311156320949098050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;That's how we roll on a geeky, tech weekend....&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2172314602792769752?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2172314602792769752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2172314602792769752'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/faces-of-gateway-nfjs-2009.html' title='The Faces of Gateway NFJS 2009'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_lfuDZjhLbAM/SbUAfA5EY0I/AAAAAAAAATc/vPY-DVIGrfA/s72-c/BoredomLoses2.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4841218871010365008</id><published>2009-03-06T05:31:00.000-08:00</published><updated>2009-03-06T05:42:42.182-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='no fluff just stuff'/><title type='text'>Beyond TGIF: TGI NFJS</title><content type='html'>I've had a lot going on (including a fun night at the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt;), and have neglected to mention that No Fluff Just Stuff returns to St Louis this weekend.&lt;br /&gt;&lt;br /&gt;This will be my 8th one here in St Louis (i.e. all of them, I think).&lt;br /&gt;&lt;br /&gt;I'm pumped! Long-time readers will know that I'm a fan of NFJS, both in terms of the content and especially the energy from the crowd.&lt;br /&gt;&lt;br /&gt;I'm looking forward to many of the speakers, including my friends and the Gateway's own &lt;a href="http://tech.puredanger.com/"&gt;Alex Miller&lt;/a&gt;, &lt;a href="http://kensipe.blogspot.com/"&gt;Ken Sipe&lt;/a&gt;, and &lt;a href="http://www.ociweb.com/mark/"&gt;Mark Volkmann&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I don't have an iPhone or G1, so live pics and tweets will not happen.  However, I do hope to document some of the vibe, and I'll be loaded with various and sundry stickers.  Stay tuned or check out &lt;a href="http://twitter.com/codetojoy"&gt;my Twitter feed&lt;/a&gt; (@codetojoy)&lt;br /&gt;&lt;br /&gt;See you soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4841218871010365008?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4841218871010365008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4841218871010365008' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4841218871010365008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4841218871010365008'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/03/beyond-tgif-tgi-nfjs.html' title='Beyond TGIF: TGI NFJS'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8773673349518059833</id><published>2009-02-27T03:48:00.000-08:00</published><updated>2009-02-27T17:41:44.824-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strong typing strikes back'/><title type='text'>The Brilliance of Type Signatures in Haskell</title><content type='html'>I've been soaking up some Haskell lately, and have rediscovered the beauty of type signatures. As I vaguely remember from university, the ML-family of languages are truly profound in this regard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A type signature for a function in Haskell is somewhat like a method signature in Java (particularly with generics). However, they make stronger statements, due to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Haskell is a pure functional language: there are no side effects (for the sake of this post). The expression &lt;code&gt;(foo 5)&lt;/code&gt; is mathematical in nature.&lt;/li&gt;&lt;li&gt;Haskell does not support type coercion (see comments).&lt;/li&gt;&lt;li&gt;Haskell cannot introspect a given type.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Examples&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Like many languages, Haskell provides tuples: e.g. &lt;code&gt;(1,"hello")&lt;/code&gt; or &lt;code&gt;(3.14, True)&lt;/code&gt;.  Consider this type signature for the function &lt;code&gt;fst&lt;/code&gt;:&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;fst :: (a, b) -&gt; a&lt;br /&gt;&lt;/pre&gt;This reads in English "&lt;code&gt;fst&lt;/code&gt; accepts a 2-tuple of &lt;code&gt;types a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; and returns something of &lt;code&gt;type a&lt;/code&gt;".  It is vital to understand that &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; are types: e.g. &lt;code&gt;Int&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, etc.&lt;br /&gt;&lt;br /&gt;If you guessed that &lt;code&gt;fst&lt;/code&gt; returns the first element in the tuple: bingo.  This is intuitive and natural.&lt;br /&gt;&lt;br /&gt;However, there's more, as explained in &lt;a href="http://www.realworldhaskell.org/blog/"&gt;Real World Haskell&lt;/a&gt;. Because of the purity of Haskell and its strong type system, it is true that the &lt;span style="font-style: italic;"&gt;only possible behaviour&lt;/span&gt; for a non-pathological version of &lt;code&gt;fst&lt;/code&gt; is that it returns the first element.  In this example, &lt;span style="font-style: italic;"&gt;there is no other option&lt;/span&gt;.  That is mind-blowing; this kind of reasoning predicates some of the optimizations possible in Haskell.&lt;br /&gt;&lt;br /&gt;Consider this example, noting that &lt;code&gt;[a]&lt;/code&gt; is a &lt;code&gt;list&lt;/code&gt; of &lt;code&gt;a&lt;/code&gt; in Haskell:&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;concat :: [[a]] -&gt; [a]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What does it do? In Java, I might provide Javadoc (which could be false) but even a method signature doesn't tell the whole story: the method might quietly log to a file, write to a database, or launch missles. Here, we might intuit that &lt;code&gt;concat&lt;/code&gt; flattens a list (&lt;span style="font-style: italic;"&gt;Ed's note&lt;/span&gt;: or the first level -- see comments): &lt;code&gt;&lt;br /&gt;&lt;br /&gt;concat [ [1] , [2,3], [4] ] = [1,2,3,4]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Bingo.&lt;br /&gt;&lt;br /&gt;As one works more and more with Haskell, the type signatures become vital, and simply fascinating.&lt;br /&gt;&lt;br /&gt;A final, complex example. A Haskell monad has a combining function. For simplicity, I'll call it &lt;code&gt;myChain&lt;/code&gt;. It has a type signature of (where &lt;code&gt;m&lt;/code&gt; is a &lt;code&gt;Monad&lt;/code&gt;):&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;myChain :: m a -&gt; (a -&gt; m b) -&gt; m b&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For this post, m is a generic type. In Java, think of &lt;code&gt;WeakReference&amp;lt;T&amp;gt;&lt;/code&gt; or &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;In English, we say that &lt;code&gt;myChain&lt;/code&gt; accepts a &lt;code&gt;monad m&lt;/code&gt; of &lt;code&gt;type a&lt;/code&gt;, and a function that accepts &lt;code&gt;type a&lt;/code&gt; and returns a &lt;code&gt;monad&lt;/code&gt; of &lt;code&gt;type b&lt;/code&gt;. The result of &lt;code&gt;myChain&lt;/code&gt; is a &lt;code&gt;monad&lt;/code&gt; of &lt;code&gt;type b&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;If we stare at this long enough, we can guess the following about this function, without knowing anything about monads: it probably pulls out the item of &lt;code&gt;type a&lt;/code&gt; from the first parameter and applies the function provided as the second parameter.&lt;br /&gt;&lt;br /&gt;This is true. We've been able to intuit something about the mighty monad simply from the type signature.&lt;br /&gt;&lt;br /&gt;Brilliant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There has long been a tension between dynamically-typed languages and statically-typed languages.  In the last few years, the dynamic languages have become the media darlings. What's not to love? They are productive and mind-bending in their own way.&lt;br /&gt;&lt;br /&gt;However, don't sell the statically-typed languages short: &lt;span style="font-weight: bold;"&gt;especially, the functional languages with strong, static typing&lt;/span&gt;. This is deeply profound stuff. As I work more and more with type signatures in Haskell, I feel the psychic fingerprints of abstract algebra and other math theory: it is as though we &lt;span style="font-style: italic;"&gt;prove programs&lt;/span&gt; rather than write them.&lt;br /&gt;&lt;br /&gt;ps. &lt;code&gt;myChain&lt;/code&gt; is known as &lt;code&gt;&gt;&gt;=&lt;/code&gt; in Haskell, and is usually called &lt;code&gt;bind&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8773673349518059833?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8773673349518059833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8773673349518059833' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8773673349518059833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8773673349518059833'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/02/brilliance-of-type-signatures-in.html' title='The Brilliance of Type Signatures in Haskell'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-108888315213575971</id><published>2009-02-26T10:27:00.000-08:00</published><updated>2009-02-26T10:47:39.962-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='+1 for dry'/><title type='text'>Best Invite Acceptance of 2009</title><content type='html'>At my client site, I offered a dry-run of an upcoming talk on &lt;a href="http://en.wikipedia.org/wiki/Monad"&gt;Monads&lt;/a&gt; (stay tuned for &lt;a href="http://lambdalounge.org/schedule/"&gt;more info&lt;/a&gt;).  In my email to the team, I gave some fair warnings that the talk would be über-geeky.&lt;br /&gt;&lt;br /&gt;One wag responded:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153);font-family:arial;" &gt;Oooh... a brown bag on material that's inherently dry, well outside my comfort zone, and irrelevant to my future? &lt;span style="font-weight: bold;"&gt;I'M IN&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);font-family:arial;" &gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a wonderfully succinct definition of being a geek.  These are my people.&lt;br /&gt;&lt;br /&gt;ps. Before you begin to riot, Haskell/FP fans: neither my respondent nor I truly think monads are irrelevant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-108888315213575971?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/108888315213575971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=108888315213575971' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/108888315213575971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/108888315213575971'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/02/best-invite-acceptance-of-2009.html' title='Best Invite Acceptance of 2009'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-8165986830143449404</id><published>2009-02-15T15:40:00.000-08:00</published><updated>2009-02-15T16:13:34.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pinging my readers'/><title type='text'>A Keep-Alive Post</title><content type='html'>Though it has no formal name, every blogger eventually writes a post to reassure readers that yes, s/he is still alive and well. Call it a &lt;span style="font-style: italic;"&gt;keep-alive&lt;/span&gt; &lt;span style="font-style: italic;"&gt;post&lt;/span&gt; that pings on the socket between the writer and the audience.&lt;br /&gt;&lt;br /&gt;Such a time has come for this blog: the CtJ Nation has been clamouring for something -- anything -- to put some spice in their otherwise quiet browsing.&lt;br /&gt;&lt;br /&gt;Things have been busy at CtJ HQ. It is a busy time for some &lt;a href="http://www.fleetfeetstl.com/rt/STANDINGS/MULTI/multi.htm"&gt;personal pursuits&lt;/a&gt;, and also in preparing for a talk at the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt; in March. I also confess that I've been distracted by the &lt;a href="http://www.twitter.com/codetojoy"&gt;evil, seductive Twitter&lt;/a&gt;, much as I had feared.&lt;br /&gt;&lt;br /&gt;Here are some quick notes on ideas in store for CtJ.  Drop a line if any of these resonate with you:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;My upcoming talk is on monads, and so I've been cramming Haskell from &lt;a href="http://www.realworldhaskell.org/blog/"&gt;Real World Haskell&lt;/a&gt;.  This is a gorgeous language, and shares some psychic fingerprints with Unix, in that _everything_ is on its terms. Once you accept that, Haskell makes a very good case for the power of strong, static typing.&lt;/li&gt;&lt;li&gt;I have been working in a war room for a couple of years now. This is fertile ground for blogging, but I generally avoid any subject that might seem personal towards my colleagues. However, I think I have enough experience (direct, or overheard) that I can safely abstract themes and episodes in a way that is essentially fiction. I'm considering a series called Adventures in Agility.&lt;/li&gt;&lt;li&gt;Ted Neward has written about &lt;a href="http://blogs.tedneward.com/2008/12/12/Ruminations+On+Women+In+IT.aspx"&gt;women in IT&lt;/a&gt;. I've been thinking about something similar for a long time, since I am on this &lt;a href="http://lafalafu.com/krc/privilege.html"&gt;list about male privilege&lt;/a&gt;. It pains me deeply that I'm on there, as I agree that some of the items are issues. I'm a free spirit at the pub, but I'm genuinely mortified to offend anyone in the workplace, on any criteria. I've been trying to reconcile this with the famous sticker posts. I'm considering a piece on the criteria I use to rate someone as a geek (hint: it has nothing to do with gender, race, religion, etc).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;And that's the news from CtJ HQ. Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-8165986830143449404?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/8165986830143449404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=8165986830143449404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8165986830143449404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/8165986830143449404'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/02/keep-alive-post.html' title='A Keep-Alive Post'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6513481293903486644</id><published>2009-02-03T19:16:00.000-08:00</published><updated>2009-02-03T19:38:54.625-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='the local skinny'/><title type='text'>Thursday Night's Alright for Byting</title><content type='html'>If you're in St Louis, have had it with the discipline, and want to get a &lt;a href="http://www.youtube.com/watch?v=WaJU5AgqxAU"&gt;little action in&lt;/a&gt;, then check out these events:&lt;br /&gt;&lt;br /&gt;Thursday, Feb 5, there is only one game in town: the burgeoning &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt; will feature talks on Javascript (from an FP perspective) by Nate Young, and Actor concurrency in Erlang by &lt;a href="http://tech.puredanger.com/"&gt;Alex Miller&lt;/a&gt; (speaker at NFJS, Java One, and occasionally outside, at the corner of Terra and Cotta).&lt;br /&gt;&lt;br /&gt;Thursday, Feb 12, the venerable &lt;a href="http://www.ociweb.com/javasig/"&gt;StL JUG&lt;/a&gt; features &lt;span style="font-style: italic;"&gt;another&lt;/span&gt; NFJS speaker, &lt;a href="http://kensipe.blogspot.com/"&gt;Ken Sipe&lt;/a&gt;, with a talk on Spring 3 Annotations.&lt;br /&gt;&lt;br /&gt;For more write-ups, events, and a great local calendar, see &lt;a href="http://tech.puredanger.com/2009/02/02/stlouis-speaking/"&gt;this post&lt;/a&gt; over at Alex Miller's blog.  There is a lot going on in the coming weeks in the "Gateway Valley".  Come on out and take real steps towards diversifying your career!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6513481293903486644?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6513481293903486644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6513481293903486644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6513481293903486644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6513481293903486644'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/02/thursday-nights-alright-for-byting.html' title='Thursday Night&apos;s Alright for Byting'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5945970278310825562</id><published>2009-01-21T20:02:00.000-08:00</published><updated>2009-01-22T10:34:30.555-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parody'/><title type='text'>Seattle jazz players urge Microsoft to rebrand F# as Gb</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lfuDZjhLbAM/SXfwVQcqdtI/AAAAAAAAATA/6JeaOWBbbQo/s1600-h/trumpet.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 255px;" src="http://1.bp.blogspot.com/_lfuDZjhLbAM/SXfwVQcqdtI/AAAAAAAAATA/6JeaOWBbbQo/s320/trumpet.jpg" alt="" id="BLOGGER_PHOTO_ID_5293964134980417234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CtJ Newswire&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Parody City, CA&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Jan 22, 2009&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In a press conference held near Seattle, a group of jazz musicians urged Microsoft to rebrand its nascent language, &lt;a href="http://en.wikipedia.org/wiki/F_Sharp_programming_language"&gt;F#&lt;/a&gt; (pronounced F-Sharp), as Gb (G-Flat).&lt;br /&gt;&lt;br /&gt;Said a spokesperson for the group: "It is abundantly clear that Microsoft employees are primarily guitarists or pianists. When horn players look at both F# and C#, we see the vibe: there is no love coming our way here. All those sharps: we just don't &lt;span style="font-style: italic;"&gt;think&lt;/span&gt; that way."&lt;br /&gt;&lt;br /&gt;Another protester recognized the technical details: "Look, we understand that there is a language called &lt;a href="http://en.wikipedia.org/wiki/D_%28programming_language%29"&gt;D&lt;/a&gt;, and that Db might have implied some kind of inferiority.  So we stayed silent on&lt;a href="http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29"&gt; C#&lt;/a&gt;. But there is no language called G, and so F# is a slap in the face.  What's more, if the top-&lt;span style="font-style: italic;"&gt;brass&lt;/span&gt; at Microsoft want to &lt;a href="http://en.wikipedia.org/wiki/Trumpet"&gt;&lt;span style="font-style: italic;"&gt;trumpet&lt;/span&gt;&lt;/a&gt; support for a functional programming language with monad-like structures, lambda expressions, and strong static typing, then all we ask is that they use an appropriate key for we horn blowers."&lt;br /&gt;&lt;br /&gt;At this time, there is no word if Microsoft will comply with the musicians' plea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5945970278310825562?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5945970278310825562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5945970278310825562' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5945970278310825562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5945970278310825562'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/01/seattle-jazz-players-urge-microsoft-to.html' title='Seattle jazz players urge Microsoft to rebrand F# as Gb'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lfuDZjhLbAM/SXfwVQcqdtI/AAAAAAAAATA/6JeaOWBbbQo/s72-c/trumpet.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1523396525488575082</id><published>2009-01-08T19:53:00.001-08:00</published><updated>2009-01-08T21:24:11.495-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='copyright notices'/><title type='text'>Your company's first bug of 2009</title><content type='html'>I bet I can guess a bug at your company. You may not even know it. Nor your customers, or your marketing department.&lt;br /&gt;&lt;br /&gt;It's probably in your code. It might be on your website. It is probably completely innocuous until you need it most, and then, well, your legal staff will tell you &lt;span style="font-style: italic;"&gt;all about it&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If you haven't guessed yet, it's your &lt;a href="http://en.wikipedia.org/wiki/Copyrights"&gt;copyright&lt;/a&gt; text. Most likely, it says something like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;ABC Company copyright 2002-2008. All rights reserved.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or even possibly "&lt;span style="font-family:verdana;"&gt;... (c) 2002-2004&lt;/span&gt;" if it is in code.&lt;br /&gt;&lt;br /&gt;What does this mean? Does it really matter?&lt;br /&gt;&lt;br /&gt;Good question.  The facile answer is that if it was important enough to merit a copyright notice from 2002 to 2004, then it is probably important enough to update now.  A more sophisticated question is if there is any legal standing for the &lt;span&gt;years&lt;/span&gt; &lt;span style="font-style: italic;"&gt;after&lt;/span&gt; a copyright notice.  To be honest, I don't know.&lt;br /&gt;&lt;br /&gt;All I know is that one team lead (who I respect) once speculated that omitting a copyright notice on new code was grounds for dismissal. I thought that was crazy then, and I do now: but it underscores the importance of this legal business. (As an aside, it &lt;span style="font-style: italic;"&gt;just looks &lt;/span&gt;plain bad when the year is off on a website.)&lt;br /&gt;&lt;br /&gt;I invite clarifications on the ramifications of letting copyrights 'expire' (if that is the correct term), but for now the takeaway is: update the darn year, and give your lawyers some backup support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1523396525488575082?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1523396525488575082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1523396525488575082' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1523396525488575082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1523396525488575082'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/01/your-companys-first-bug-of-2009.html' title='Your company&apos;s first bug of 2009'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6223738168371545053</id><published>2009-01-05T05:42:00.000-08:00</published><updated>2009-01-05T05:48:17.246-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='executive summary'/><title type='text'>Executive Summary: the Origin of MicroBenchmarks</title><content type='html'>Inspired by a recent post about JavaFX being 25x faster than some other languages. (No link provided because it doesn't merit more attention.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lfuDZjhLbAM/SWIO3ya1jzI/AAAAAAAAAS4/qKfAW8JSnSU/s1600-h/FlameWars2.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 268px;" src="http://1.bp.blogspot.com/_lfuDZjhLbAM/SWIO3ya1jzI/AAAAAAAAAS4/qKfAW8JSnSU/s400/FlameWars2.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5287805264076312370" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6223738168371545053?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6223738168371545053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6223738168371545053' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6223738168371545053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6223738168371545053'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2009/01/executive-summary-origin-of.html' title='Executive Summary: the Origin of MicroBenchmarks'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lfuDZjhLbAM/SWIO3ya1jzI/AAAAAAAAAS4/qKfAW8JSnSU/s72-c/FlameWars2.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6093032351521548870</id><published>2008-12-22T07:46:00.000-08:00</published><updated>2008-12-22T11:54:51.081-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>The Obscenity of New Syntax</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A couple of weeks ago, I attended the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt; for a talk on &lt;a href="http://en.wikipedia.org/wiki/Ocaml"&gt;OCaml&lt;/a&gt;. I decided to be proactive, so before the talk, I downloaded the runtime and kicked the tires.&lt;br /&gt;&lt;br /&gt;For days, during compilations and Fit tests, I would play with the language.  I had used ML years ago, but had forgotten much of it (aside from a vague memory of an ultra-strict, Klingon type system that was both a high-grade irritant, and yet oddly reassuring).&lt;br /&gt;&lt;br /&gt;By the end of a week, I wasn't much further ahead with OCaml.  I had written some basic functions and expressions, but nothing substantive.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The Experience&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;During the talk, I realized that the experimentation was more useful than I had imagined.&lt;br /&gt;&lt;br /&gt;The presenter showed something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: rgb(196, 225, 255);"&gt;&lt;br /&gt;# let sphere_surface = fun x -&gt; x *. x *. pi;;&lt;br /&gt;val sphere_surface : float -&gt; float = fun &lt;/pre&gt;&lt;br /&gt;The questions flew immediately: why is there a double-semi (&lt;code&gt;;;&lt;/code&gt;) ? are we running as root? how do we interpret the output?&lt;br /&gt;&lt;br /&gt;These were natural questions by smart newbies to the language. I had two thoughts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Naturally, it helps to prepare for a talk, but I was surprised by how far my modest time investment had taken me. I couldn't have answered all of the questions, but I could place myself in both mindsets: one of the questioner (what the heck?) and also the presenter (oh, see it works like this).&lt;/li&gt;&lt;li&gt;The first few examples struck the audience as obscene.  I don't mean morally, and I don't mean that as a slight to OCaml per se.  I mean in an artistic sense: well-known symbols that were beloved in other contexts had now been thrown together in a way that was jarring and almost repulsive.  It takes some time to get past that shock of illiteracy.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The Upshot&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This post is a reminder to myself: if a language talk is on the calendar, it is vital to download the environment and write some toy examples before attending, even if you only have a &lt;span style="font-style: italic;"&gt;couple of hours&lt;/span&gt; to spare. The idea is not to learn the language but to embrace the obscenity and overcome it: celebrate the dissonance! As one music teacher put it: &lt;a href="http://en.wikipedia.org/wiki/Hendrix_chord"&gt;the Hendrix chord&lt;/a&gt; would have been considered hideous, even dangerous, in other eras. Now, it rocks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Next Up: JavaFX&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You may have several opportunities to see presentations on a new language in the near future: JavaFX. If you subscribe to the idea behind this post, you might be interested in an article by my friend &lt;a href="http://www.weiqigao.com/blog/"&gt;Weiqi Gao&lt;/a&gt;: it is a top-shelf &lt;a href="http://ociweb.com/jnb/jnbDec2008.html"&gt;article on JavaFX as a language&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I'm going to be giving it a whirl over the holidays.  The goal is to sing &lt;span style="font-style: italic;"&gt;Auld Lang Syntax&lt;/span&gt; on New Year's Eve!&lt;br /&gt;&lt;br /&gt;ps. Best holiday wishes to all readers... Here's a toast to a fine '09&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6093032351521548870?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6093032351521548870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6093032351521548870' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6093032351521548870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6093032351521548870'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/12/obscenity-of-new-syntax.html' title='The Obscenity of New Syntax'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3538784372540151521</id><published>2008-12-08T10:17:00.000-08:00</published><updated>2008-12-08T10:54:25.599-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='happy holidays from everyone at CodeToJoy'/><title type='text'>Island Rhubarb Dessert (Favourite Holiday Recipe Meme)</title><content type='html'>I've been tagged by &lt;a href="http://stuffthathappens.com/blog/2008/12/06/grizzlenuckles-favorite-holiday-recipe-meme/"&gt;Eric on the Favourite Holiday Recipe meme&lt;/a&gt;.  Here is mine: it is not difficult compared to other family recipes but it is excellent.  It works best with rhubarb grown on &lt;a href="http://en.wikipedia.org/wiki/Prince_Edward_Island"&gt;Prince Edward Island&lt;/a&gt;, but if not possible, work with the freshest stuff you can find.&lt;br /&gt;&lt;br /&gt;I'm tagging:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://weblog.dangertree.net/"&gt;Matt&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cupcakeproject.com/"&gt;Stef&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wilsond.blogspot.com/"&gt;Dale&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pyrochub.com/"&gt;Nate&lt;/a&gt;&lt;br /&gt;and &lt;a href="http://lickoftheday.blogspot.com/"&gt;Dave&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Island Rhubarb Dessert&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This a 4-layer pan dessert.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Put on some favourite holiday music and pour a beverage of your choice.&lt;/li&gt;&lt;li&gt;Prepare separate packages of dreamwhip and a 6 oz package of vanilla pudding.&lt;/li&gt;&lt;li&gt;Eat some vanilla pudding, to set the stage.  &lt;/li&gt;&lt;li&gt;Crust layer: Mix 1 1/2 cups graham crumbs, 1/4 cup soft margarine, and 1/4 &lt;span class="yshortcuts" id="lw_1228760348_0"&gt;cup brown sugar&lt;/span&gt;. Spread in 9 x 11 inch pan.  Bake at 350 F for 5 to 8 minutes. Let cool.&lt;/li&gt;&lt;li&gt;Filling layer 1: 4 cups fresh or frozen rhubarb, 1 cup white sugar, 1/2 cup water, 3 tablespoons cornstarch, and 2 tablespoons strawberry jello powder. Boil until cooked and thick to a sauce. Spread on crust.  Let cool.&lt;/li&gt;&lt;li&gt;Filling layer 2: Cover with prepared dreamwhip and add 1 1/2 miniatures marshmellows if desired.&lt;/li&gt;&lt;li&gt;Top layer: spread prepared vanilla pudding over the dreamwhip layer.&lt;/li&gt;&lt;li&gt;Refrigerate.&lt;/li&gt;&lt;li&gt;Enjoy with friends.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3538784372540151521?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3538784372540151521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3538784372540151521' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3538784372540151521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3538784372540151521'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/12/island-rhubarb-dessert-favourite.html' title='Island Rhubarb Dessert (Favourite Holiday Recipe Meme)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5776499608040495272</id><published>2008-12-06T06:15:00.001-08:00</published><updated>2008-12-06T06:38:20.335-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lambda lounge'/><title type='text'>Lambda Lounge Lures Legion of Licentious Linguists</title><content type='html'>As &lt;a href="http://tech.puredanger.com/2008/12/04/lambda-lounge-launch/"&gt;many others&lt;/a&gt; have &lt;a href="http://www.weiqigao.com/blog/2008/12/04/st_louis_lounge.html"&gt;mentioned&lt;/a&gt;, the first meeting at the &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt; was a big hit!  It was clear from the turnout (30+) that (a) a lot of people have a thirst for something more exotic than Java and (b) the IT community in StL is thriving and sophisticated.  We all agreed that we are 'promiscuous' regarding computer languages (hence the post title).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.appistry.com/"&gt;Appistry&lt;/a&gt; served as gracious host and formed a fitting backdrop for the evening, and the vibe was palpable; there was an energy similar to the NFJS conferences.&lt;br /&gt;&lt;br /&gt;The content was excellent stuff: &lt;a href="http://weblog.dangertree.net/"&gt;Matt Taylor&lt;/a&gt; discussed categories and mixins in Groovy; Ryan Senior gave an overview of OCaml.  &lt;br /&gt;&lt;br /&gt;Overheard at the meeting (paraphrased) :&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Java is wonderful, boring, and the new COBOL, all at the same time. (Editor's note: perhaps it is the new C ?)&lt;/li&gt;&lt;li&gt;I wish OCaml didn't use # as the prompt. I feel like we're the root user and something crazy is about to happen.&lt;/li&gt;&lt;li&gt;10 years ago, we turned out in gatherings like this because we were stoked about Java.  Now we turn out to get away from Java.&lt;/li&gt;&lt;li&gt;The opposite of a functional language is a dysfunctional language.&lt;/li&gt;&lt;li&gt;They should name OCaml's web framework to be ODromedary.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Bottom-line:  Come on out to the January meeting if you want a piece of this. Time well spent with cool people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5776499608040495272?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5776499608040495272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5776499608040495272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5776499608040495272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5776499608040495272'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/12/lambda-lounge-lures-legion-of.html' title='Lambda Lounge Lures Legion of Licentious Linguists'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-3945333012232395351</id><published>2008-12-03T05:12:00.001-08:00</published><updated>2008-12-03T05:44:44.585-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parody'/><title type='text'>Child suspended for EJB taunt</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lfuDZjhLbAM/STaF4rOO3bI/AAAAAAAAASo/BqFgoWyIdms/s1600-h/iStock_000000730250Small.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 213px;" src="http://1.bp.blogspot.com/_lfuDZjhLbAM/STaF4rOO3bI/AAAAAAAAASo/BqFgoWyIdms/s320/iStock_000000730250Small.jpg" alt="" id="BLOGGER_PHOTO_ID_5275551222232702386" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;CtJ Newswire&lt;br /&gt;Parody City&lt;br /&gt;December 3, 2008&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;A district schoolboard reported today that a Grade 2 student has been suspended indefinitely for calling his teacher "the EJB of school" in class.&lt;br /&gt;&lt;br /&gt;The announcement comes on the heels of a heated exchange between the teacher and the student as to whether cursive writing was important.&lt;br /&gt;&lt;br /&gt;The principal of the school, Edgar J. Boyle, provided a brief statement: "We aren't exactly sure what EJB is, but after consulting with the IT industry, we understand that it implies a high degree of excess proportion and baroque complexity, ultimately leading to failure. In some circles, it is a taunt of the highest order.  We believe this kind of language was learned in the home, but we refuse to stand for it in the classroom."&lt;br /&gt;&lt;br /&gt;There is no word if the parents will appeal the decision, despite rumors of a protest website being constructed with Grails, a nascent IT solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-3945333012232395351?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/3945333012232395351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=3945333012232395351' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3945333012232395351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/3945333012232395351'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/12/child-suspended-for-ejb-taunt.html' title='Child suspended for EJB taunt'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_lfuDZjhLbAM/STaF4rOO3bI/AAAAAAAAASo/BqFgoWyIdms/s72-c/iStock_000000730250Small.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-765684913542376832</id><published>2008-11-30T18:56:00.001-08:00</published><updated>2008-11-30T19:24:06.904-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='get your geek on'/><title type='text'>A First Look at Android (video)</title><content type='html'>&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_mYLlwxYBHk&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/_mYLlwxYBHk&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Here is a tech talk by the nefarious comic artist, Eric Burke (we're friends/colleagues/blog rivals).&lt;br /&gt;&lt;br /&gt;Eric discusses his initial experimentation with Android. He's been working with Ed Burnette's e-book '&lt;a href="http://www.pragprog.com/titles/eband/hello-android"&gt;Hello Android&lt;/a&gt;', and has some good stuff over at &lt;a href="http://stuffthathappens.com/blog/"&gt;his blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is not news that the mobile platform is the Next Great Battlefield, but intro material on Android &lt;span style="font-style: italic;"&gt;is news&lt;/span&gt;.  With all of the massive players in this space, it is important for us to pick a horse and bet on it with a time investment and experimentation.&lt;br /&gt;&lt;br /&gt;I won't tell you which one to learn, but Android is a reasonable choice.  You can see why in the video...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-765684913542376832?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/765684913542376832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=765684913542376832' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/765684913542376832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/765684913542376832'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/first-look-at-android-video.html' title='A First Look at Android (video)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5536373512121540467</id><published>2008-11-30T10:14:00.000-08:00</published><updated>2008-11-30T10:35:26.619-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='come on out'/><title type='text'>Spice up your week with the Lambda Lounge</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lfuDZjhLbAM/STLafoZoBkI/AAAAAAAAASY/J0karIPoNcM/s1600-h/logo.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: left; cursor: pointer; width: 90px; height: 90px;" src="http://3.bp.blogspot.com/_lfuDZjhLbAM/STLafoZoBkI/AAAAAAAAASY/J0karIPoNcM/s320/logo.png" alt="" id="BLOGGER_PHOTO_ID_5274518350559970882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looking for something more exotic than Java or C++ ?&lt;br /&gt;&lt;br /&gt;Need an oasis of pure computing in an otherwise bleak and desolate week of software engineering?&lt;br /&gt;&lt;br /&gt;If you are in St Louis, &lt;a href="http://tech.puredanger.com/"&gt;Alex Miller&lt;/a&gt; has something for you: the nascent &lt;a href="http://lambdalounge.org/"&gt;Lambda Lounge&lt;/a&gt;, a monthly celebration of developments in the world of functional and dynamic languages.&lt;br /&gt;&lt;br /&gt;As mentioned on the website, the basic idea is to explore new developments in programming languages and libraries.  Note that the subjects are not necessarily bound to the JVM or the DLR from dot Net.   I'm looking forward to the weird and wonderful stuff at this meeting.  The first one is Thursday, December 4.  Check &lt;a href="http://lambdalounge.org/"&gt;the website&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;On a sidenote, I quite like the logo.  I'm not sure of the symbolism of the bits at the top.  My interpretation is that they are eyeglasses.  If true, I love this because it reminds me of the styles of the &lt;a href="http://en.wikipedia.org/wiki/Wilhelm_Steinitz"&gt;chess grandmasters&lt;/a&gt; of Europe in the late 19th century, and particularly the cafes in Paris where intellectuals would congregate to discuss philosophy and other subjects.&lt;br /&gt;&lt;br /&gt;That said, this meeting will be much less pretentious than those gatherings of yore!  No word if there will be sword-play based on heated language debates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5536373512121540467?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5536373512121540467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5536373512121540467' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5536373512121540467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5536373512121540467'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/spice-up-your-week-with-lambda-lounge.html' title='Spice up your week with the Lambda Lounge'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lfuDZjhLbAM/STLafoZoBkI/AAAAAAAAASY/J0karIPoNcM/s72-c/logo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-5948715629225689704</id><published>2008-11-20T19:39:00.000-08:00</published><updated>2008-11-20T19:46:33.532-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shouda bought this when I was commuting 60 miles a day'/><title type='text'>Car-pooling with eBay, Erlang, and Haskell</title><content type='html'>I bought a &lt;a href="http://www.alpine-usa.com/US-en/products/product.php?model=cda-9886&amp;amp;lang=en&amp;amp;tab=A"&gt;new stereo&lt;/a&gt; for my car, and I'm enjoying listening to tech podcasts on my commute and errands.&lt;br /&gt;&lt;br /&gt;My favourite is still the beguiling &lt;a href="http://javaposse.com/"&gt;Java Posse&lt;/a&gt;, but I have been extremely impressed with &lt;a href="http://se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt;.  This is &lt;span style="font-style: italic;"&gt;world-class&lt;/span&gt; stuff.  Be sure to check out the episodes with eBay's Randy Shoup, Erlang guru Joe Armstrong, and Haskell maven Simon Peyton Jones.&lt;br /&gt;&lt;br /&gt;Outstanding.  I'm going to be donating to the cause via PayPal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-5948715629225689704?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/5948715629225689704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=5948715629225689704' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5948715629225689704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/5948715629225689704'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/car-pooling-with-ebay-erlang-and.html' title='Car-pooling with eBay, Erlang, and Haskell'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6304361281024850193</id><published>2008-11-07T04:45:00.000-08:00</published><updated>2008-11-07T04:45:00.459-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i&apos;m not a parallel i&apos;m just drawn that way'/><title type='text'>Groovy is to Grails, as X is to Y ?</title><content type='html'>Consider the following:  Groovy is to Grails, as X is to Y.&lt;br /&gt;&lt;br /&gt;I recently tweeted "... as C is to Unix".  Though &lt;a href="http://marioaquino.blogspot.com/"&gt;Mario&lt;/a&gt; quite rightly pointed out that much of Grails is written in Java, my thinking is that both Groovy and C enjoy greater popularity because of the success of their sibling application/system.  i.e. It seems that Grails, as Unix once did, acted as a driving force beyond that of pure language development, which propels innovation and gives focus to an emergent &lt;span style="font-style: italic;"&gt;style&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dave-klein.blogspot.com/"&gt;Dave Klein&lt;/a&gt; has his own tasty analogy about &lt;a href="http://twitter.com/daveklein/status/985453016"&gt;butter and pancakes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And you? What are your values for X and Y ?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=_2VXUQwGHZg"&gt;Ruby fans&lt;/a&gt; are invited to play the same game, with respect to Rails.  Are there any values for X and Y which resonate for Ruby/Rails but not for Groovy/Grails (or vice-versa)?  That one is very interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6304361281024850193?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6304361281024850193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6304361281024850193' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6304361281024850193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6304361281024850193'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/groovy-is-to-grails-as-x-is-to-y.html' title='Groovy is to Grails, as X is to Y ?'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1295848465492809267</id><published>2008-11-04T05:33:00.000-08:00</published><updated>2008-11-04T05:41:24.062-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strive for it'/><title type='text'>Kudos to ActiveMQ</title><content type='html'>At CtJ HQ, we try to spotlight any projects that have a pleasant "getting started" experience.&lt;br /&gt;&lt;br /&gt;Today's winner is &lt;a href="http://activemq.apache.org/"&gt;ActiveMQ&lt;/a&gt;, an open-source JMS implementation.  After following the installation instructions, I went to a "Getting Started" web page that explains how to start the basic consumer and producer examples.  The instructions are clear, and the code is a perfect "foothold": something to help me get a leg up. It is simple and yet has several options to show various JMS patterns.&lt;br /&gt;&lt;br /&gt;My thanks to those involved!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1295848465492809267?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1295848465492809267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1295848465492809267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1295848465492809267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1295848465492809267'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/kudos-to-activemq.html' title='Kudos to ActiveMQ'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2205211164344906754</id><published>2008-11-03T05:00:00.000-08:00</published><updated>2008-11-03T05:00:00.640-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Good 1 Evil 0'/><title type='text'>Snatching Open Source Licensing from the Jaws of Legal Marginalization</title><content type='html'>A recent issue of DDJ has an &lt;a href="http://www.ddj.com/linux-open-source/210604978"&gt;fascinating article&lt;/a&gt; on the case of &lt;a href="http://en.wikipedia.org/wiki/Jacobsen_v._Katzer"&gt;Jacobsen versus Katzer&lt;/a&gt;, pertaining to the legal strength of open-source licenses.&lt;br /&gt;&lt;br /&gt;To quote author Michael Swaine: it's a big deal.&lt;br /&gt;&lt;br /&gt;The nano-gist is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Katzer threatened legal action on a supposed patent violation by Jacobsen.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Jacobsen looked at the facts (including that K had used parts of J's software), marshalled resources from the open-source community, and launched a pre-emptive lawsuit.&lt;/li&gt;&lt;li&gt;A U.S. district court judged in a manner that severely limited monetary damages awarded to J, based on a legal distinction between a condition and a covenant.&lt;/li&gt;&lt;li&gt;Later, an appeals court overturned the decision. i.e. The good guys win.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I didn't know about the case, so although the article is brief, it almost reads like the story-board for a thriller.  I hope that, somehow, it is made into a documentary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2205211164344906754?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2205211164344906754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2205211164344906754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2205211164344906754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2205211164344906754'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/snatching-open-source-licensing-from.html' title='Snatching Open Source Licensing from the Jaws of Legal Marginalization'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6036465778862674620</id><published>2008-11-02T16:33:00.000-08:00</published><updated>2008-11-02T16:49:02.922-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='map reduce google'/><title type='text'>Overview of Hadoop</title><content type='html'>My friend Tom Wheeler has written &lt;a href="http://ociweb.com/jnb/jnbNov2008.html"&gt;an excellent article&lt;/a&gt; over at the OCI &lt;a href="http://ociweb.com/articles/publications/jnb.html"&gt;Java News Brief&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The article has not only an overview but also many reference links and some outstanding examples of Hadoop in the wild.  Examples include the New York Times Machine project and a record-setting cluster with 4000 nodes.&lt;br /&gt;&lt;br /&gt;As neat as this all is, I'm more excited about the notion of people solving problems in a different way, via the Map-Reduce strategy.  Tom gives a counter-intuitive example of a word count algorithm: in the small, it is awkward and slow; in the large, it scales seamlessly to colossal proportions.&lt;br /&gt;&lt;br /&gt;Back in university, a favourite class was the Theory of Computation.  I recall the strategy of proving a problem was &lt;a href="http://en.wikipedia.org/wiki/NP-hard"&gt;NP-Hard&lt;/a&gt;:  if one can express it in terms of another problem that is known to be NP-Hard, then one could argue that if one can solve the original problem in polynomial time, then one could solve the set of NP problems in polynomial time (I'll let commenters distinguish between NP-Hard and NP-Complete and other subtleties).  As an understated aside, &lt;a href="http://en.wikipedia.org/wiki/P_%3D_NP_problem"&gt;solving this problem&lt;/a&gt; would be '&lt;span style="font-style: italic;"&gt;good for one's resume&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;Solving a problem with Map-Reduce isn't the same thing, but there is an abstract, psychic thread that seems to tie them together: the notion of thinking about problems in a certain mindset.  Very cool stuff.  I hope to find time to explore that further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6036465778862674620?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6036465778862674620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6036465778862674620' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6036465778862674620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6036465778862674620'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/overview-of-hadoop.html' title='Overview of Hadoop'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6756319006770527643</id><published>2008-11-01T08:43:00.000-07:00</published><updated>2008-11-01T15:51:50.191-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wish me luck'/><title type='text'>Lurker Exposed 2:  Giving Twitter a shot</title><content type='html'>Despite my rant, I'm giving &lt;a href="http://twitter.com/codetojoy"&gt;Twitter a shot&lt;/a&gt;, due to peer pressure and sketchy coercion from &lt;a href="http://weblog.dangertree.net/"&gt;a man with ties to the intelligence community&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My thinking:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't knock it till you've tried it (though that generally doesn't stop me)&lt;/li&gt;&lt;li&gt;Who's kidding? When it comes to blog hits, I'll prostitute myself as much as the next person.&lt;/li&gt;&lt;li&gt;Since I am genuinely interested in others' status, it should be more efficient than being a lurker.&lt;/li&gt;&lt;li&gt;Dopamine rushes and other biochemical reactions &lt;a href="http://en.wikipedia.org/wiki/Kiss"&gt;aren't a bad thing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Fear not, non-tweeters (especially those for whom the rant may have resonated) !&lt;br /&gt;&lt;br /&gt;I am only &lt;span style="font-style: italic;"&gt;visiting&lt;/span&gt; the dark side, and will fight assimilation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6756319006770527643?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6756319006770527643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6756319006770527643' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6756319006770527643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6756319006770527643'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/lurker-exposed-2-giving-twitter-shot.html' title='Lurker Exposed 2:  Giving Twitter a shot'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-1850354006580463569</id><published>2008-11-01T07:22:00.000-07:00</published><updated>2008-11-01T08:43:30.710-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant and roll'/><title type='text'>Lurker Exposed: Why I wasn't on Twitter</title><content type='html'>Many of my friends know that I am &lt;a href="http://twitter.com/rhyolight/statuses/908651495"&gt;not a fan of Twitter&lt;/a&gt;, and yet I lurk on there.  Here are some quick thoughts on the site.&lt;br /&gt;&lt;br /&gt;First, I should point out that I think I 'get it': the sense of community, particularly if you work with people remotely.  I also understand that if I don't like it, I can just stay away.... so we're in full &lt;span style="font-style: italic;"&gt;Unsolicited Opinion Mode&lt;/span&gt; here (and somewhat tongue-in-cheek).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Twitter killed the blogging star  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Gah! With blogs everything was going great: people wrote paragraphs, and others commented. Flame wars were so large that the flames danced into the night sky, harkening back to Usenet and other media of yore.  Twitter strikes me as a threat (hopefully a short-lived one) to the &lt;a href="http://steve-yegge.blogspot.com/"&gt;Great Conversations&lt;/a&gt;, banzai &lt;a href="http://codetojoy.blogspot.com/2007/11/las-vegas-lobbies-for-java-6-on-leopard.html"&gt;stunts&lt;/a&gt;, and &lt;a href="http://stuffthathappens.com/blog/2008/03/05/simplicity/"&gt;comics&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To paraphrase Stephen Wright, Twitter strikes me as HDADD : High-Definition Attention-Deficit Disorder.  There's hardly any focus, but when &lt;span style="font-style: italic;"&gt;it is&lt;/span&gt; there, it's "140 characters of amazing clarity" &lt;a href="http://twitpic.com/a4p8"&gt;*eye roll*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The War Room&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;My current team works in an open "war room" where there is a healthy peer pressure regarding minimal browsing.  Plus, I can't speak for you, but I seek simplicity when at work: no IM, no phone, and sometimes even &lt;a href="http://codetojoy.blogspot.com/2008/03/programming-in-sock-feet.html"&gt;no shoes&lt;/a&gt;. Sure, I have &lt;a href="http://stackoverflow.com/"&gt;guilty pleasures&lt;/a&gt; but I don't need another.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Navel Lint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Does anyone really want my status?  What if I'm wondering why navel lint is never the same colour as the garments one has been wearing?  Strangely, I do enjoy others' navel-gazing.... until one random tweet puts me off, and then I'm back into rant mode.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sharing Links&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I no longer care about websites that have been sent to me in email.  Same thing for twitter.  I've noticed that the best sites are those that people mention &lt;a href="http://en.wikipedia.org/wiki/Real_life_%28reality%29"&gt;here&lt;/a&gt;.  Essentially, your collective memories serve as &lt;span style="font-weight: bold;"&gt;my spam filter&lt;/span&gt; because if you remember it well enough to talk about it, it's probably good.&lt;br /&gt;&lt;br /&gt;Who knew that you've been working for me?  Awesome.  Now, let's go to a cafe, pub, or tech talk and have a real conversation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Politics&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Hoo-boy.  Many smart people bemoan the lack of nuance in the mainstream media (especially in North America) but then try to chat about issues in 140 characters?  Yikes.  Even better is the lack of threaded conversations.  As a lurker, I'm clicking all over the place to try and connect the dots on a pseudo-conversation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firing of Dopminergic Neurons... Wheels down on a dopamine rush&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I have a feeling that when one is tweeted by another who is "higher on the geek pecking order" that it fires reward sensors in the brain that can be interpreted as insight, or a meaningful connection.  It is neither!  It's merely a biochemical reaction!  Can't you people see what is happening? You may say twitter is a "convenient, asychronous chat-room where the whole is greater than the sum of its tweets".  I say it is a delusion, a vacuous sham of humanity that takes us one step closer to the Borg. &lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;OH: Twitter sucks.&lt;br /&gt;&lt;br /&gt;That said, you may be interested in the next post, where I'll tell you why I can't resist, and why I'm giving it a shot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-1850354006580463569?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/1850354006580463569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=1850354006580463569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1850354006580463569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/1850354006580463569'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/11/lurker-exposed-why-i-wasnt-on-twitter.html' title='Lurker Exposed: Why I wasn&apos;t on Twitter'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4376079800878803991</id><published>2008-10-13T18:19:00.000-07:00</published><updated>2010-01-26T18:12:15.504-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as simple as it gets'/><title type='text'>Simply Groovy (How to gain Competitive Advantage on Weiqi Gao's Friday Java Quiz)</title><content type='html'>&lt;a href="http://www.weiqigao.com/blog/"&gt;Weiqi Gao&lt;/a&gt; runs the popular Friday Java Quiz. He provides puzzles and invites us to ruminate on bed-time reading of the &lt;a href="http://java.sun.com/docs/books/jls/"&gt;Java Language Specification&lt;/a&gt;, or to recall a &lt;a href="http://www.javapuzzlers.com/"&gt;Java Puzzler&lt;/a&gt; that may have been discussed over dinner.  (He would be dismayed if he knew that we occasionally just &lt;a href="http://en.wikipedia.org/wiki/Top_Gear_%28current_format%29"&gt;watch TV&lt;/a&gt;.)  Often, he absolutely forbids us from using the compiler.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Whatever&lt;/span&gt;: if you're like me, you take your best, thoughtful guess and then fire up an editor to check.  Often, this is rushed, because it would be nice to be the first one to post a comment.  All too often, I don't get to the verification stage because it is just too much effort. I only have so many &lt;code&gt;public static void main&lt;/code&gt;s in me.&lt;br /&gt;&lt;br /&gt;These days, I just use Groovy's &lt;a href="http://codetojoy.blogspot.com/2008/08/groovys-e-and-friends-command-line-for.html"&gt;command-line&lt;/a&gt;.  It gives me an advantage in terms of speed, and it often makes the problem more fun, because I have to formulate it in a different way.&lt;br /&gt;&lt;br /&gt;For example, &lt;a href="http://www.weiqigao.com/blog/2008/10/10/friday_java_quiz_it_cant_go_simpler_than_this.html"&gt;in the latest quiz&lt;/a&gt;, Weiqi says that it can't get much simpler.&lt;br /&gt;&lt;br /&gt;In Java, the code is (mostly) as simple as possible:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class Foo {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        Serializable bar = null;&lt;br /&gt;        System.out.println(bar instanceof Serializable);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yet with Groovy's &lt;code&gt;-e&lt;/code&gt; parameter, life is much easier (and faster):&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;$ groovy -e &amp;quot; Serializable bar = null ; \&lt;br /&gt;         println (bar instanceof Serializable) &amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The snippet above has 2 cool elements: (a) Groovy auto-imports &lt;code&gt;java.util.*&lt;/code&gt; and &lt;code&gt;java.io.*&lt;/code&gt; (e.g. Serializable) for you and (b) it will evaluate an expression on the fly.  Because Groovy accepts most Java, this is a handy way to beat the masses to the answer of the Friday Java Quiz.&lt;br /&gt;&lt;br /&gt;More than that, it is a great way to answer many quick questions in Java.  I often use it in my team's war room when a question arises.&lt;br /&gt;&lt;br /&gt;Note: I'm not sure, but I think that &lt;code&gt;-e&lt;/code&gt; may have a bug in 1.5+ on a Windows machine.  A single statement works fine, but this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;&lt;br /&gt;groovy -e &amp;quot; println 'hi' ; println 'there' &amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;seems to have trouble on a Windows box. Drop a line on your experience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4376079800878803991?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4376079800878803991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4376079800878803991' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4376079800878803991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4376079800878803991'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/10/simply-groovy-how-to-gain-competitive.html' title='Simply Groovy (How to gain Competitive Advantage on Weiqi Gao&apos;s Friday Java Quiz)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-7493681834542360965</id><published>2008-10-08T10:01:00.000-07:00</published><updated>2008-10-08T16:19:40.921-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lets order pizza and watch'/><title type='text'>Ant vs Maven, Episode 2 : Gant or Gradle?</title><content type='html'>In June, I gave a tech talk on &lt;a href="http://gant.codehaus.org/"&gt;Gant&lt;/a&gt;.  Gant is a Groovy layer on top of Ant -- essentially Groovy's AntBuilder on sterioids.&lt;br /&gt;&lt;br /&gt;My thesis was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We are in a post-Ant world, and at a crossroads.  One road involves continuous integration tools such as Hudson.  Another road concerns project framework builds such as Maven.  A final road is for general purpose build tools such as Ant.  These roads may intertwine, and even build on one another.&lt;/li&gt;&lt;li&gt;However, with respect to the latter road: we need a new general purpose build tool.  We owe a tremendous debt to Ant, and it is still useful, but it has serious problems.  First, XML is &lt;a href="http://codetojoy.blogspot.com/2008/09/fascinating-quote-attributed-to-james.html"&gt;not a programming language&lt;/a&gt;. Second, the Ant community can't decide if it is declarative or imperative: e.g. properties are immutable, &lt;a href="http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html"&gt;except when they aren't&lt;/a&gt;.  Finally, some of Ant's built-in tasks (e.g. javac) are great: call them "big iron" workhorses; however, the act of "machining" a new task is prohibitively difficult.&lt;/li&gt;&lt;li&gt;Enter Gant: it rests on top of the "big iron" tasks of Ant, but allows us to work with a real programming language (Groovy) so that simple logic is trivial and new tasks are like working with modelling clay.  Put another way, if Ant is a &lt;a href="http://www.dutchclocksinoz.com.au/images/clockwork.JPG"&gt;rigid, metal clock&lt;/a&gt;, then &lt;a href="http://en.wikipedia.org/wiki/Image:The_Persistence_of_Memory.jpg"&gt;Gant is weirdly fluid&lt;/a&gt; -- yet both keep time.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That was June.  Now, alas, it isn't so simple: Gant has had a competitor named &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt;.  Gradle is more 'heavyweight' than Gant: it uses a full Directed Acyclic Graph (DAG) and aspires to be closer to something like &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; or &lt;a href="http://www.scons.org/"&gt;SCons&lt;/a&gt;.  In terms of formal build theory, Gradle is more powerful than Gant.&lt;br /&gt;&lt;br /&gt;The question, &lt;a href="http://www.nabble.com/Gant-and-Gradle-td19810302.html"&gt;posed on the Groovy mailing list&lt;/a&gt;, is how to unify the forces.  It is a fascinating debate, and rather important to the Groovy community.  I haven't used Gradle so I can't choose, but I will say that I think this direction &lt;span style="font-style: italic;"&gt;is the future&lt;/span&gt; for build tools: dynamic languages are a great fit for builds.&lt;br /&gt;&lt;br /&gt;Here is a quick (hopefully correct) rundown:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gant rests on top of Ant.  It is lightweight and is used as a task management framework in Grails (quite a pedigree there).&lt;/li&gt;&lt;li&gt;Gradle has strong Ant integration, but aspires to be more than a scripting language for Ant. It has DAG support and targets a space closer to, and actually beyond, Maven.&lt;/li&gt;&lt;li&gt;In simple terms, Gant is analogous to Ant ; Gradle is analogous to Maven.  And so many of the usual arguments apply.  However, an open question is if Gradle can serve Gant's position as a lightweight tool (where &lt;span style="font-style: italic;"&gt;lightweight&lt;/span&gt; itself is open to definition).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If you want to be on the bleeding edge, check out this debate.  I'm happy to see that the discussion is civil and intelligent: these are cool blokes.  Very interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-7493681834542360965?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/7493681834542360965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=7493681834542360965' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7493681834542360965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/7493681834542360965'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/10/ant-vs-maven-episode-2-gant-or-gradle.html' title='Ant vs Maven, Episode 2 : Gant or Gradle?'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6533372423461418036</id><published>2008-10-08T09:49:00.000-07:00</published><updated>2008-10-08T09:57:53.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Daffy Duck'/><category scheme='http://www.blogger.com/atom/ns#' term='it is to laugh'/><title type='text'>Razz Your Friends : the best Java Exception ever</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:verdana;" &gt;Hey! what is this mess? You are totally throwing a CME!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Where &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/CoderMalfunctionError.html"&gt;CME is defined here&lt;/a&gt; (and used metaphorically)&lt;br /&gt;&lt;br /&gt;Thanks to CtJ correspondent Steve Holdener for the tip.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6533372423461418036?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6533372423461418036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6533372423461418036' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6533372423461418036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6533372423461418036'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/10/razz-your-friends-best-java-exception.html' title='Razz Your Friends : the best Java Exception ever'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-4345486131485341255</id><published>2008-10-06T14:04:00.000-07:00</published><updated>2008-10-06T14:16:20.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Future 1 Past 0'/><title type='text'>I have seen the Future and its name is Ruby</title><content type='html'>Well, &lt;span style="font-style:italic;"&gt;I&lt;/span&gt; haven't seen the future, but this guy has... I defer to &lt;span style="font-style:italic;"&gt;Future Man&lt;/span&gt; for an update on the current state of the language:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_2VXUQwGHZg&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/_2VXUQwGHZg&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;ps. Be sure to see the outtake (?) at the end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-4345486131485341255?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/4345486131485341255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=4345486131485341255' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4345486131485341255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/4345486131485341255'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/10/i-have-seen-future-and-its-name-is-ruby.html' title='I have seen the Future and its name is Ruby'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-243891840000820090</id><published>2008-10-05T19:19:00.000-07:00</published><updated>2010-01-26T18:13:24.319-08:00</updated><title type='text'>Thank You, Java 5</title><content type='html'>&lt;a href="http://tech.puredanger.com/2008/07/15/jdk-version-poll-results/"&gt;Alex Miller polled Java users&lt;/a&gt; and a fair number are still using JDK 1.4.  This post is intended for those folks: have hope, there is truly useful stuff in Java 5.&lt;br /&gt;&lt;br /&gt;In this post, I will mention a couple of my favourites.  These have been well-documented, and are not even the 'coolest' features, but my respect for them has been well-earned over the last few months.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Background&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've been part of a team that has been moving a project from JDK 1.4 to Java 6, and introducing Hibernate/Postgres to replace (in incremental steps) an existing, legacy framework that works with an OODB.  This has been a serious refactoring and fairly risky. My analogy is that of putting in a subway transit system into a modern city: it is a massive job, but will be well worth it.&lt;br /&gt;&lt;br /&gt;Ten months later, we appear (knock wood) to be finished with a major version of this migration.  I've used the following Java 5 features before, but now I am truly fond of them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The For Loop&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I first saw the new for loop, I yawned:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;// snip  &lt;br /&gt;&lt;br /&gt;for( String s : list ) {&lt;br /&gt;    System.out.println(s);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It was a nice bit of syntactic sugar, but I was unimpressed.   Now, I can't stand to see an old-style loop.  The new loop is so much cleaner.  A major bonus for us is that it works with arrays:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;String[] array = new String[]{ &amp;quot;abc&amp;quot;, &amp;quot;def&amp;quot; };&lt;br /&gt;&lt;br /&gt;for( String s : array ) {&lt;br /&gt;    System.out.println(s);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As we have refactored, the code literally looks washed and waxed afterwards. Very nice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Generics&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I first saw generics in Java, I was unimpressed.  With a background in C++ and other languages, I understood the point but felt that Java had lost some of its Smalltalk influence, and that the syntax was plain ugly.  When I realized the "wall of erasure" (&lt;a href="http://viewfromthefringe.blogspot.com/2007/11/wall-of-erasure.html"&gt;as coined by Brian Gilstrap&lt;/a&gt;), I was even less enthused:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;list.add(&amp;quot;Cubs swept by Dodgers.&amp;quot;);&lt;br /&gt;list.add(&amp;quot;any team can have a bad millenium!&amp;quot;);&lt;br /&gt;  &lt;br /&gt;// on a static page, generics allows us to avoid the cast,&lt;br /&gt;// which is boring, and compile-time checking. &lt;br /&gt;// The biggest advantage is in a good IDE&lt;br /&gt;// where this information comes alive:&lt;br /&gt;&lt;br /&gt;String first = list.get(0);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, I am an absolute fan.  Yes, the corner cases are sharp, and the FAQ is very long for a reason.  Yes, we may well need reified types to get full generic capabilities.  &lt;span style="font-style: italic;"&gt;I don't care&lt;/span&gt;: the new static typing of collections &lt;span style="font-weight: bold;"&gt;saved our project&lt;/span&gt;.  Seriously.  We were wading through dozens of collections in the legacy code and would have never been able to untangle all the knots without Java generics and Eclipse.  I repeat: &lt;span style="font-style: italic;"&gt;generics saved us&lt;/span&gt;, and I am grateful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We shouldn't suspend our critical thinking and skepticism when it comes to new language features.  However, we should also believe that people are earnestly trying to add value when new features are proposed.  For one, I am going to keep an open mind when it comes to looking at the new features for Java 7+.  Who knows: the features which cause us to roll our eyes may well be our future favourites.&lt;br /&gt;&lt;br /&gt;ps. This is another post but unit testing and integration testing (with dbUnit) was equally essential to our success.  Of the bugs in new code, my guess is that 90% were in code that was not tested.&lt;br /&gt;&lt;br /&gt;pps. We have barely used static imports, but Eric has done &lt;a href="http://stuffthathappens.com/blog/2007/11/13/static-imports-rock/"&gt;some cool things&lt;/a&gt; with them. They are underrated, IMO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-243891840000820090?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/243891840000820090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=243891840000820090' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/243891840000820090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/243891840000820090'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/10/thank-you-java-5.html' title='Thank You, Java 5'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-209872556124761388</id><published>2008-09-26T10:45:00.001-07:00</published><updated>2008-09-26T10:50:36.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='my thanks to The Google'/><title type='text'>Timeout bug with Corba and Java</title><content type='html'>Just in case this helps anyone searching The Google:&lt;br /&gt;&lt;br /&gt;If you see an error message like this (snipped):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;WARNING: (COMM_FAILURE) Read of full message failed : bytes requested = X bytes read = Y max wait time = 3,000 total time spent waiting = 3,190&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and are using Java 1.5+ with CORBA, then be sure to check out &lt;a href="http://forums.sun.com/thread.jspa?messageID=3827357&amp;amp;tstart=0"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Essentially, it involves a timeout value on a socket.  Changing this property:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;com.sun.CORBA.transport.ORBTCPReadTimeouts&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;is the key, as described in the linked post.  Mercifully, we came across this quickly during a recent troubleshooting.  It could have consumed days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-209872556124761388?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/209872556124761388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=209872556124761388' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/209872556124761388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/209872556124761388'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/09/timeout-bug-with-corba-and-java.html' title='Timeout bug with Corba and Java'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2033403752865025394</id><published>2008-09-24T18:35:00.000-07:00</published><updated>2008-09-24T19:02:23.983-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hats off to the old lion'/><title type='text'>A fascinating quote attributed to James Gosling</title><content type='html'>I have been sitting on &lt;a href="http://weblogs.java.net/blog/arnold/archive/2003/06/duncan_davidson.html"&gt;this post&lt;/a&gt; by Ken Arnold for months now, trying to figure out a way to write about it.  I thought of it again today and decided to&lt;span style="font-style: italic;"&gt; carpe blogem&lt;/span&gt; with some quick thoughts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Random Thoughts&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;James Duncan Davidson has always been too apologetic and too harsh on Ant.  Sure, it isn't perfect and may not have been his finest hour, but it delivered us from &lt;a href="http://en.wikipedia.org/wiki/Make_%28software%29"&gt;'make'&lt;/a&gt;; and for that, I'm &lt;span style="font-weight: bold;"&gt;forever&lt;/span&gt; grateful.&lt;/li&gt;&lt;li&gt;IMO, &lt;a href="http://gant.codehaus.org/"&gt;Gant&lt;/a&gt; may well be the next generation of build tools. I'm not sure that it allows the Unix pipes that Arnold mentions, but it is much closer than Ant will ever be.  (My &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; friends will, no doubt, chime in here.)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;The quote by Gosling&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I love the (paraphrased) quote attributed to Gosling:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-style: italic;"&gt;James Gosling once said that every configuration file becomes a programming language, so you might as well think that way.&lt;/div&gt;&lt;br /&gt;First, I should point out that I have not authenticated this quote, but Arnold is a reputable source, and this seems consistent with &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt;.  Presumably, this was well before 2003, the date of Arnold's post.&lt;br /&gt;&lt;br /&gt;This quote shows the power of philosophy: without knowing it, Gosling  anticipates the success of Rails and Grails over Struts, and to a lesser degree, the possibility of a triumph of Gant over Ant. &lt;br /&gt;&lt;br /&gt;True, this doesn't talk about "convention over configuration" or even web frameworks per se, but it clearly suggests that solutions with static configuration suffer an &lt;span style="font-style: italic;"&gt;asymptotic disadvantage&lt;/span&gt;, compared to solutions with dynamic, programmatic configuration.  The dice are loaded from the start.&lt;br /&gt;&lt;br /&gt;Every time I work with Grails or Gant, I think of this quote.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2033403752865025394?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2033403752865025394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2033403752865025394' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2033403752865025394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2033403752865025394'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/09/fascinating-quote-attributed-to-james.html' title='A fascinating quote attributed to James Gosling'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2296766238162810388</id><published>2008-09-20T09:44:00.000-07:00</published><updated>2008-09-20T09:52:24.760-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny if it weren&apos;t true'/><title type='text'>Quotes from an agile War Room : the anti-project</title><content type='html'>Several developers stand at a white-board, recalling the problems of a previous project.&lt;br /&gt;&lt;br /&gt;One after another, anti-patterns are noted and discussed, involving threading issues, micro-level transaction management, absurdly slow unit tests, and scalability flaws.&lt;br /&gt;&lt;br /&gt;Says one developer, "&lt;span style="font-style: italic;"&gt;Friends, that thing had so many anti-patterns that it was an &lt;span style="font-weight: bold;"&gt;anti-project&lt;/span&gt;&lt;/span&gt;".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2296766238162810388?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2296766238162810388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2296766238162810388' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2296766238162810388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2296766238162810388'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/09/quotes-from-agile-war-room-anti-project.html' title='Quotes from an agile War Room : the anti-project'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-2908549400050653905</id><published>2008-09-15T18:57:00.000-07:00</published><updated>2008-09-15T19:08:21.638-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wake me at Web 3.0'/><title type='text'>Observations of a Surfer (in 2008)</title><content type='html'>Two recent observations that imply that web surfing isn't exactly 'there' yet as a user experience:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Captcha&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I submit a comment to someone's blog, I usually copy my well-crafted, thoughtful comment before running the gauntlet of submit/captcha because I have a subconscious fear, based on hard experience, that things are going to go very, very wrong.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web 2.0 and Ajax&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have a habit of clicking on a window before scrolling, to ensure that it is 'active'.  This was never a problem until all the Ajax stuff: now, that real estate is often a latent feature or gizmo that is just waiting to fire.&lt;br /&gt;&lt;br /&gt;I've become subconsciously &lt;span style="font-style: italic;"&gt;afraid to click&lt;/span&gt; in a browser window: it is a minefield.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Upshot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I don't know what to do with this information.  This may be a silly rant, but it is intended as a sudden realization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-2908549400050653905?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/2908549400050653905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=2908549400050653905' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2908549400050653905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/2908549400050653905'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/09/observations-of-surfer-in-2008.html' title='Observations of a Surfer (in 2008)'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6872927257692762026</id><published>2008-09-12T06:00:00.000-07:00</published><updated>2008-09-12T06:32:15.142-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maintenance'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='top gear'/><title type='text'>Possibly the Best Quote Ever for Code Maintenance</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/KYgwVYPvZYg&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/KYgwVYPvZYg&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;From the brilliant &lt;a href="http://en.wikipedia.org/wiki/Top_Gear_%28current_format%29"&gt;Top Gear&lt;/a&gt; (see 3:00 to 3:30, on this clip of absurd custom limousines):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;It is an ingenious solution for a problem that never should have existed in the first place.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6872927257692762026?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6872927257692762026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6872927257692762026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6872927257692762026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6872927257692762026'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/09/possibly-best-quote-ever-for-code.html' title='Possibly the Best Quote Ever for Code Maintenance'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5427069094580312550.post-6782676244247996541</id><published>2008-09-09T21:03:00.000-07:00</published><updated>2008-09-09T21:52:51.604-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='parody'/><title type='text'>Google releases Giant Hadron Collider</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lfuDZjhLbAM/SMdHvqwTTtI/AAAAAAAAANA/Or2j8qLhX0I/s1600-h/Particle.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_lfuDZjhLbAM/SMdHvqwTTtI/AAAAAAAAANA/Or2j8qLhX0I/s320/Particle.jpg" alt="" id="BLOGGER_PHOTO_ID_5244239175352536786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CtJ Newswire &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Parody City, CA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Sept 9, 2008&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While the scientific community waits in anxious anticipation for the commencement of &lt;a href="http://public.web.cern.ch/Public/Welcome.html"&gt;CERN&lt;/a&gt;, the Large Hadron Collider, insiders report a stunning development:  Google will release their own, open-source particle accelerator.  The project is reputed to be a &lt;span style="font-style: italic; font-weight: bold;"&gt;Giant&lt;/span&gt; Hadron Collider (GHC), a monstrous piece of engineering powered by thousands of V8 engines.  The giant, code-named CHRERN, features 54 km (34 mi) of tunnels, most of which run through the search engine's large, secure data centers over HTTP.&lt;br /&gt;&lt;br /&gt;Many scientists have questioned the need for a rival, upstart effort to mimic the Big Bang, but others feel that it is consistent with Google's philosophy.  Said one insider, "I suspect that Google has already found the Higgs boson (aka God particle) internally, and are developing the GHC for more ambitious applications".&lt;br /&gt;&lt;br /&gt;Claimed another, "it may seem pugnacious at first, but they are basing the GHC on open, scientific standards, and that can only mean good things for science and humanity".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mini Black Holes? Process Isolation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Skeptics wonder if the GHC is even more prone to creating black holes or singularities, threatening the Earth's very &lt;span style="font-style: italic;"&gt;existence&lt;/span&gt;.  "This is highly unlikely, since the architecture of the GHC partitions each singularity into its own multi-dimensional process. So, if a process goes awry, it will not harm the rest of the universe", reported a chief research scientist. She continued: "this is a distinct advantage over other accelerators, which work in the same process as the known universe.  Moreover, it allows concurrent particle acceleration for truly, well, &lt;span style="font-style: italic;"&gt;smashing&lt;/span&gt; throughput."&lt;br /&gt;&lt;br /&gt;Despite all the buzz, there is no word yet if Google plans to explore sub-atomic space with Ad Sense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5427069094580312550-6782676244247996541?l=codetojoy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codetojoy.blogspot.com/feeds/6782676244247996541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5427069094580312550&amp;postID=6782676244247996541' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6782676244247996541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5427069094580312550/posts/default/6782676244247996541'/><link rel='alternate' type='text/html' href='http://codetojoy.blogspot.com/2008/09/google-releases-giant-hadron-collider.html' title='Google releases Giant Hadron Collider'/><author><name>Michael Easter</name><uri>http://www.blogger.com/profile/14799771593145201161</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_lfuDZjhLbAM/SGrshXfZyfI/AAAAAAAAAMY/LOJXUL8B4us/S220/MVC-006F.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_lfuDZjhLbAM/SMdHvqwTTtI/AAAAAAAAANA/Or2j8qLhX0I/s72-c/Particle.jpg' height='72' width='72'/><thr:total>2</thr:total></entry></feed>
