<?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/'><id>tag:blogger.com,1999:blog-12626926</id><updated>2008-05-15T09:43:49.464-07:00</updated><title type='text'>crazybob.org</title><link rel='alternate' type='text/html' href='http://crazybob.org/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>280</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12626926.post-459423520104674072</id><published>2008-05-04T12:07:00.000-07:00</published><updated>2008-05-04T12:08:08.786-07:00</updated><title type='text'>Teyana Taylor - "Google Me"</title><content type='html'>&lt;center&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9axroVxp2qI&amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9axroVxp2qI&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/05/teyana-taylor-google-me.html' title='Teyana Taylor - &quot;Google Me&quot;'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=459423520104674072&amp;isPopup=true' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/459423520104674072'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/459423520104674072'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-4819946983474281412</id><published>2008-05-01T17:42:00.000-07:00</published><updated>2008-05-02T20:53:38.442-07:00</updated><title type='text'>Going to JavaOne? Sign up for Twitter.</title><content type='html'>&lt;p&gt;If you already twitter, feel free to skip to the next section. If you've never heard of Twitter, read on and keep your finger on the pulse of JavaOne.&lt;/p&gt;

&lt;p&gt;&lt;img align="right" src="http://crazybob.org/uploaded_images/twitter-logo-791366.png" border="0" style="margin: 0px 0px 10px 10px"/&gt;
With &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;, you can broadcast short status updates to your followers and receive updates from people who you follow. It's like having one big instant messaging conversation with all of your friends.&lt;/p&gt;

&lt;p&gt;You can access Twitter via SMS. During JavaOne, you can easily keep tabs on your fellow attendees as well as let them know what you're up to, all from just about any cell phone (standard text messaging rates apply).&lt;/p&gt;

&lt;p&gt;For example, if you &lt;a href="http://twitter.com/crazybob"&gt;follow me&lt;/a&gt;, and I text "free beer at Guice BoF!" to Twitter, Twitter will forward the message on to your phone.&lt;/p&gt; 

&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; In addition to following someone, you must also enable "device updates" for that person in order to receive their updates via text and instant message.&lt;/p&gt;

&lt;p&gt;If you don't have unlimited text messaging, you can always access Twitter via the web or one of &lt;a href="http://twitter.pbwiki.com/Apps"&gt;the zillion 3rd party Twitter applications&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;#javaone&lt;/h3&gt;

&lt;p&gt;The Twitter world utilizes an ad hoc tagging system called &lt;i&gt;&lt;a href="http://hashtags.org/"&gt;hashtags&lt;/a&gt;&lt;/i&gt;. It's simple. Tag your JavaOne-related messages by appending "#javaone" to them, and I'll be able to see your update even if I'm not following you yet.

&lt;p&gt;Simply text "track javaone" to Twitter in order to receive any message containing the word &lt;i&gt;javaone&lt;/i&gt; from anyone on Twitter, or &lt;a href="http://summize.com/search?q=%23javaone"&gt;search for "#javaone" on Summize&lt;/a&gt;, a real time Twitter search engine.&lt;/p&gt;

&lt;h3&gt;Follow Me&lt;/h3&gt;

&lt;p&gt;I plan to twitter throughout JavaOne. In addition to &lt;a href="http://twitter.com/crazybob"&gt;following me&lt;/a&gt;, also check out these Java twitterers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://twitter.com/JavaOne2008"&gt;JavaOne&lt;/a&gt; - The conference itself&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/dandiep"&gt;Dan Diephouse&lt;/a&gt; - Mule&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/twleung"&gt;Ted Leung&lt;/a&gt; - Jython&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/spullara"&gt;Sam Pullara&lt;/a&gt; - Yahoo, ex BEA, Gauntlet founder&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/dickwall"&gt;Dick Wall&lt;/a&gt; - The Java Posse&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kebernet"&gt;Robert Cooper&lt;/a&gt; - Author of &lt;i&gt;GWT in Practice&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/robc2"&gt;Roberto Chinnici&lt;/a&gt; - Java EE 6 spec. lead&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/snoopdave"&gt;Dave Johnson&lt;/a&gt; - Blogging Roller&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/dalmaer"&gt;Dion Almaer&lt;/a&gt; - Google code evangelist and founder of Ajaxian.com&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/gbevin"&gt;Geert Bevin&lt;/a&gt; - RIFE, Terracotta&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/smaragdis"&gt;Mary Smaragdis&lt;/a&gt; - Sun marketing director&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/ghohpe"&gt;Gregor Hohpe&lt;/a&gt; - Google, enterprise messaging patterns&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/vanriper"&gt;Van Riper&lt;/a&gt; - Silicon Valley JUG&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/bobmcwhirter"&gt;Bob McWhirter&lt;/a&gt; - JBoss&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/chanezon"&gt;Patrick Chanezon&lt;/a&gt; - Google API evangelist&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/mcannonbrookes"&gt;Mike Cannon-Brookes&lt;/a&gt; - Atlassian founder&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/carlfish"&gt;Charles Miller&lt;/a&gt; - Confluence lead&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/cpurdy"&gt;Cameron Purdy&lt;/a&gt; - Tangosol founder&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/rmisek"&gt;Rob Misek&lt;/a&gt; - Coherence sales dude&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/mikeloukides"&gt;Mike Loukides&lt;/a&gt; - Java editor for O'Reilly&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/LeMec"&gt;Alexandru Popescu&lt;/a&gt; - InfoQ co-founder&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kjetilhp"&gt;Kjetil Paulsen&lt;/a&gt; - JavaZone&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/stuarthalloway"&gt;Stuart Halloway&lt;/a&gt; - Relevance, Inc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/mreinhold"&gt;Mark Reinhold&lt;/a&gt; - Chief Engineer, Java SE&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jstrachan"&gt;James Strachan&lt;/a&gt; - Groovy, ActiveMQ, Latrz, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/kevinb9n"&gt;Kevin Bourrillion&lt;/a&gt; - Guice, Google Collections&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/gafter"&gt;Neal Gafter&lt;/a&gt; - javac, closures&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/dhanji"&gt;Dhanji Prasanna&lt;/a&gt; - Warp, author of Manning's &lt;i&gt;Dependency Injection&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jessewilson"&gt;Jesse Wilson&lt;/a&gt; - Glazed Lists, Guice&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/puredanger"&gt;Alex Miller&lt;/a&gt; - Terracotta&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/euxx"&gt;Eugene Kuleshov&lt;/a&gt; - ASM, Terracotta&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/emmanuelbernard"&gt;Emmanuel Bernard&lt;/a&gt; - Hibernate&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jasoncarreira"&gt;Jason Carreira&lt;/a&gt; - WebWork&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/glaforge"&gt;Guillaume Laforge&lt;/a&gt; - Groovy, Grails&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/sdnjavaone08"&gt;Sun Developer Network @ JavaOne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/fwierzbicki"&gt;Frank Wierzbicki&lt;/a&gt; - Jython&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/headius"&gt;Charles Nutter&lt;/a&gt; - JRuby&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/michaelg"&gt;Michael Galpin&lt;/a&gt; - eBay&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/jkuhnert"&gt;Jesse Kuhnert&lt;/a&gt; - Tapestry&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/ekabanov"&gt;Jevgeni Kabanov&lt;/a&gt; - JavaRebel&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitter.com/samcharrington"&gt;Sam Charrington&lt;/a&gt; - Appistry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'll be twittering from JavaOne and I didn't mention you above, link to your profile from the comments so others can find you.&lt;/p&gt;

&lt;p&gt;Finally, please spread the word about this post and twittering at JavaOne in general. The more people who Twitter from JavaOne, the more fun we'll have!&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/05/going-to-javaone-sign-up-for-twitter.html' title='Going to JavaOne? Sign up for Twitter.'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=4819946983474281412&amp;isPopup=true' title='13 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4819946983474281412'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4819946983474281412'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-686027953056804385</id><published>2008-04-17T14:40:00.000-07:00</published><updated>2008-04-17T15:03:26.938-07:00</updated><title type='text'>The Twubble with Twitter</title><content type='html'>&lt;p&gt;Dion Almaer interviewed me about &lt;a href="http://crazybob.org/twubble"&gt;Twubble&lt;/a&gt; for the Google Developer Podcast:&lt;/p&gt;

&lt;center&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lnxaV8jt_28&amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lnxaV8jt_28&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;

&lt;p&gt;If you use &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;, &lt;a href="http://crazybob.org/twubble"&gt;Twubble&lt;/a&gt; can look at your existing friends' friends and recommend new people for you to follow. It's a stupid simple idea, but I think the execution and fun factor have won people over.&lt;/p&gt;

&lt;p&gt;I wrote Twubble in a couple nights of hacking in bed after the kid went to sleep. I used the latest &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; milestone which supports Java 5 (flawlessly from my experience). I was writing Javascript code (server and client side) for years before I ever got into Java, but I have to say, you'd be crazy to write AJAX apps any other way than GWT nowadays.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://crazybob.org/twubble"&gt;&lt;img src="http://crazybob.org/twubble-screenshot.png" width="405" height="338"&gt;&lt;/a&gt;&lt;/center&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/04/twubble-with-twitter.html' title='The Twubble with Twitter'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=686027953056804385&amp;isPopup=true' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/686027953056804385'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/686027953056804385'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-4963642410909899091</id><published>2008-03-11T13:03:00.000-07:00</published><updated>2008-03-11T19:20:21.328-07:00</updated><title type='text'>Statically Typed Foreword</title><content type='html'>&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FGoogle-Guice-Lightweight-Dependency-Firstpress%2Fdp%2F1590599977%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1205182459%26sr%3D1-1&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;&lt;img src="http://crazybob.org/apress-guice.gif" width="125" height="153" align="right" style="margin-left: 10px"&gt;&lt;/a&gt;Robbie asked me to write a foreword for &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FGoogle-Guice-Lightweight-Dependency-Firstpress%2Fdp%2F1590599977%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1205182459%26sr%3D1-1&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;his upcoming Guice book&lt;/a&gt;. Having never written a foreword before, I Googled, "how to write a foreword," which brought me to two helpful posts from Muse Ink: &lt;i&gt;&lt;a href="http://museinks.blogspot.com/2005/10/foreword-thinking-introduction-to.html"&gt;Foreword Thinking&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href="http://museinks.blogspot.com/2005/10/foreword-march-how-to-write-fantastic_25.html"&gt;Foreword March&lt;/a&gt;&lt;/i&gt;. 

&lt;p&gt;Here's what I came up with:

&lt;blockquote&gt;
&lt;p&gt;I created Guice in the midst of one of the biggest projects of my career. When you have hundreds of engineers touching millions of lines of code, you come to appreciate the benefits of static type checking. Static types aren't just about compiler errors. In fact, I rarely see Java compiler errors nowadays. Thanks to all that great, formalized Java type information, my IDE helps me write correct code in the first place.&lt;/p&gt;

&lt;p&gt;Writing your application in a nearly 100 percent type safe manner, like Guice enables and Robbie advocates in this book, opens the door to a new level of maintainability. You can effortlessly navigate unfamiliar code, jumping from interfaces to their implementation and from methods to their callers. As you master your Java tools, you realize that deceptively simple atomic refactorings combine to form molecular tools, which you can reliably apply to companywide swaths of code, accomplishing refactorings you'd never even consider trying by hand. In the long run, it's much cheaper to ward off bit rot through heavy reuse and constant refactoring than by nuking the world with a rewrite every couple years.&lt;/p&gt;

&lt;p&gt;Having experienced Guice's benefits on a number of projects, we at Google knew we couldn't keep it to ourselves and decided to make it open source. Readying Guice for the outside world felt like it took an order of magnitude more work than writing that first internal version, but community contributors like Robbie who fuel the forums, help polish rough edges, and generate excellent documentation like this book pay back that effort tenfold. You'll find that Robbie's brevity and conversational tone suit Guice well. I like my books like I like my APIs: with high power-to-weight ratios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I focused on static typing because I've gotten a lot of questions about it lately. There's a lot of misinformation out there. For example, &lt;a href="http://blog.jayfields.com/2008/02/static-typing-considered-harmful.html" rel="nofollow"&gt;some people&lt;/a&gt; incorrectly conflate static typing with compiler errors, and, based on that false foundation, they claim that unit testing is an adequate substitute for static typing. 

&lt;p&gt;Static typing and unit tests are orthogonal. Static typing doesn't replace unit tests. Unit tests don't replace static typing. In fact, static typing can make maintaining unit tests much easier, especially when paired with &lt;a href="http://www.easymock.org/index.html"&gt;the right mocking framework&lt;/a&gt;. I certainly believe that scripting languages have their place; beware anyone who tells you that static typing doesn't.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/03/statically-typed-foreword.html' title='Statically Typed Foreword'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=4963642410909899091&amp;isPopup=true' title='19 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4963642410909899091'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4963642410909899091'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-1563180514681075465</id><published>2008-03-10T11:23:00.000-07:00</published><updated>2008-03-12T21:52:59.767-07:00</updated><title type='text'>Thanks for the Jolt!</title><content type='html'>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/crazybob/2321887906/" title="Jolt"&gt;&lt;img src="http://farm4.static.flickr.com/3129/2321887906_55c402cfa2.jpg" width="405" height="270" alt="Jolt" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.drdobbs.com/blog/portal/archives/2008/03/jolt_award_winn.html"&gt;Guice took home the Jolt&lt;/a&gt;, a.k.a. the geek Oscar, at an award ceremony hosted by &lt;a href="http://www.pbs.org/cringely/"&gt;Bob Cringely&lt;/a&gt; during &lt;a href="http://www.sdexpo.com/"&gt;SDWest&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
The Jolt Awards recognize those products, books, and websites that have "jolted" the industry in the past year. Winners are selected by a panel of judges consisting of industry insiders, columnists, and technology leaders.
&lt;/blockquote&gt;

&lt;p&gt;I started reading Dr. Dobb's Journal back when I was 12. I regularly bought it off the newsstand at Oxford books in Atlanta and was lucky to understand one article in the entire magazine. I learned much of what I know by reading instead of going to college, so DDJ has been an invaluable resource for me. I remember greatly admiring the Jolt winners each year. I hardly imagined myself among them, especially so soon.&lt;/p&gt;

&lt;p&gt;The judges picked three productivity winners and one overall Jolt winner from a pool of six finalists in each category. Guice had some stiff competition; other finalists in the &lt;i&gt;Libraries, Frameworks and Components&lt;/i&gt; category included the Eclipse Modeling Project, JasperReports, Qt Jambi, the Spring Framework, and the Zend Framework.  Congratulations to the productivity winners: Eclipse, Zend and JasperReports.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://smallwig.blogspot.com/"&gt;Kevin&lt;/a&gt; and I had the pleasure of accepting the award on stage, but the truth is, Guice 1.0 is heavily indebted to a lot of people. I can't name you all, but I would like to thank:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My wife Krista and daughter Dagny for their support&lt;/li&gt;
&lt;li&gt;The Jolt judges for recognizing our hard work&lt;/li&gt;
&lt;li&gt;Kevin Thompson, our manager at the time who gave me the latitude to work on Guice full time&lt;/li&gt;
&lt;li&gt;My mentors &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FEffective-Java-Second-2nd%2Fdp%2F0321356683%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1205182321%26sr%3D1-2&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Josh Bloch&lt;/a&gt; and &lt;a href="http://gafter.blogspot.com/"&gt;Neal Gafter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cedric and Hani for their treatment of Guice in &lt;i&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FNext-Generation-Java-Testing-Advanced%2Fdp%2F0321503104&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Next Generation Testing&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;The early adopters and contributers who helped steer Guice to 1.0, in random order: Jesse Wilson, Zorzella, Laura Werner, Peter Epstein, Don Brown (Struts 2), Cliff Biffle, Arthur Gleckler&lt;/li&gt;
&lt;li&gt;&lt;a href="http://slesinsky.org/brian/"&gt;Brian Slesinsky&lt;/a&gt;, for his apt analogies, &lt;a href="http://stuffthathappens.com/blog/"&gt;Eric Burke&lt;/a&gt;, for his cartoons, and all the other bloggers who helped popularize Guice&lt;/li&gt;
&lt;li&gt;Robbie for writing &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FGoogle-Guice-Lightweight-Dependency-Firstpress%2Fdp%2F1590599977%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1205182459%26sr%3D1-1&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;a Guice book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dhanji for writing &lt;a href="http://www.manning.com/prasanna/"&gt;a Guice book&lt;/a&gt;, and integrating Guice with Hibernate and JPA in &lt;a href="http://www.wideplay.com/guicewebextensions2"&gt;Warp Persist&lt;/a&gt;
&lt;li&gt;My parents for instilling a strong sense of type safety at an early age (Thanks for the reminder, kebernet.)&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;And finally, I'd like to thank Google for its unparalleled commitment to open source. If you haven't tried Guice yet, &lt;a href="http://code.google.com/p/google-guice/"&gt;now is the time&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/03/thanks-for-jolt.html' title='Thanks for the Jolt!'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=1563180514681075465&amp;isPopup=true' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1563180514681075465'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1563180514681075465'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-2011501516103519803</id><published>2008-01-30T07:28:00.001-08:00</published><updated>2008-01-30T11:57:02.224-08:00</updated><title type='text'>The trouble with Twitter is...</title><content type='html'>When it's down, the first thing you want to do is &lt;a href="http://twitter.com/crazybob"&gt;Twitter about it being down&lt;/a&gt;. I originally wanted to tell Duncan Davidson how much I love &lt;a href="http://duncandavidson.com/"&gt;his site design&lt;/a&gt;. I'm sure it's been that way for awhile, but I normally only see his RSS feed.

&lt;p&gt;I'm also thinking about picking up the second edition of the &lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FCompilers-Principles-Techniques-Tools-2nd%2Fdp%2F0321486811%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1201721727%26sr%3D8-1&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Dragon Book&lt;/a&gt;. I want to learn more about language design and compilers. I know the Dragon Book has it's shortcomings, but I love that the new edition covers JIT compiling and garbage collection, and I'm really just looking for a foundation, not a definitive reference. I can catch up on the latest and greatest via the &lt;a href="http://www.acm.org/"&gt;ACM&lt;/a&gt;.

&lt;p&gt;I guess it would have been hard to fit that into 140 characters anyway.

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; After reading the Amazon customer reviews, I bought &lt;i&gt;&lt;a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2FProgramming-Language-Pragmatics-Second-Michael%2Fdp%2F0126339511%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1201722050%26sr%3D1-1&amp;tag=crazyboborg-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"&gt;Programming Language Pragmatics&lt;/a&gt;&lt;/i&gt; instead.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/01/thing-about-twitter-is.html' title='The trouble with Twitter is...'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=2011501516103519803&amp;isPopup=true' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2011501516103519803'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2011501516103519803'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-628723975310252015</id><published>2008-01-22T18:23:00.000-08:00</published><updated>2008-01-23T09:07:34.508-08:00</updated><title type='text'>In the hot seat</title><content type='html'>I sat down for an interview with Carl Quinn during Javapolis, and &lt;a href="http://parleys.com/display/PARLEYS/Interview+with+Bob+Lee+at+JavaPolis%2707?showComments=true"&gt; the video is now up on parleys.com&lt;/a&gt;. You can also find &lt;a href="http://javaposse.com/index.php?post_id=299505#"&gt;an audio-only podcast version on the Java Posse's web site&lt;/a&gt;. In it, we talk frankly about:

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://parleys.com/display/PARLEYS/Interview+with+Bob+Lee+at+JavaPolis%2707?showComments=true"&gt;&lt;img src="http://parleys.com/download/attachments/6815785/thumbnail1.jpg" style="padding: 10px 0px 10px 10px" align="right" border="0" /&gt;&lt;/a&gt;The history of and philosophy behind Guice, what problems it solves, how we implemented it, the secret sauce in Guice's stellar performance, and how Guice compares to other approaches.&lt;/li&gt;

&lt;li&gt;How we in the Java community need to take a step back and rethink API and framework design after Java 5 and 6. Reflection heavy and convention based Java 1.4 designs won't fly for much longer. Readability doesn't necesarily mean fewer characters. Java 5 made static type safety a reality and introduced explicit meta data. Java 6 lowered the barriers to compile time code generation, but good documentation of these new features is still much needed.&lt;/li&gt;

&lt;li&gt;The future of Guice and dependency injection in general. I'd like to see dependency injection on mobile devices and deeply integrated into Java SE. One day, many of the problems we're solving in a separate framework will be addressed seamlessly by the core platform, and we'll be free of integration headaches and able to focus on higher level abstractions all around.&lt;/li&gt;

&lt;li&gt;&lt;a href="http://code.google.com/p/google-collections/"&gt;Google Collections&lt;/a&gt;, an excellent open source project led by Guice co-lead &lt;a href="http://smallwig.blogspot.com/"&gt;Kevin Bourrillion&lt;/a&gt;. Check it out if you haven't already. Kevin and the rest of the team try to hold the Google Collections to the same standards as the core Java SE Collections, and it shows.

&lt;li&gt;Weak vs. soft references, which you should use, and specifically when not to use soft references.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks again goes to Carl and Stephan and the rest of the BeJUG team. Javapolis was one of the most fun, inspiring, community-oriented conferences I've been to in a long time. Getting back and forth between your hotel and the conference was a little tricky at times, but the venue itself absolutely rocked.&lt;/p&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2008/01/in-hot-seat.html' title='In the hot seat'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=628723975310252015&amp;isPopup=true' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/628723975310252015'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/628723975310252015'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-7223925806839443408</id><published>2007-12-07T10:42:00.000-08:00</published><updated>2007-12-07T10:49:32.313-08:00</updated><title type='text'>Guice @ Javapolis</title><content type='html'>I'm speaking about Guice first thing on Wednesday and JSR 299 Web Beans on Thursday. How should I approach my Guice talk? We already have a &lt;a href="http://crazybob.org/2007/06/introduction-to-guice-video-redux.html"&gt;pretty good video introduction&lt;/a&gt; up on the web. Is it safe to assume enough people understand the basics and dive right into the future of dependency injection? What would you like to hear about?</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/12/guice-javapolis.html' title='Guice @ Javapolis'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=7223925806839443408&amp;isPopup=true' title='9 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7223925806839443408'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7223925806839443408'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-3433575267865443534</id><published>2007-11-11T11:39:00.000-08:00</published><updated>2007-11-12T08:41:57.165-08:00</updated><title type='text'>I dream of electric sheep.</title><content type='html'>&lt;img src="http://www.openhandsetalliance.com/images/android_robot.gif" width="125" height="137" align="right"&gt;
In roughly 24 hours, we'll release the &lt;a href="http://code.google.com/android/"&gt;Android SDK&lt;/a&gt;, and I'll finally be able to talk about what I work on. My phone will be one (big) step closer to freedom. Wish us luck!

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; &lt;a href="http://code.google.com/android/"&gt;It's alive!&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/11/i-dream-of-electric-sheep.html' title='I dream of electric sheep.'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=3433575267865443534&amp;isPopup=true' title='9 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3433575267865443534'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3433575267865443534'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-6713470184878417975</id><published>2007-10-16T14:18:00.000-07:00</published><updated>2007-10-16T16:41:46.771-07:00</updated><title type='text'>Why Guice?</title><content type='html'>&lt;center&gt;&lt;img src="http://crazybob.org/uploaded_images/tss-interview-752529.png" width="320" height="239"/&gt;&lt;/center&gt;

&lt;p&gt;TheServerSide just posted &lt;a href="http://www.theserverside.com/talks/index.tss"&gt;a video interview they recorded in May shortly after the Guice 1.0 release&lt;/a&gt;. Since then, I've had ample time to chew over what I like so much about Guice and hone my thoughts on dependency injection in general.

&lt;p&gt;Being a fan of plain old Java, before I wrote Guice, existing dependency injection frameworks were non-starters for me. I'd sooner write factories by hand than keep XML in sync with my classes or embed method names in strings. I mean, if you don't have type safety, all of that extra typing really is for naught, and you might as well switch to Ruby. Furthermore, a programmer shouldn't have to fire up a debugger or even think too hard in order to figure out what her code is doing. I felt the same way about mocking frameworks until &lt;a href="http://www.easymock.org/"&gt;EasyMock&lt;/a&gt; pioneered their &lt;a href="http://smallwig.blogspot.com/2007/03/by-way-what-does-extraordinarily.html"&gt;extraordinarily typesafe&lt;/a&gt; approach.

&lt;p&gt;Before Guice, I had to make the same up-front decision over and over: do I call a constructor directly, or do I write a factory and call it instead? If you start out calling a constructor and later decide that you need a factory, you have to go back and change all the callers. On the other hand, factories come at a cost: they clutter your API and result in a bunch of boilerplate code which you have to both write and maintain. In practice, if the only reason you  need a factory is to enable testing, most programmers will forgo the factory, testing be damned.

&lt;p&gt;Guice provides the best of both worlds and finally enables agile programming in Java. Injecting an object requires roughly the same amount of effort as calling a constructor. If you decide later on that you need more abstraction, write a factory and change your code in one place; there's no need to change all the callers. If you're providing code to someone else, give them a bunch of interfaces and a Guice module. They can test their code, you can change how you create objects to your heart's content without impacting your users, and your API will be smaller to boot. As you can probably tell from Guice, I love &lt;a href="http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/package-summary.html"&gt;small, interface-heavy APIs&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/10/guice-interview-on-tss.html' title='Why Guice?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=6713470184878417975&amp;isPopup=true' title='9 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/6713470184878417975'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/6713470184878417975'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-5305795363157089413</id><published>2007-09-26T23:54:00.000-07:00</published><updated>2007-09-27T00:02:54.889-07:00</updated><title type='text'>Tax-Free Guice</title><content type='html'>&lt;a href="http://stuffthathappens.com/blog/2007/09/26/comic-tribute-to-crazy-bob/"&gt;&lt;img src="http://stuffthathappens.com/blog/wp-content/uploads/2007/09/continuous-tax.png" width="440" height="440"&gt;&lt;/a&gt;
&lt;p&gt;I'm speechless. Thanks, &lt;a href="http://stuffthathappens.com/blog/2007/09/26/comic-tribute-to-crazy-bob/"&gt;Eric&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/tax-free-guice.html' title='Tax-Free Guice'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=5305795363157089413&amp;isPopup=true' title='7 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5305795363157089413'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5305795363157089413'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-8112899082056201119</id><published>2007-09-18T12:30:00.000-07:00</published><updated>2007-09-18T12:37:42.366-07:00</updated><title type='text'>Silicon Valley JUG @ Google Tonight</title><content type='html'>Swing by, and say hello.

&lt;p&gt;&lt;b&gt;Topic:&lt;/b&gt; Improving your Code with Objects and Aspects&lt;br&gt;
&lt;b&gt;Speaker:&lt;/b&gt; &lt;a href="http://www.chrisrichardson.net"&gt;Chris Richardson&lt;/a&gt;&lt;br&gt;
&lt;b&gt;Agenda:&lt;/b&gt; Snacking and mingling from 6:30 to 7, presentation from  7 to 8:30&lt;br&gt;
&lt;b&gt;Location:&lt;/b&gt; Google Inc., &lt;a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;q=1600+Amphitheatre+parkway,+mountain+view,+ca&amp;sll=37.0625,-95.677068&amp;sspn=31.426353,59.765625&amp;layer=&amp;ie=UTF8&amp;z=16&amp;ll=37.424196,-122.086494&amp;spn=0.007685,0.021629&amp;om=1&amp;iwloc=addr"&gt;Tunis Conference Room (Bldg. 43)&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/silicon-valley-jug-google-tonight.html' title='Silicon Valley JUG @ Google Tonight'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=8112899082056201119&amp;isPopup=true' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8112899082056201119'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8112899082056201119'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-3171026144075120826</id><published>2007-09-18T12:23:00.000-07:00</published><updated>2007-09-18T12:38:52.354-07:00</updated><title type='text'>Gavin King on ActiveRecord</title><content type='html'>&lt;p&gt;Referring to this &lt;code&gt;ActiveRecord&lt;/code&gt; example:

&lt;pre&gt;
class Person &lt; ActiveRecord::Base  
   belongs_to :company  
end

class Company &lt; ActiveRecord::Base  
   has_many :people  
end
&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://in.relation.to/Bloggers/MoreXMLThanCode"&gt;Gavin says&lt;/a&gt;:

&lt;blockquote&gt;
&lt;p&gt;
At this point, most developers are thinking &lt;q&gt;um, ok, so how the hell am I supposed to know what attributes a &lt;tt&gt;Company&lt;/tt&gt; has by looking at my code? And how can my IDE auto-complete them?&lt;/q&gt; Of course, the Rails folks have a quick answer to this question &lt;q&gt;Oh, just fire up your database client and look in the database!&lt;/q&gt;. Then, assuming that you know ActiveRecord's automagic capitalization and pluralization rules &lt;i&gt;perfectly&lt;/i&gt;, you will be able to guess the names of the attributes of your own &lt;tt&gt;Company&lt;/tt&gt; class, and type them in manually.
&lt;/p&gt;

&lt;p&gt;
Somehow, excitement about the Ruby language has warped their perceptions to such an extent that these people actually believe that this is a &lt;i&gt;good thing&lt;/i&gt;!
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Couldn't have said it better myself.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/gavin-king-on-activerecord.html' title='Gavin King on ActiveRecord'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=3171026144075120826&amp;isPopup=true' title='41 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3171026144075120826'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3171026144075120826'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-2967043949399414958</id><published>2007-09-14T13:57:00.000-07:00</published><updated>2007-09-14T14:00:01.563-07:00</updated><title type='text'>Treader Supports del.icio.us</title><content type='html'>After installing &lt;a href="http://userscripts.org/scripts/show/12198"&gt;Treader&lt;/a&gt;, you could already post to Twitter directly from Google Reader by hitting Shift+T. Now, you can hit Shift+D to bookmark an entry in del.icio.us, too.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/treader-supports-delicious.html' title='Treader Supports del.icio.us'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=2967043949399414958&amp;isPopup=true' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2967043949399414958'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2967043949399414958'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-19135828487458273</id><published>2007-09-14T07:44:00.000-07:00</published><updated>2007-09-14T10:10:48.381-07:00</updated><title type='text'>Why reinvent the wheel?</title><content type='html'>Why indeed? I'm not a big fan of the question, "Why reinvent the wheel?" It's what you call an &lt;a href="http://www.nizkor.org/features/fallacies/appeal-to-tradition.html"&gt;Appeal to Tradition&lt;/a&gt;, "a fallacy that occurs when it is assumed that something is better or correct simply because it is older, traditional, or 'always has been done.'" 

&lt;p&gt;Depending on the context, you can almost always replace "Why reinvent the wheel?" with "Please don't compete with me," or "Please don't make me learn something new." Either way, the opponent doesn't have a real argument against building something newer and better, but they also don't want to admit their unhealthy motivations for trying to stop you.

&lt;p&gt;More seeds, more blooms, I say. Don't build houses on kitchen sinks. Reinvent away. Most of our current technology sucks, and even if it didn't, who am I to try and stop you?</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/why-reinvent-wheel.html' title='Why reinvent the wheel?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=19135828487458273&amp;isPopup=true' title='7 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/19135828487458273'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/19135828487458273'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-4248619552327710274</id><published>2007-09-13T22:58:00.000-07:00</published><updated>2007-09-13T23:14:30.208-07:00</updated><title type='text'>Roof of The Royal Orleans</title><content type='html'>My mom just sent me this picture of my brother and me from when we were kids. We used to go to New Orleans every year, and the Easter bunny always managed to find us. Notice who's looking through the right end.

&lt;p&gt;&lt;center&gt;&lt;a href="http://www.flickr.com/photos/crazybob/1376901827/"&gt;&lt;img src="http://farm2.static.flickr.com/1058/1376901827_18cfea1dfd.jpg" width="400" height="269" alt="Royal Orleans" /&gt;&lt;/a&gt;&lt;/center&gt;</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/roof-of-royal-orleans.html' title='Roof of The Royal Orleans'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=4248619552327710274&amp;isPopup=true' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4248619552327710274'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4248619552327710274'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-5849860866904304695</id><published>2007-09-11T17:46:00.000-07:00</published><updated>2007-09-11T18:51:12.957-07:00</updated><title type='text'>Treader: Twitter directly from Google Reader</title><content type='html'>I love &lt;a href="http://www.google.com/reader/shared/user/07248529942124281245/state/com.google/broadcast"&gt;my Google Reader shared items&lt;/a&gt;, but when I want to add a little commentary, I post a link to &lt;a href="http://twitter.com/crazybob"&gt;Twitter&lt;/a&gt;. I created a Greasemonkey script named &lt;i&gt;Treader&lt;/i&gt; to streamline the process.

&lt;p&gt;In Google Reader, I select the entry I want to twitter and then hit Shift+T. Treader pops up a prompt pre-filled with the entry name and link.

&lt;center&gt;&lt;img width="400" height="286" src="http://crazybob.org/uploaded_images/treader-721622.png" /&gt;&lt;/center&gt;

&lt;p&gt;I just edit the twitter to my liking, and hit OK. Treader posts it in the background using Twitter's API. I never have to leave Google Reader.

&lt;p&gt;To try it for yourself:
  &lt;ol&gt;
    &lt;li&gt;Install &lt;a href="http://www.greasespot.net/"&gt;Greasemonkey&lt;/a&gt; if you haven't already. Greasemonkey requires Firefox. &lt;/li&gt;
    &lt;li&gt;Install &lt;a href="http://crazybob.org/treader.user.js"&gt;Treader&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;Reload Google Reader, select an entry you want to share,  and then hit Shift+T. It will ask you to log into Twitter the first time through.&lt;/li&gt;
  &lt;/ol&gt;
    
&lt;p&gt;Thanks to &lt;a href="http://blog.persistent.info/"&gt;Mihai&lt;/a&gt; for helping me work out the kinks.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/treader-twitter-directly-from-google.html' title='Treader: Twitter directly from Google Reader'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=5849860866904304695&amp;isPopup=true' title='8 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5849860866904304695'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5849860866904304695'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-1300881872103126077</id><published>2007-09-06T07:17:00.000-07:00</published><updated>2007-09-06T07:59:49.514-07:00</updated><title type='text'>Temporary Twitters</title><content type='html'>&lt;p&gt;Twitter is still down for upgrades. It was only supposed to be down for 2.5 hours at midnight.

&lt;p&gt;OMFG! Reader has search!

&lt;p&gt;With well over 400 feeds, keeping up with Google Reader could literally be a full time job.

&lt;p&gt;The iPod Touch looks fun, but I think the new iPod Nano fits us best.

&lt;p&gt;Finally making headway on Guice's introspection API. Get ready for some awesome tools.

&lt;p&gt;Is TechCrunch turning into Valleywag?

&lt;p&gt;I rewrote &lt;a href="http://code.google.com/p/google-guice/"&gt;the Guice home page&lt;/a&gt;.

&lt;p&gt;Can't wait to see what Twitter has in store for us.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/09/temporary-twitters.html' title='Temporary Twitters'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=1300881872103126077&amp;isPopup=true' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1300881872103126077'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1300881872103126077'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-1130570354526151571</id><published>2007-08-27T19:20:00.000-07:00</published><updated>2007-08-27T19:46:07.877-07:00</updated><title type='text'>Restore My Faith In Humanity</title><content type='html'>&lt;center&gt;&lt;a href="http://www.flickr.com/photos/crazybob/1254292854/"&gt;&lt;img src="http://farm2.static.flickr.com/1102/1254292854_89e4ffb679.jpg" width="400" height="266" alt="Greg"/&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Our good friend &lt;a href="http://www.lyra.org/greg/"&gt;Greg Stein&lt;/a&gt;, who was already dealing with a broken leg, fell victim to a violent mugging Friday night on the mean streets of Mountain View. Having parted ways with him only moments earlier, we were dumbstruck to say the least. He's going to be OK, but a little cheering up can't hurt. 

&lt;p&gt;Let's offset the bad karma with some good. &lt;a href="http://feedblog.org/2007/08/27/greg-stein-director-of-the-apache-software-foundation-was-mugged-accepting-donations/"&gt;Kevin Burton is accepting donations&lt;/a&gt;. A small portion of the proceeds will go toward sending Greg to a spa for a weekend of relaxation and recovery, and the rest will go to the &lt;a href="http://apache.org/"&gt;ASF&lt;/a&gt;, an organization to which Greg himself donates a great deal of time.

&lt;p&gt;Chicks dig scars, Greg.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/restore-my-faith-in-humanity.html' title='Restore My Faith In Humanity'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=1130570354526151571&amp;isPopup=true' title='4 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1130570354526151571'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1130570354526151571'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-6058583767616281831</id><published>2007-08-26T10:42:00.000-07:00</published><updated>2007-08-26T11:45:07.713-07:00</updated><title type='text'>The Mechanics of Photo Attribution</title><content type='html'>James has been &lt;a href="http://duncandavidson.com/archives/573"&gt;blogging about how to give credit for photos you use on your web site&lt;/a&gt;. I agree 100%--you should give credit in a caption next to the photo, not hidden behind a link. Unfortunately, many authors simply don't use captions at all (let alone for giving credit) because doing so is too damned hard. 

&lt;p&gt;For example, I just clicked the "add image" button in Blogger; it doesn't have a box for a caption. I'll send a note to the Blogger team, but we should all encourage content management systems (Wikipedia included) to provide captioning features and make it easy for their users to do the right thing.

&lt;p&gt;Even if you know a bit of HTML and want to go the extra mile despite your CMS, adding a caption is not as easy as:

&lt;pre&gt;&amp;lt;img src="..." caption="Photo by Duncan Davidson"&gt;&lt;/pre&gt; 

&lt;p&gt;In the olden days before CSS, you had to use HTML tables to lay out captions:

&lt;pre&gt;
&amp;lt;table&gt;
&amp;lt;tr&gt;&amp;lt;td&gt;&amp;lt;img ...&gt;&amp;lt;/td&gt;&amp;lt;/tr&gt;
&amp;lt;tr&gt;&amp;lt;td&gt;Photo by Duncan Davidson&amp;lt;/td&gt;&amp;lt;/tr&gt;
&amp;lt;/table&gt;
&lt;/pre&gt;

But you couldn't float a table inline like you could an image.

&lt;p&gt;CSS opened the door to inline photos with captions, but getting the layout right can still be tricky. &lt;a href="http://www.cs.tut.fi/~jkorpela/www/captions.html"&gt;This site explores the various methods for adding captions using plain HTML and CSS&lt;/a&gt;.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/mechanics-of-photo-attribution.html' title='The Mechanics of Photo Attribution'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=6058583767616281831&amp;isPopup=true' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/6058583767616281831'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/6058583767616281831'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-9182759159181041641</id><published>2007-08-23T18:51:00.000-07:00</published><updated>2007-08-23T19:04:57.400-07:00</updated><title type='text'>Got Guice on your resume?</title><content type='html'>It could help you get a job at &lt;a href="http://www.zillow.com/"&gt;Zillow&lt;/a&gt; (not to mention &lt;a href="http://www.google.com/intl/en/jobs/"&gt;Google&lt;/a&gt;). &lt;a href="http://www.itpd.eu/senior-software-development-engineer-in-seattle-wa-zillow-com"&gt;This Zillow job description&lt;/a&gt; calls for, "experience with Java technologies such as Servlets, JDBC, Tapestry, build tools like Maven and Ant, dependency injection frameworks like Spring or &lt;b&gt;Guice&lt;/b&gt;." It's not ground breaking news or anything, but this is a first for Guice.

&lt;p&gt;I literally spent all day in a JSR 299 (Web Beans) meeting. It was exhausting but fruitful. This morning, I was skeptical that it was even possible for the injection approaches of Guice and Seam to coexist. Now, I'm almost excited (as excited as you can be about anything J2EE-related).</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/got-guice-on-your-resume.html' title='Got Guice on your resume?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=9182759159181041641&amp;isPopup=true' title='6 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/9182759159181041641'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/9182759159181041641'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-6950382592308680808</id><published>2007-08-21T12:49:00.000-07:00</published><updated>2007-08-21T14:33:40.006-07:00</updated><title type='text'>SSH Misinformation</title><content type='html'>Dave Dribin &lt;a href="http://www.dribin.org/dave/blog/archives/2007/08/21/ssh_agent/"&gt;insists you must use ssh-agent and pass phrases for private keys&lt;/a&gt;, just in case someone gets access to your account, the assumption being that someone won't be able to access your remote machines because they don't know your password.

&lt;p&gt;If someone gets access to my account, they won't have any trouble stealing my password and getting into my remote machines anyway. What's worse is ssh-agent can make you less not more secure. It forwards a connection to each machine you log into; anyone with root privileges on these machines can access your private keys.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/ssh-misinformation.html' title='SSH Misinformation'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=6950382592308680808&amp;isPopup=true' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/6950382592308680808'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/6950382592308680808'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-5468347193093748560</id><published>2007-08-16T00:04:00.001-07:00</published><updated>2007-08-16T00:46:45.549-07:00</updated><title type='text'>Javascript vs. C++</title><content type='html'>&lt;p&gt;I learned C++ recently, so when I saw &lt;a href="http://peter.michaux.ca/article/3556"&gt;this Javascript singleton variant&lt;/a&gt; making the rounds:

&lt;pre&gt;
var foo = function() {
  var t = new Date();
  foo = function() {
    return t;
  };
  return foo();
};
&lt;/pre&gt;

&lt;p&gt;...it struck me how much more concise the equivalent C++ solution is:

&lt;pre&gt;
static Date* foo() {
  static Date t;
  return &amp;t;
}
&lt;/pre&gt;

&lt;p&gt;I do wonder why the author of the Javascript example returns &lt;code&gt;foo()&lt;/code&gt; intead of &lt;code&gt;t&lt;/code&gt;; it seems like the latter is more straightforward and semantically the same.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/javascript-vs-c.html' title='Javascript vs. C++'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=5468347193093748560&amp;isPopup=true' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5468347193093748560'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5468347193093748560'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-7367591029160220880</id><published>2007-08-15T09:45:00.000-07:00</published><updated>2007-08-15T09:54:02.290-07:00</updated><title type='text'>Users vs. Programmers</title><content type='html'>&lt;a href="http://www.scripting.com/stories/2007/08/15/atomIsNotBetterAndUsersDon.html"&gt;Dave's answer&lt;/a&gt; to, "Atom is better," is, "users don't care." Given the fact that users don't care about the feed format, why not do what's best for the programmers? In this case: Atom.

&lt;p&gt;APIs do matter. I'm tired of people trying to use successful end products to validate bad API designs. If the API is better, the end product will be more maintainable.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/users-vs-programmers.html' title='Users vs. Programmers'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=7367591029160220880&amp;isPopup=true' title='7 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7367591029160220880'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7367591029160220880'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-5893685541901348923</id><published>2007-08-12T09:21:00.000-07:00</published><updated>2007-08-22T14:15:29.000-07:00</updated><title type='text'>Firefox Hangs on OS X</title><content type='html'>If you experience Firefox hangs on OS X like &lt;a href="http://www.oreillynet.com/onlamp/blog/2007/08/is_firefox_on_mac_unusable.html"&gt;this guy&lt;/a&gt;, use &lt;a href="http://en.wikipedia.org/wiki/Apple_Developer_Tools#Spin_Control"&gt;Spin Control&lt;/a&gt; to pinpoint the cause. Spin Control detects hung applications and captures stack traces. I assume they named it Spin Control in honor of the spinning beach ball of death.

&lt;p&gt;I've personally experienced hangs as long as a minute on various computers. Slow DNS lookups always seem to be the culprit. Until someone fixes Firefox so it doesn't completely lock up, your best bet is to prevent slow DNS lookups.

&lt;p&gt;In some cases, my VPN connection ended non-gracefully and left my DNS configuration in a bad state, i.e. OS X still tries to connect to the DNS servers on the private network even though I'm no longer connected, and Firefox hangs until the connection times out. An easy solution is to switch network locations thereby resetting your configuration to a good state.

&lt;p&gt;If you still experience problems, you might try switching DNS servers or even &lt;a href="http://www.macosxhints.com/article.php?story=20050420025219402"&gt;installing a local DNS server&lt;/a&gt;. I haven't needed to try the latter just yet.

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; I finally broke down and enabled the local DNS server. I followed &lt;a href="http://www.macosxhints.com/article.php?story=20050420025219402"&gt;the instructions from &lt;i&gt;Mac OS X Hints&lt;/i&gt;&lt;/a&gt;. Many of the comments claim the hint won't work, but it worked great for me. I went from frequent 3 to 4 second hangs to no hangs at all according to Spin Control.</content><link rel='alternate' type='text/html' href='http://crazybob.org/2007/08/firefox-hangs-on-os-x.html' title='Firefox Hangs on OS X'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12626926&amp;postID=5893685541901348923&amp;isPopup=true' title='8 Comments'/><link rel='replies' type='application/atom+xml' href='http://crazybob.org/roller/rss/crazybob' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5893685541901348923'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/5893685541901348923'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email></author></entry></feed>