<?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:blogger='http://schemas.google.com/blogger/2008' 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-12626926</id><updated>2026-04-10T00:25:21.326-07:00</updated><category term="blog"/><category term="politics"/><category term="scoble"/><title type='text'>crazybob.org</title><subtitle type='html'>Bob Lee&#39;s Blog - Java and some occasional baby making</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.crazybob.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default?start-index=26&amp;max-results=25'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>296</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12626926.post-4718768754333334082</id><published>2011-12-10T12:45:00.001-08:00</published><updated>2011-12-11T09:38:57.613-08:00</updated><title type='text'>The truth about Android &amp; iOS UI performance</title><content type='html'>Some fallacies related to Android vs. iOS UI performance made the rounds recently, inflicting undue damage to Android&#39;s reputation. It all started with &lt;a rel=&quot;nofollow&quot; href=&quot;https://plus.google.com/u/1/100838276097451809262/posts/VDkV9XaJRGS&quot;&gt;a misinformed Google+ update&lt;/a&gt; written by &lt;a rel=&quot;nofollow&quot; href=&quot;http://www.linkedin.com/in/andrewmunn&quot;&gt;former Android testing intern Andrew Munn&lt;/a&gt;.

&lt;p&gt;Time reporter Matt Peckham &lt;a rel=&quot;nofollow&quot; href=&quot;http://techland.time.com/2011/12/07/is-android-doomed-to-lag-more-than-ios/&quot;&gt;echoed Andrew&#39;s misconceptions&lt;/a&gt; the following day, further spreading the &lt;a href=&quot;http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt&quot;&gt;FUD&lt;/a&gt; about Android. Toward the end of his article, Matt noted:

&lt;blockquote&gt;I’m not an Android or iOS software engineer, so all I can say in response to any of this is that, assuming Munn’s correctly articulated the way rendering takes places on Android and iOS devices, it makes sense (but then so does the idea that Lee Harvey Oswald had help, at least to some people).&lt;/blockquote&gt;

&lt;p&gt;Peckham makes no mention of trying to corroborate Munn&#39;s claims with a more experienced, knowledgeable engineer, like Romain or Dianne from the Android team, nor does he reference the corrections made by iOS experts in the comments on Munn&#39;s post. A more qualified engineer would support their theories with evidence like code, specifications, and performance test results, not Reddit and Hacker News comments as Munn did.

&lt;p&gt;I don&#39;t claim to have all the answers, but I can tell you that implementing fluid interfaces on both iOS and Android is time consuming and difficult. The challenges are an order of magnitude more complex than Munn suggests. I haven&#39;t had an opportunity to try Ice Cream Sandwich yet, so I can&#39;t tell you firsthand how it compares to the iPhone. However, Jason Kincaid, quoted by Munn, described ICS as quite smooth and noted that both Android and iOS stutter occasionally.

&lt;p&gt;Now that Android has pervasive hardware acceleration, Android has no fundamental technical disadvantage compared to iOS with regard to to implementing fluid UIs. Given comparable hardware, any UI that runs smoothly on iOS should be able to run just as smoothly on Android. That said, hardware acceleration isn&#39;t a magic switch that you can just turn on. Android developers need to modify their applications to take full advantage, just like iOS developers have to design their own applications with hardware acceleration in mind. This will take time.

&lt;p&gt;To Munn&#39;s point, &quot;UI thread&quot; and &quot;main thread&quot; mean the same thing. Most user interface frameworks, including those employed by iOS and Android, have a notion of receiving input events and manipulating the user interface from a single thread. Users of those frameworks often use the terms &quot;UI thread&quot; and &quot;main thread&quot; interchangeably. Why impose this restriction? If you limit access to UI elements to a single thread, you simplify API usage and improve performance because you don&#39;t have to deal with locks and concurrency. Contrary to Munn&#39;s claims, Android does actually assign a higher scheduling priority to the UI thread than it does to background threads. I assume iOS does likewise.

&lt;p&gt;Android and iOS are more alike than different in this respect. Either platform will hang and stop responding to user input if you monopolize the main thread with blocking operations (like file I/O) or slow drawing logic. This likely explains why Jason experiences jitters when visiting global search on iOS. On both platforms, programmers should perform all blocking operations on background threads and should never block the main thread.

&lt;p&gt;As for the differences, iOS&#39;s Core Animation framework tweens animations in a background thread while Android does the same in the main thread. On iOS animations continue running, even when the application accidentally blocks the main thread. In addition, when scrolling, iOS&#39;s main thread goes into a &quot;tracking&quot; mode where it filters out certain types of events that might result in redrawing or other performance degradations. This has no affect on background operations. Nothing technically prevents Android from supporting these features, but their absence doesn&#39;t preclude smooth UIs on Android either. Hardware acceleration is far more important.

&lt;p&gt;Does this mean we&#39;re going to start seeing iOS-quality user interfaces across the board on Android in the near future? No way. The reasons have little to nothing to do with bytecode or garbage collectors and everything to do with the community and tools. First, iOS app developers have far more experience taking advantage of hardware acceleration. They&#39;re experts in going out of the way to avoid software rendering. Hardware rendering requires a different mindset, and Android programmers will need time to catch up.

&lt;p&gt;Second, Android programmers need to support both software and hardware rendering for awhile. This requires more code. Some Android devices support only software rendering while others, like the Xoom, actually require hardware rendering to achieve any semblance of smooth animation. Developing and maintaining smooth Android apps will require significantly more developer resources than accomplishing the same on iOS, at least until we can retire support for pre-Honeycomb devices. Programmers with limited resource will no doubt have to elide animations and settle for lowest common denominator solutions for awhile.

&lt;p&gt;Third, from what I&#39;ve seen, iOS developers have far better tools at their disposal. iOS developers can tweak and reload their applications in seconds, faster than you can reload a Ruby on Rails web page, while Android developers are lucky to do the same in tens of seconds. Being able to quickly iterate and tweak a UI is essential to achieving pixel-perfect, high frame rate animations. If Android programmers need to wait up to a minute after each tweak, they&#39;ll be at a significant disadvantage compared to their iOS counterparts. iOS provides amazing tools that overlay their UIs and help pinpoint and eliminate software rendering. In contrast, the UI performance and bugs in Android&#39;s emulator are so bad that developers resort to running on real devices only, even during development.

&lt;p&gt;Android&#39;s training and legacy support issues will resolve themselves eventually. If I ran the Android team, I&#39;d triple down on tool support. Android&#39;s emulator sounds great in theory, but it fails spectacularly in practice. Professional Android programmers simply can&#39;t and don&#39;t use it. Frankly, the emulation model is a lost cause. Android should replace it with an iOS-like simulator, one with tightly integrated profiling tools, capable of building and displaying apps in seconds. Ideally, the development build process would further cut down the turnaround time by eliding resource compilation, dex conversion, etc.

&lt;p&gt;In the meantime, Android developers can achieve buttery user interfaces on Honeycomb and ICS devices, just like their iOS equivalents, by eliminating blocking operations from the main thread, minimizing time spent drawing in software, and allocating objects judiciously. Android programmers just have to work a little longer and harder to get there. Given our fierce dedication to a flawless user experience, &lt;a href=&quot;https://squareup.com/&quot;&gt;my team&lt;/a&gt; plans to invest the necessary resources and accomplish just that. If you think you&#39;re up to the challenge, please &lt;a href=&quot;https://squareup.com/jobs/oLYtVfwR&quot;&gt;apply&lt;/a&gt;.

&lt;p&gt;For additional reading, &lt;a href=&quot;https://plus.google.com/u/1/105051985738280261832/posts/XAZ4CeVP6DC&quot;&gt;Dianne has done a wonderful job&lt;/a&gt; explaining why the Android team made the choices they did and how those choices enabled some unique advantages over iOS.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/4718768754333334082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2011/12/truth-about-android-ios-ui-performance.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4718768754333334082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4718768754333334082'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2011/12/truth-about-android-ios-ui-performance.html' title='The truth about Android &amp; iOS UI performance'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-4254482470705691542</id><published>2011-11-15T18:12:00.000-08:00</published><updated>2011-11-15T18:14:34.725-08:00</updated><title type='text'>Coding Challenge: The Luhny Bin</title><content type='html'>&lt;p&gt;&lt;i&gt;&lt;b&gt;Note:&lt;/b&gt; This is cross posted from &lt;a href=&quot;http://corner.squareup.com/2011/11/luhny-bin.html&quot;&gt;Square&#39;s engineering blog&lt;/a&gt;. Please submit comments over there.&lt;/i&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;To err is human; to forgive, divine.&amp;#8221; -Alexander Pope&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mistakes happen. At Square, we accept that human error is inevitable. We anticipate potential slip-ups and implement safety measures to mitigate&amp;#8212;and oftentimes completely eliminate&amp;#8212;any repercussions.&lt;/p&gt;

&lt;p&gt;For example, Square&amp;#8217;s Luhn filter monitors logs and masks anything that looks like a credit card number. If a number like &amp;#8220;4111 1111 1111 1111&amp;#8221; were accidentally logged as part of an error message, our filter would replace it with &amp;#8220;XXXX XXXX XXXX XXXX&amp;#8221; and page an on call engineer.&lt;/p&gt;

&lt;p&gt;The Luhn filter looks for sequences of digits that pass &lt;a href=&#39;http://en.wikipedia.org/wiki/Luhn_algorithm&#39;&gt;the Luhn check&lt;/a&gt;, a simple checksum algorithm invented by Hans Peter Luhn in 1954. All valid credit card numbers pass the Luhn check, thereby enabling computer programs, like our log filter, to distinguish credit card numbers from random digit sequences.&lt;/p&gt;

&lt;p&gt;The Luhn check works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Starting from the &lt;em&gt;rightmost&lt;/em&gt; digit and working left, double every second digit.&lt;/li&gt;

&lt;li&gt;If a product has two digits, treat the digits independently.&lt;/li&gt;

&lt;li&gt;Sum each individual digit, including the non-doubled digits.&lt;/li&gt;

&lt;li&gt;Divide the result by 10.&lt;/li&gt;

&lt;li&gt;If the remainder is 0, the number passed the Luhn check.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, &amp;#8220;5678&amp;#8221; passes the Luhn check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Double every other digit: 10, 6, 14, 8&lt;/li&gt;

&lt;li&gt;Sum the individual digits: (1 + 0) + 6 + (1 + 4) + 8 = 20&lt;/li&gt;

&lt;li&gt;Divide the result by 10: 20 mod 10 = 0 &lt;b&gt;&lt;font color=&#39;green&#39;&gt;Pass&lt;/font&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;#8220;6789&amp;#8221; does not:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Double every other digit: 12, 7, 16, 9&lt;/li&gt;

&lt;li&gt;Sum the individual digits: (1 + 2) + 7 + (1 + 6) + 9 = 26&lt;/li&gt;

&lt;li&gt;Divide the result by 10: 26 mod 10 != 0 &lt;b&gt;&lt;font color=&#39;red&#39;&gt;Fail&lt;/font&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Now for the challenge&amp;#8230;&lt;/h3&gt;

&lt;p&gt;Write a command line program that reads ASCII text from standard input, masks sequences of digits that look like credit card numbers, and writes the filtered text to standard output. For the purposes of this challenge, a credit card number:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consists of digits, spaces (&lt;code&gt;&amp;#39; &amp;#39;&lt;/code&gt;) and hyphens (&lt;code&gt;&amp;#39;-&amp;#39;&lt;/code&gt;).&lt;/li&gt;

&lt;li&gt;Has between 14 and 16 digits, inclusive.&lt;/li&gt;

&lt;li&gt;Passes the Luhn check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a sequence of digits looks like a credit card number, replace each digit with an &lt;code&gt;&amp;#39;X&amp;#39;&lt;/code&gt;. Any characters, including digits, may flank a credit card number. &lt;em&gt;Beware.&lt;/em&gt; Potential credit card numbers can overlap. A valid 16-digit number can even contain a valid 14 or 15-digit number. Your program must mask every digit.&lt;/p&gt;

&lt;p&gt;I already wrote a test suite, so you can jump straight to the fun part: writing the algorithm. To participate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fork the &lt;a href=&#39;https://github.com/square/luhnybin&#39;&gt;Luhny Bin GitHub repo&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Modify &lt;code&gt;mask.sh&lt;/code&gt; to call your program.&lt;/li&gt;

&lt;li&gt;Test your program by executing &lt;code&gt;run.sh&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Once &lt;code&gt;run.sh&lt;/code&gt; passes, post a link to your solution in the comments below.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Windows users should use &lt;a href=&#39;http://www.cygwin.com/&#39;&gt;Cygwin&lt;/a&gt; to run the tests. Please make it easy for others to check out and run your solution.&lt;/p&gt;

&lt;p&gt;The first time you execute &lt;code&gt;run.sh&lt;/code&gt;, you&amp;#8217;ll see a test failure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./run.sh 
Running tests against mask.sh...

.X

Test #2 of 20 failed:
  Description:     valid 14-digit #
  Input:           56613959932537\n
  Expected result: XXXXXXXXXXXXXX\n
  Actual result:   56613959932537\n&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Modify &lt;code&gt;mask.sh&lt;/code&gt; and make the tests pass. &lt;a href=&#39;http://en.wikipedia.org/wiki/Newline&#39;&gt;Line feeds&lt;/a&gt; delineate the test cases. If you pass a number on the command line, &lt;code&gt;run.sh&lt;/code&gt; will repeat the test suite the specified number of times; this is useful for performance comparisons. The tests aren&amp;#8217;t set in stone&amp;#8212;if you have an idea for improving the test suite, please submit a pull request.&lt;/p&gt;

&lt;p&gt;This isn&amp;#8217;t a contest, but an innovative solution could score you interviews at Square. I&amp;#8217;m primarily interested to see how different programming languages stack up with regard to readability and performance.&lt;/p&gt;

&lt;p&gt;Once we have enough interesting submissions, I&amp;#8217;ll summarize the results in a followup &lt;a href=&#39;http://corner.squareup.com/&#39;&gt;blog&lt;/a&gt; post and open source our own Java-based implementation. In the mean time, if you enjoy working with talented people on challenging problems like this, email your résumé to &lt;a href=&#39;mailto:luhnybin@squareup.com&#39;&gt;luhnybin@squareup.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4254482470705691542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4254482470705691542'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2011/11/coding-challenge-luhny-bin.html' title='Coding Challenge: The Luhny Bin'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-490864456054281158</id><published>2010-11-16T22:56:00.000-08:00</published><updated>2010-11-16T22:56:51.142-08:00</updated><title type='text'>Java SE 7 &amp; 8</title><content type='html'>&lt;p&gt;Sometimes doing the right thing can be extremely difficult. In spite of and because of my commitment to Java, I had to decline an invitation to join the Java SE 7 and 8 expert groups. Talk about a tough decision!

&lt;p&gt;Why did I decline? I&#39;ll contribute to open source projects and open standards, standards I can independently implement and license as open source. Java SE, with its &lt;a href=&quot;http://www.jroller.com/scolebourne/entry/java_se_7_and_8&quot;&gt;anti-competitive licensing restrictions&lt;/a&gt;, is &lt;i&gt;not&lt;/i&gt; an open standard. It doesn&#39;t belong in the thus far open JCP, and I can&#39;t support such a charade. I stand by &lt;a href=&quot;https://blogs.apache.org/foundation/entry/statement_by_the_asf_board1&quot;&gt;Apache&lt;/a&gt;, and I hope &lt;a href=&quot;http://dev.eclipse.org/blogs/mike/2010/10/13/java-7-vote/&quot;&gt;Eclipse&lt;/a&gt; comes around.

&lt;p&gt;I&#39;m not a lawyer, but I can&#39;t help but wonder whether Oracle even has a right to apply additional licensing restrictions to the intellectual property in Java SE. Oracle didn&#39;t create Java SE on their own. Look at the list of JSRs pulled into &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=336&quot;&gt;Java SE 7&lt;/a&gt; and &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=337&quot;&gt;SE 8&lt;/a&gt; (see the &lt;i&gt;Contributions&lt;/i&gt; sections). Look at the experts on those JSRs. Most of them &lt;i&gt;aren&#39;t&lt;/i&gt; from Oracle. For example, &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=310&quot;&gt;JSR 310: Date and Time API&lt;/a&gt; comes from our own &lt;a href=&quot;http://www.jroller.com/scolebourne/&quot;&gt;Stephen Colebourne&lt;/a&gt;.

&lt;p&gt;The &lt;a href=&quot;http://jcp.org/aboutJava/communityprocess/JSPA2.pdf&quot;&gt;JSPA&lt;/a&gt; section 4.D protects experts in these situations, enabling them to withdraw their IP contributions if a spec lead, Oracle in the case of Java SE, changes the licensing terms:

&lt;blockquote&gt;&lt;u&gt;Withdrawal of Contributions due to Change in Announced License Terms.&lt;/u&gt; If the Spec Lead for an Expert Group in which You are participating makes significant changes to the terms and conditions of any license granted pursuant to Sections 5.B or 5.F below after those terms and conditions are first disclosed pursuant to the Process, then You may, upon giving notice to the Specification Lead and the PMO, withdraw any copyright or patent licenses concerning Your Contributions granted pursuant to Section 4.A.I or 4.A.II above (but not patent licenses granted by You pursuant to Section 6 below).&lt;/blockquote&gt;

&lt;p&gt;It&#39;s not clear to me exactly how section 4.D applies to umbrella JSRs like Java SE, but I&#39;d say that changes preventing independent open source implementations qualify as a &quot;significant.&quot;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/490864456054281158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2010/11/java-se-7-8.html#comment-form' title='28 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/490864456054281158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/490864456054281158'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2010/11/java-se-7-8.html' title='Java SE 7 &amp; 8'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-3234682151818036597</id><published>2010-11-01T11:52:00.000-07:00</published><updated>2010-11-01T11:55:05.844-07:00</updated><title type='text'>GOTJCPECV (Get Out The JCP EC Vote)</title><content type='html'>&lt;p&gt;Today is the last day to vote in the JCP EC election. If you&#39;re a JCP member, you received voting instructions in an email from pmo@jcp.org with the subject line &lt;i&gt;JCP Elections 2010 end November 1!&lt;/i&gt; This email contains &lt;a href=&quot;https://eballot.votenet.com/jcp/&quot;&gt;the link&lt;/a&gt; and your password. 

&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; The password is different from your jcp.org password.

&lt;p&gt;If you voted already, thank you. Please help me spread the word through blogs, tweets, Facebook, etc.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/3234682151818036597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2010/11/gotjcpecv-get-out-jcp-ec-vote.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3234682151818036597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3234682151818036597'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2010/11/gotjcpecv-get-out-jcp-ec-vote.html' title='GOTJCPECV (Get Out The JCP EC Vote)'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-7113805661775906941</id><published>2010-10-21T07:09:00.000-07:00</published><updated>2010-10-21T07:22:24.380-07:00</updated><title type='text'>Square Snare</title><content type='html'>&lt;p&gt;My dad makes and sells &lt;a href=&quot;http://www.etsy.com/shop/squaresnare?ga_search_query=squaresnare&amp;ga_search_type=seller_usernames&quot;&gt;keychains for Square readers&lt;/a&gt;. He attaches a keyring to a 3.5mm jack. Make your own or order one pre-made for $5:

&lt;p&gt;&lt;a href=&quot;http://www.etsy.com/shop/squaresnare?ga_search_query=squaresnare&amp;ga_search_type=seller_usernames&quot;&gt;&lt;img src=&quot;http://crazybob.org/squaresnare.jpg&quot; width=&quot;455&quot; height=&quot;301&quot;&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/7113805661775906941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2010/10/square-snare.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7113805661775906941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7113805661775906941'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2010/10/square-snare.html' title='Square Snare'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-8173253309333087746</id><published>2010-10-20T11:54:00.000-07:00</published><updated>2010-10-20T12:06:16.775-07:00</updated><title type='text'>Long Live Java</title><content type='html'>&lt;p&gt;&lt;img src=&quot;http://crazybob.org/longlivejava.jpg&quot; width=&quot;455&quot; height=&quot;304&quot;&gt;

&lt;p&gt;The JCP EC elections opened today, and &lt;a href=&quot;http://jcp.org/aboutJava/communityprocess/elections/2010.html&quot;&gt;I&#39;m running&lt;/a&gt;.

&lt;p&gt;After &lt;a href=&quot;http://www.jroller.com/scolebourne/entry/stacking_the_jcp_election&quot;&gt;Doug Lea&#39;s resignation and subsequent replacement with Hologic, Inc.&lt;/a&gt;, maintaining individual representation is more important than ever to Java&#39;s future. Individuals stand to account for only 13% of the SE/EE EC. Please vote for me and hold the ground for non-corporate interests.

&lt;h3&gt;Voting&lt;/h3&gt;

&lt;p&gt;If you&#39;re a JCP member, you received voting instructions in an email from pmo@jcp.org with the subject line &quot;JCP Elections 2010: vote today.&quot; The email contains a link and a password. If you have any problems, email admin@jcp.org or call 1-866-543-8750 (US or Canada) or 1-202-207-0529 (International).

&lt;h3&gt;Why vote for me?&lt;/h3&gt;

&lt;p&gt;You&#39;re no doubt aware that &lt;a href=&quot;http://www.jroller.com/scolebourne/entry/jcp_pragmatism_or_bust&quot;&gt;a bargaining impasse between Apache and Sun/Oracle&lt;/a&gt; has virtually halted progress within the JCP over the past five years. Openness of Java SE is critical in the fight against its real competition: .NET, V8, Erlang, Flash, et al. I&#39;ll do everything I can to ensure an open future for Java, but we can&#39;t let one JSR grind the JCP to a halt. Life must go on.

&lt;p&gt;Just last year, in the midst of this kerfuffle, &lt;a href=&quot;http://jcp.org/en/press/news/agility2&quot;&gt;I led the fastest-executing, most open JSR in the history of the JCP&lt;/a&gt;:

&lt;blockquote&gt;
&lt;p&gt;If you blinked, you might have missed it. JSR 330, Dependency Injection for Java, completed the shortest development cycle of any Java Specification Request on record within the Java Community Process (JCP) program, a feat that looked only theoretically imaginable on paper until Bob Lee proved it could be done. As co-Spec Lead of JSR 330, Bob wasn&#39;t focusing specifically on agility when he pushed the envelope. &quot;While I&#39;m glad JSR 330 executed quickly, I&#39;m even prouder of our specification&#39;s quality. I think we raised the bar,&quot; he says.

&lt;p&gt;How is it possible to achieve both speed and superiority? Doesn&#39;t something have to give? In fact, Bob gave a lot to make this happen, and other Spec Leads can learn a lot by retracing his steps. He attributes the short execution time and enhanced quality to a number of factors, including a crack team of Experts, an aggressive schedule that hacked the normal process, transparency, limited scope, and a willingness to collaborate, compromise, question assumptions, and think outside the box.&lt;/blockquote&gt;

&lt;h3&gt;If you elect me...&lt;/h3&gt;

&lt;p&gt;I&#39;ll continue this record of innovation and pave the way for more JSRs like 330. &lt;b&gt;I&#39;ll introduce an abbreviated process for Open JSRs.&lt;/b&gt; JSRs that meet our criteria for openness will be able to follow an easier, faster, simpler specification process. This process will motivate more open JSRs. It will free spec leads up to focus more on the technology and less on the process. It will attract more experts to the JCP and ensure a bright future for Java.

&lt;p&gt;Thank you,&lt;br /&gt;
Bob Lee</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/8173253309333087746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2010/10/long-live-java.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8173253309333087746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8173253309333087746'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2010/10/long-live-java.html' title='Long Live Java'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-2577515428436928603</id><published>2010-02-05T09:17:00.000-08:00</published><updated>2010-02-05T10:55:12.879-08:00</updated><title type='text'>Android: Trusting SSL certificates</title><content type='html'>&lt;img style=&quot;float:right; margin:0 0 0 0; width: 125px; height: 125px;&quot; src=&quot;http://crazybob.org/uploaded_images/key-737977.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;We use &lt;a href=&quot;http://en.wikipedia.org/wiki/Self-signed_certificate&quot;&gt;a self-signed SSL certificate&lt;/a&gt; for the test version of our backend web service. Since our certificate isn&#39;t signed by a &lt;a href=&quot;http://en.wikipedia.org/wiki/Certificate_authority&quot;&gt;CA&lt;/a&gt; that Android trusts by default, we need to add our server&#39;s public certificate to our Android app&#39;s trusted store. 

&lt;p&gt;These same instructions apply to trusting a custom CA, except you&#39;d get the public certificate directly from the CA instead of from a server.

&lt;p&gt;Required tools:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openssl.org/&quot;&gt;OpenSSL&lt;/a&gt;&#39;s command line client&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://java.sun.com/javase/downloads/index.jsp&quot;&gt;Java SE 6&lt;/a&gt; (for &lt;tt&gt;keytool&lt;/tt&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bouncycastle.org/latest_releases.html&quot;&gt;Bouncy Castle&#39;s provider jar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1. Grab the public certificate from the server you want to trust. Replace &lt;tt&gt;${MY_SERVER}&lt;/tt&gt; with your server&#39;s address.

&lt;pre&gt;
echo | openssl s_client -connect ${MY_SERVER}:443 2&gt;&amp;1 | \
 sed -ne &#39;/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p&#39; &gt; mycert.pem
&lt;/pre&gt;

&lt;p&gt;For example, here&#39;s the PEM-encoded public certificate from google.com:

&lt;pre&gt;
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x
MTEyMTgyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA6PmGD5D6htffvXImttdEAoN4c9kCKO+IRTn7EOh8rqk41XXGOOsKFQebg+jN
gtXj9xVoRaELGYW84u+E593y17iYwqG7tcFR39SDAqc9BkJb4SLD3muFXxzW2k6L
05vuuWciKh0R73mkszeK9P4Y/bz5RiNQl/Os/CRGK1w7t0UCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQCfQ89bxFApsb/isJr/aiEdLRLDLE5a+RLizrmCUi3nHX4adpaQedEkUjh5
u2ONgJd8IyAPkU0Wueru9G2Jysa9zCRo1kNbzipYvzwY4OA8Ys+WAi0oR1A04Se6
z5nRUP8pJcA2NhUzUnC+MY+f6H/nEQyNv4SgQhqAibAxWEEHXw==
-----END CERTIFICATE-----
&lt;/pre&gt;

&lt;p&gt;2. Android has built-in support for the Bouncy Castle keystore format (BKS). Put Bouncy Castle&#39;s jar in your classpath, and create a keystore containing only your trusted key.

&lt;pre&gt;
export CLASSPATH=bcprov-jdk16-145.jar
CERTSTORE=res/raw/mystore.bks
if [ -a $CERTSTORE ]; then
    rm $CERTSTORE || exit 1
fi
keytool \
      -import \
      -v \
      -trustcacerts \
      -alias 0 \
      -file &lt;(openssl x509 -in mycert.pem) \
      -keystore $CERTSTORE \
      -storetype BKS \
      -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
      -providerpath /usr/share/java/bcprov.jar \
      -storepass ez24get
&lt;/pre&gt;

&lt;p&gt;3. Create a custom Apache &lt;tt&gt;HttpClient&lt;/tt&gt; that uses your custom store for HTTPS connections.

&lt;pre&gt;
import android.content.Context;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.SingleClientConnManager;

import java.io.InputStream;
import java.security.KeyStore;

public class MyHttpClient extends DefaultHttpClient {

  final Context context;

  public MyHttpClient(Context context) {
    this.context = context;
  }

  @Override protected ClientConnectionManager createClientConnectionManager() {
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(
        new Scheme(&quot;http&quot;, PlainSocketFactory.getSocketFactory(), 80));
    registry.register(new Scheme(&quot;https&quot;, newSslSocketFactory(), 443));
    return new SingleClientConnManager(getParams(), registry);
  }

  private SSLSocketFactory newSslSocketFactory() {
    try {
      KeyStore trusted = KeyStore.getInstance(&quot;BKS&quot;);
      InputStream in = context.getResources().openRawResource(R.raw.mystore);
      try {
        trusted.load(in, &quot;ez24get&quot;.toCharArray());
      } finally {
        in.close();
      }
      return new SSLSocketFactory(trusted);
    } catch (Exception e) {
      throw new AssertionError(e);
    }
  }
}
&lt;/pre&gt;

&lt;p&gt;That&#39;s it! If you think this kind of stuff is fun, &lt;a href=&quot;https://squareup.com/jobs&quot;&gt;Square is hiring&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/2577515428436928603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2577515428436928603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2577515428436928603'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html' title='Android: Trusting SSL certificates'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-2187140590090334329</id><published>2009-08-14T14:36:00.000-07:00</published><updated>2009-08-14T15:36:44.051-07:00</updated><title type='text'>Tomorrow is the big day.</title><content type='html'>&lt;img src=&quot;http://go.liverfoundation.org/images/friendraiser_uploads/1540.1474558500.custom.jpg&quot; width=&quot;267&quot; height=&quot;400&quot; align=&quot;right&quot; style=&quot;margin-left: 10px&quot;&gt;Friends,

&lt;p&gt;Tomorrow morning, I&#39;ll swim 1.5 miles from Alcatraz to SF to benefit the American Liver Foundation. I set my fund raising goal at $10k, and I&#39;m already 30% of the way there. If you&#39;ve already donated, thank you! If not, please &lt;a href=&quot;http://is.gd/1S7eL&quot;&gt;sponsor me&lt;/a&gt;.

&lt;p&gt;Thanks,&lt;br/&gt;
Bob</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/2187140590090334329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2009/08/tomorrow-is-big-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2187140590090334329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2187140590090334329'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2009/08/tomorrow-is-big-day.html' title='Tomorrow is the big day.'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-4265000668286941219</id><published>2009-05-20T17:13:00.000-07:00</published><updated>2009-05-20T20:20:48.862-07:00</updated><title type='text'>It&#39;s in the JCP&#39;s hands now.</title><content type='html'>&lt;p&gt;This morning, Google and SpringSource submitted &lt;a href=&quot;http://docs.google.com/Doc?id=dd2fhx4z_22g7x8zdfn&quot;&gt;an updated version&lt;/a&gt; of &lt;a href=&quot;http://crazybob.org/2009/05/announcing-javaxinjectinject.html&quot;&gt;the aforementioned @Inject proposal&lt;/a&gt; to the &lt;a href=&quot;http://jcp.org/&quot;&gt;JCP&lt;/a&gt;. In response to popular demand, we expanded the proposal&#39;s scope to include a low-level build-time and run-time configuration API. You might think of the new API as a type-safe analogue to JNDI and &lt;span style=&quot;font-family:courier new;&quot;&gt;@Resource&lt;/span&gt;. Having a central integration point for DI configuration means you can use multiple configuration approaches in a single application without suffering from the-chicken-or-the-egg problem; anyone who has tried to use more than one DI framework in the same application knows that deciding which framework to initialize first can be problematic to say the least.

&lt;p&gt;Our goals are to enable portable applications and to spark further innovation in the DI configuration space. By making it easier to use multiple configuration approaches with the same tools and in the same application, we lower the barriers to entry and adoption for new approaches.

&lt;p&gt;We&#39;ve added the following paragraphs to the JSR proposal&#39;s introduction:

&lt;blockquote&gt;A programmer configures a dependency injector so it knows what to &lt;span class=&quot;il&quot;&gt;inject&lt;/span&gt;. Different configuration approaches make sense in different contexts. One approach is to search the classpath for dependency implementations, avoiding the need for the programmer to write explicit code. This approach could be useful in quick-and-dirty prototypes. A programmer working on a large, long-lived application might prefer a more explicit, compartmentalized approach. For example, the programmer could write XML that tells the injector to inject an EJB client proxy named &lt;tt&gt;&quot;NetworkTimeSource&quot;&lt;/tt&gt; when a class needs a &lt;tt&gt;TimeSource&lt;/tt&gt;:

&lt;pre&gt;
  &amp;lt;binding type=&quot;TimeSource&quot; ejb=&quot;NetworkTimeSource&quot;/&gt;
&lt;/pre&gt;

&lt;p&gt;It often makes sense to use more than one configuration mechanism in the the same application. For example, a quick and dirty prototype might grow into a real application, and the programmer could incrementally migrate to a more maintainable configuration. As another example, a program might configure some resources explicitly, while others are configured automatically based on an external XML file or database.

&lt;p&gt;This JSR will standardize a low-level kernel API that can be used directly by a user or as an integration point for higher level configuration approaches. This approach enables portable Java applications without quashing innovation in dependency injector configuration.&lt;/blockquote&gt;

&lt;p&gt;We&#39;ve rewritten the scope:

&lt;blockquote&gt;This JSR will standardize:
&lt;ol&gt;&lt;li&gt;A set of annotations for use on injectable classes&lt;/li&gt;&lt;li&gt;A typesafe, user-friendly injector configuration API that provides an integration point for higher level dependency injection configuration approaches&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;

&lt;p&gt;And we&#39;ve adjusted the time line and other parameters accordingly. Check out &lt;a href=&quot;http://docs.google.com/Doc?id=dd2fhx4z_22g7x8zdfn&quot;&gt;the full proposal&lt;/a&gt;.

&lt;p&gt;What will the new API look like? That&#39;s for the expert group to decide, and they&#39;ll do so in an open and inclusive manner. In addition to Guice and Spring, this proposal already has support from the PicoContainer, Plexus and Tapestry IoC teams, not to mention prominent users like &lt;span class=&quot;gI&quot;&gt;Tim Peierls and James Strachan, and well known API designers like Doug Lea and Josh Bloch.&lt;/span&gt; We&#39;ll have no shortage of expertise when it comes time to assemble the group.

&lt;p&gt;&lt;a href=&quot;http://crazybob.org/2009/05/guice.html&quot;&gt;Guice 2&lt;/a&gt; already provides a great foundation for &lt;a href=&quot;http://code.google.com/p/guiceyfruit/&quot;&gt;extensions&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/google-guice/wiki/Grapher&quot;&gt;tools&lt;/a&gt;. The Guice team is excited to start with a clean slate and apply the lessons we&#39;ve learned over the past few years. This time around, we&#39;ll be able to work &lt;span style=&quot;font-style: italic;&quot;&gt;with&lt;/span&gt; the platform instead of around it. As a member of the &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=294&quot;&gt;JSR-294&lt;/a&gt; expert group, I&#39;m eager to align our dependency injection efforts with the &lt;a href=&quot;http://openjdk.java.net/projects/jigsaw/&quot;&gt;module support&lt;/a&gt; coming in Java 7. JSR-294 modules will enable sharing types, and this proposed JSR will build on that foundation and enable sharing instances.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/4265000668286941219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2009/05/its-in-jcps-hands-now.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4265000668286941219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4265000668286941219'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2009/05/its-in-jcps-hands-now.html' title='It&#39;s in the JCP&#39;s hands now.'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-4576793364859148496</id><published>2009-05-19T19:21:00.000-07:00</published><updated>2009-05-19T20:00:24.796-07:00</updated><title type='text'>Guice²</title><content type='html'>After two years in the making, it&#39;s official. We&#39;ve released &lt;a href=&quot;http://code.google.com/p/google-guice/wiki/Guice20&quot;&gt;Guice 2&lt;/a&gt;! Here&#39;s &lt;a href=&quot;http://google-code-updates.blogspot.com/2009/05/guice-deuce.html&quot;&gt;Jesse&#39;s announcement&lt;/a&gt; from the Google Code Blog:

&lt;blockquote&gt;
&lt;p&gt;Two years ago, Bob Lee and Kevin Bourrillion &lt;a href=&quot;http://google-code-updates.blogspot.com/2007/03/guice-googles-internal-java-dependency.html&quot; id=&quot;y7_x&quot; title=&quot;released Guice 1.0&quot;&gt;open sourced Google Guice 1.0&lt;/a&gt;, a lightweight Java dependency injection framework. Guice takes the pain out of writing and maintaining Java applications big and small. Guice has gained a great deal of traction both inside and outside of Google. Almost every Java-based application at Google is also a Guice-based application; the list includes AdWords, Google Docs, Gmail, and even YouTube. Open source users run Guice in everything from file-sharing software to ATMs. They&#39;ve even written &lt;a title=&quot;two&quot; href=&quot;http://www.apress.com/book/view/1590599977&quot; id=&quot;k.w_&quot;&gt;two&lt;/a&gt; &lt;a title=&quot;books&quot; href=&quot;http://www.manning.com/prasanna/&quot; id=&quot;hbx3&quot;&gt;books&lt;/a&gt; about &lt;a title=&quot;the Jolt-award-winning framework&quot; href=&quot;http://www.ddj.com/blog/portal/archives/2008/03/jolt_award_winn.html&quot; id=&quot;vq_o&quot;&gt;this Jolt-award-winning framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Today, we&#39;re releasing Guice 2. The minimally-sized API extensions introduced by Guice 2 will have a majorly positive impact on the size and maintainability of your code. We closely scrutinized each addition, carefully balancing maintainability and flexibility. Here are a few of my favorite new features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Provider methods&quot; href=&quot;http://code.google.com/docreader/#p=google-guice&amp;amp;s=google-guice&amp;amp;t=ProvidesMethods&quot; id=&quot;l4we&quot;&gt;Provider methods&lt;/a&gt;&lt;/b&gt; eliminate the boilerplate of manually-constructed dependencies.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Module overrides&quot; href=&quot;http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override%28java.lang.Iterable%29&quot; id=&quot;k5y:&quot;&gt;Module overrides&lt;/a&gt;&lt;/b&gt; allow you to tweak a production module for a unit test or QA deployment.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a title=&quot;Private modules&quot; href=&quot;http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/PrivateModule.html&quot; id=&quot;i.ic&quot;&gt;Private modules&lt;/a&gt;&lt;/b&gt; enable compartmentalized configuration, simplifying module reuse.&lt;/li&gt;&lt;/ul&gt;Guice works with Java SE, Java EE, &lt;a href=&quot;http://code.google.com/appengine/&quot; id=&quot;kr65&quot; title=&quot;Google App Engine&quot;&gt;Google App Engine&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/android/&quot; id=&quot;h1hz&quot; title=&quot;Android&quot;&gt;Android&lt;/a&gt;, and even &lt;a href=&quot;http://code.google.com/webtoolkit/&quot; id=&quot;y.xm&quot; title=&quot;Google Web Toolkit&quot;&gt;Google Web Toolkit&lt;/a&gt; (via &lt;a href=&quot;http://code.google.com/p/google-gin/&quot; id=&quot;o83t&quot; title=&quot;GIN&quot;&gt;GIN&lt;/a&gt;).&lt;br /&gt;&lt;br&gt;&lt;b&gt;References&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/google-guice/wiki/Guice20&quot; id=&quot;lgwa&quot; title=&quot;Guice 2.0 Release Notes&quot;&gt;Guice 2.0 Release Notes&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/google-guice/downloads/list&quot; id=&quot;f75-&quot; title=&quot;Downloads&quot;&gt;Downloads&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/google-guice/wiki/Motivation&quot; id=&quot;hrtf&quot; title=&quot;User&#39;s Guide&quot;&gt;User&#39;s Guide&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://google-guice.googlecode.com/svn/trunk/javadoc/index.html&quot; id=&quot;vom1&quot; title=&quot;Javadoc&quot;&gt;Javadoc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot; class=&quot;byline-author&quot;&gt;By Jesse Wilson, Google Developer Team&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

In addition to the user-facing features mentioned by Jesse, Guice 2 provides an &lt;a href=&quot;http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/package-summary.html&quot;&gt;extensive service provider API&lt;/a&gt; that enables first class extensions like James Strachan&#39;s &lt;a href=&quot;http://code.google.com/p/guiceyfruit/&quot;&gt;GuiceyFruit&lt;/a&gt; and makes writing tools like &lt;a href=&quot;http://code.google.com/p/google-guice/wiki/Grapher&quot;&gt;Guice Grapher&lt;/a&gt; a snap.

&lt;p&gt;Thanks, Jesse, for all of your hard work on this release. Special thanks goes to our users for being patient and building a vibrant community around Guice.

&lt;p&gt;If you&#39;re interested in learning more, don&#39;t miss Jesse and Dhanji&#39;s Guice 2 talks at &lt;a href=&quot;http://code.google.com/events/io/sessions/BigModularJavaGuice.html&quot;&gt;Google I/O&lt;/a&gt; and &lt;a href=&quot;http://java.sun.com/javaone/&quot;&gt;JavaOne&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/4576793364859148496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2009/05/guice.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4576793364859148496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4576793364859148496'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2009/05/guice.html' title='Guice²'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-714670845476929860</id><published>2009-05-05T10:34:00.000-07:00</published><updated>2009-05-05T11:01:28.227-07:00</updated><title type='text'>Announcing @javax.inject.Inject</title><content type='html'>I&#39;m proud to announce a &lt;a href=&quot;http://atinject.googlecode.com/svn/trunk/javadoc/javax/inject/package-summary.html&quot;&gt;new dependency injection specification&lt;/a&gt; backed by both Google Guice and Spring. You can catch &lt;a href=&quot;http://google-code-updates.blogspot.com/2009/05/javaxinjectinject.html&quot;&gt;the official announcement&lt;/a&gt; over on the Google Code Blog:
&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Five years ago, &lt;a title=&quot;Spring 1.0&quot; href=&quot;http://www.springsource.org/&quot; id=&quot;ehcd&quot;&gt;Spring 1.0&lt;/a&gt; brought Java &lt;a title=&quot;dependency injection&quot; href=&quot;http://en.wikipedia.org/wiki/Dependency_injection&quot; id=&quot;w1gf&quot;&gt;dependency injection&lt;/a&gt; into the mainstream. Three years later, &lt;a title=&quot;Google Guice 1.0&quot; href=&quot;http://code.google.com/p/google-guice/&quot; id=&quot;kds5&quot;&gt;Google Guice 1.0&lt;/a&gt; introduced annotation-based dependency injection and made Java programming a little easier. Since then, developers have had to choose between a) writing external configuration or b) importing vendor-specific annotations.

&lt;p&gt;Today, we hope to give developers the best of both worlds. &lt;b&gt;Google Guice and SpringSource have partnered to standardize a proven, non-controversial set of annotations that make injectable classes &lt;/b&gt;&lt;b&gt;portable &lt;/b&gt; &lt;b&gt;across frameworks.&lt;/b&gt; At the moment, the set of specified annotations consists of:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;@Inject&lt;/span&gt; - Identifies injectable constructors, methods, and fields&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;@Qualifier&lt;/span&gt; - Identifies qualifier annotations&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;@Scope&lt;/span&gt; - Identifies scope annotations&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;@Named&lt;/span&gt; - String-based qualifier&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;@Singleton&lt;/span&gt; - Identifies a type that the injector only instantiates once&lt;/li&gt;&lt;/ul&gt;One additional interface is specified for use in conjunction with these annotations:
&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Provider&lt;t&gt;&lt;/t&gt;&lt;/span&gt; - Provides instances of a type T. For any type T that can be injected, you can also inject &lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Provider&lt;t&gt;&lt;/t&gt;&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;You can check out an early draft of the &lt;a title=&quot;specification&quot; href=&quot;http://atinject.googlecode.com/svn/trunk/javadoc/javax/inject/package-summary.html&quot; id=&quot;bwe9&quot;&gt;specification&lt;/a&gt;. We deliberately left external dependency configuration out, so as not to quash ongoing innovation. We haven&#39;t formally submitted this standard to the JCP yet, but we plan to do so shortly. Standards wonks can read a draft of our &lt;a title=&quot;JSR proposal&quot; href=&quot;http://docs.google.com/Doc?id=dd2fhx4z_13cw24s7dj&quot; id=&quot;xuzd&quot;&gt;JSR proposal&lt;/a&gt;.

&lt;p&gt;The expert group will be inclusive and will work in the open. For example, our mailing list is publicly readable, and we host the specification at &lt;a title=&quot;Google Code&quot; href=&quot;http://code.google.com/p/atinject/&quot; id=&quot;rp_9&quot;&gt;Google Code&lt;/a&gt;. Several industry players have already expressed interest in supporting this effort. &lt;a title=&quot;Contact us&quot; href=&quot;http://code.google.com/p/atinject/&quot; id=&quot;ecrh&quot;&gt;Contact us&lt;/a&gt; if you&#39;d like to help out.
&lt;/blockquote&gt;This specification will address the last shortcoming of annotation-based dependency injection. You no longer have to import vendor-specific annotations.

&lt;p&gt;Our hope is that this specification will not only improve interoperability between existing dependency injection frameworks and unify the Java community, but it will also lower the barrier to entry for new injector implementations and foster even more innovation in this space.

&lt;p&gt;I&#39;d like to thank Paul Hammant, Doug Lea, Tim Peierls, James Strachan, Hani Suleiman, and Jason van Zyl for their early reviews and official support. Special thanks goes to our partner in this endeavor SpringSource, especially Rod Johnson, and my fellow Googlers and Guicers Josh Bloch, Jesse Wilson, Kevin Bourrillion, and Dhanji Prasanna.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/714670845476929860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2009/05/announcing-javaxinjectinject.html#comment-form' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/714670845476929860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/714670845476929860'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2009/05/announcing-javaxinjectinject.html' title='Announcing @javax.inject.Inject'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-246294243405425996</id><published>2008-10-13T11:03:00.000-07:00</published><updated>2008-10-13T11:24:15.353-07:00</updated><title type='text'>How to create simple Amazon affiliate links</title><content type='html'>In case you didn&#39;t know, &lt;a href=&quot;https://affiliate-program.amazon.com/gp/associates/join?tag=crazyboborg-20&quot;&gt;Amazon will pay you to recommend their products&lt;/a&gt;. If you&#39;re going to link to a product anyway, why not take credit? Amazon provides all sorts of fancy tools and flashy widgets to help you advertise their products, but creating a basic URL through their web interface isn&#39;t straightforward.

&lt;p&gt;In hope of simplifying the process, I followed some 3rd party instructions I found for hacking together your own referral URLs, but they didn&#39;t work. I asked Amazon instead, and here are the official instructions:

&lt;blockquote&gt;
&lt;p&gt;If you would like to link directly to an item&#39;s detail page using a simple text link, use the following format to construct your links:

&lt;p&gt;http://www.amazon.com/dp/ASIN/?tag=your_Associates_ID

&lt;p&gt;To make this link functional, replace &quot;ASIN&quot; with the 10-digit ISBN or ASIN of the product, and replace &quot;your_Associates_ID&quot; with your Associates ID or tracking ID. However, you would not be able to link to a search results page on Amazon.com.

&lt;p&gt;If you would like to link to the Amazon.com homepage, you can use the following format:

&lt;p&gt;http://www.amazon.com/?tag=your_Associates_ID

&lt;p&gt;To make this link functional, replace &quot;your_Associates_ID&quot; with your Associates ID or tracking ID.

&lt;p&gt;An item&#39;s ISBN/ASIN is listed on the item&#39;s detail page.  For example, follow the link below, and then scroll down to the section labeled Product Details to find the ISBN (0439434866) for &quot;Harry Potter Paperback Boxed Set.&quot;

&lt;p&gt;http://www.amazon.com/exec/obidos/tg/detail/-/0439434866/
&lt;/blockquote&gt;

&lt;p&gt;I don&#39;t make much money from referrals, but I do enjoy taking my payments in the form of Amazon gift certificates and buying myself a little something from &lt;a href=&quot;http://www.amazon.com/gp/registry/wishlist/3B513E3J694ZL/?tag=crazyboborg-20&quot;&gt;my wish list&lt;/a&gt; every now and then.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/246294243405425996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/10/how-to-create-simple-amazon-affiliate.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/246294243405425996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/246294243405425996'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/10/how-to-create-simple-amazon-affiliate.html' title='How to create simple Amazon affiliate links'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-2672511784208073144</id><published>2008-09-22T17:37:00.000-07:00</published><updated>2008-09-23T08:53:45.538-07:00</updated><title type='text'>Taken with my &#39;gPhone&#39;</title><content type='html'>&lt;p&gt;I&#39;ve been playing around with the 3 megapixel camera on my &lt;a href=&quot;http://announcement.t-mobileg1.com/&quot;&gt;Android-based G1&lt;/a&gt;. Like any phone camera, you need a little diligence, a lot of light, and a steady hand.

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/crazybob/2874745982/&quot; title=&quot;Walking home by Bob Lee, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3012/2874745982_bab6fc7739.jpg&quot; width=&quot;455&quot; height=&quot;341&quot; alt=&quot;Walking home&quot; /&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/crazybob/2877157751/&quot; title=&quot;Mask by Bob Lee, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3172/2877157751_ccb27b0ec1.jpg&quot; width=&quot;455&quot; height=&quot;341&quot; alt=&quot;Mask&quot; /&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/crazybob/2877158485/&quot; title=&quot;Stanford by Bob Lee, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3148/2877158485_44e333f4b4.jpg&quot; width=&quot;455&quot; height=&quot;341&quot; alt=&quot;Stanford&quot; /&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/crazybob/2877992504/&quot; title=&quot;Fountain by Bob Lee, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3287/2877992504_470031c0e6.jpg&quot; width=&quot;455&quot; height=&quot;341&quot; alt=&quot;Fountain&quot; /&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/crazybob/2878012086/&quot; title=&quot;Nested by Bob Lee, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3090/2878012086_89811801d4.jpg&quot; width=&quot;455&quot; height=&quot;341&quot; alt=&quot;Nested&quot; /&gt;&lt;/a&gt;

&lt;p&gt;For the best results, tap and release the shutter button, and then hold the phone still until it takes the picture a second or so later. It&#39;s not necessary to hold down the button until the picture takes. Holding down the button will contract the muscles in your hand and make it more difficult to keep the phone steady. 

&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/crazybob/sets/72157607400905622/&quot;&gt;Click here for more photos&lt;/a&gt;.&lt;br&gt;&lt;img src=&quot;http://crazybob.org/g1.jpg&quot; width=&quot;432&quot; height=&quot;394&quot;&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/2672511784208073144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/09/taken-with-my-gphone.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2672511784208073144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2672511784208073144'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/09/taken-with-my-gphone.html' title='Taken with my &#39;gPhone&#39;'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3012/2874745982_bab6fc7739_t.jpg" height="72" width="72"/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-181270584321244166</id><published>2008-07-12T10:28:00.000-07:00</published><updated>2008-07-12T12:11:32.853-07:00</updated><title type='text'>Greeting Grammar</title><content type='html'>&lt;p&gt;&lt;img align=&quot;right&quot; src=&quot;http://crazybob.org/hibob.png&quot; width=&quot;167&quot; heigh=&quot;62&quot;&gt;I&#39;ve noticed that most people start off emails with &quot;Hi Bob,&quot;. I suspect they&#39;re treating &quot;hi&quot; as a less endearing replacement for &quot;dear&quot; in &quot;Dear Bob,&quot;. Technically, &quot;dear&quot; is an adjective describing &quot;Bob&quot; while &quot;hi&quot; stands on its own and is not part of the direct address. I prefer the more correct salutation: &quot;Hi, Bob.&quot;&lt;/p&gt;

&lt;p&gt;Who is the most grammatically correct social network? Facebook, Plaxo Pulse, and Flickr get this wrong, by my standards, in their automated emails. Twitter gets it right.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/181270584321244166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/07/greeting-grammar.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/181270584321244166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/181270584321244166'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/07/greeting-grammar.html' title='Greeting Grammar'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-8717445736304239490</id><published>2008-06-26T10:42:00.000-07:00</published><updated>2008-07-01T16:43:27.419-07:00</updated><title type='text'>Expert Guice</title><content type='html'>&lt;p&gt;&lt;a href=&quot;http://www.javapolis.com/confluence/display/~stephan/Home&quot;&gt;Stephan&lt;/a&gt; just posted video of a talk I gave at Javapolis back in December: &lt;a href=&quot;http://parleys.com/display/PARLEYS/Home#slide=1;talk=14123111;title=Guice&quot;&gt;&lt;i&gt;Expert Guice: 50 some odd ways to Guice up your Java&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://parleys.com/display/PARLEYS/Home#slide=1;talk=14123111;title=Guice&quot;&gt;&lt;img src=&quot;http://crazybob.org/javapolis07-guice.png&quot; width=&quot;450&quot; height=&quot;328&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Stephan fixed the audio levels so you should be able to hear me now. :-)&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/8717445736304239490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/06/expert-guice.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8717445736304239490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8717445736304239490'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/06/expert-guice.html' title='Expert Guice'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12626926.post-8551156360085828210</id><published>2008-05-28T07:23:00.000-07:00</published><updated>2008-05-28T07:26:22.982-07:00</updated><title type='text'>Guice @ Google I/O</title><content type='html'>&lt;a href=&quot;http://publicobject.com/&quot;&gt;Jesse&lt;/a&gt; and I are presenting Guice 101 at &lt;a href=&quot;http://code.google.com/events/io/&quot;&gt;Google I/O&lt;/a&gt;, 11:15 this morning:

&lt;blockquote&gt;
Guice (pronounced &#39;juice&#39;) is a Jolt award-winnning, lightweight dependency injection framework for Java 5 and above. Put simply, Guice alleviates the need for factories and the use of new in your Java code. Think of Guice&#39;s @Inject as the new new. You will still need to write factories in some cases, but your code will not depend directly on them. Your code will be easier to change, unit test and reuse in other contexts.
&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/8551156360085828210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/05/guice-google-io.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8551156360085828210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/8551156360085828210'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/05/guice-google-io.html' title='Guice @ Google I/O'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>5</thr:total></entry><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 - &quot;Google Me&quot;</title><content type='html'>&lt;center&gt;&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/9axroVxp2qI&amp;hl=en&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/9axroVxp2qI&amp;hl=en&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/459423520104674072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/05/teyana-taylor-google-me.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/459423520104674072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/459423520104674072'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/05/teyana-taylor-google-me.html' title='Teyana Taylor - &quot;Google Me&quot;'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>6</thr:total></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&#39;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=&quot;right&quot; src=&quot;http://crazybob.org/uploaded_images/twitter-logo-791366.png&quot; border=&quot;0&quot; style=&quot;margin: 0px 0px 10px 10px&quot;/&gt;
With &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt;, you can broadcast short status updates to your followers and receive updates from people who you follow. It&#39;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&#39;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=&quot;http://twitter.com/crazybob&quot;&gt;follow me&lt;/a&gt;, and I text &quot;free beer at Guice BoF!&quot; 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 &quot;device updates&quot; for that person in order to receive their updates via text and instant message.&lt;/p&gt;

&lt;p&gt;If you don&#39;t have unlimited text messaging, you can always access Twitter via the web or one of &lt;a href=&quot;http://twitter.pbwiki.com/Apps&quot;&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=&quot;http://hashtags.org/&quot;&gt;hashtags&lt;/a&gt;&lt;/i&gt;. It&#39;s simple. Tag your JavaOne-related messages by appending &quot;#javaone&quot; to them, and I&#39;ll be able to see your update even if I&#39;m not following you yet.

&lt;p&gt;Simply text &quot;track javaone&quot; 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=&quot;http://summize.com/search?q=%23javaone&quot;&gt;search for &quot;#javaone&quot; 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=&quot;http://twitter.com/crazybob&quot;&gt;following me&lt;/a&gt;, also check out these Java twitterers:&lt;/p&gt;

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

&lt;p&gt;If you&#39;ll be twittering from JavaOne and I didn&#39;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&#39;ll have!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/4819946983474281412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/05/going-to-javaone-sign-up-for-twitter.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4819946983474281412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4819946983474281412'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/05/going-to-javaone-sign-up-for-twitter.html' title='Going to JavaOne? Sign up for Twitter.'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>13</thr:total></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=&quot;http://crazybob.org/twubble&quot;&gt;Twubble&lt;/a&gt; for the Google Developer Podcast:&lt;/p&gt;

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

&lt;p&gt;If you use &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;http://crazybob.org/twubble&quot;&gt;Twubble&lt;/a&gt; can look at your existing friends&#39; friends and recommend new people for you to follow. It&#39;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=&quot;http://code.google.com/webtoolkit/&quot;&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&#39;d be crazy to write AJAX apps any other way than GWT nowadays.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://crazybob.org/twubble&quot;&gt;&lt;img src=&quot;http://crazybob.org/twubble-screenshot.png&quot; width=&quot;405&quot; height=&quot;338&quot;&gt;&lt;/a&gt;&lt;/center&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/686027953056804385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/04/twubble-with-twitter.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/686027953056804385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/686027953056804385'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/04/twubble-with-twitter.html' title='The Twubble with Twitter'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>6</thr:total></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=&quot;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&quot;&gt;&lt;img src=&quot;http://crazybob.org/apress-guice.gif&quot; width=&quot;125&quot; height=&quot;153&quot; align=&quot;right&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;Robbie asked me to write a foreword for &lt;a href=&quot;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&quot;&gt;his upcoming Guice book&lt;/a&gt;. Having never written a foreword before, I Googled, &quot;how to write a foreword,&quot; which brought me to two helpful posts from Muse Ink: &lt;i&gt;&lt;a href=&quot;http://museinks.blogspot.com/2005/10/foreword-thinking-introduction-to.html&quot;&gt;Foreword Thinking&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href=&quot;http://museinks.blogspot.com/2005/10/foreword-march-how-to-write-fantastic_25.html&quot;&gt;Foreword March&lt;/a&gt;&lt;/i&gt;. 

&lt;p&gt;Here&#39;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&#39;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&#39;d never even consider trying by hand. In the long run, it&#39;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&#39;s benefits on a number of projects, we at Google knew we couldn&#39;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&#39;ll find that Robbie&#39;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&#39;ve gotten a lot of questions about it lately. There&#39;s a lot of misinformation out there. For example, &lt;a href=&quot;http://blog.jayfields.com/2008/02/static-typing-considered-harmful.html&quot; rel=&quot;nofollow&quot;&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&#39;t replace unit tests. Unit tests don&#39;t replace static typing. In fact, static typing can make maintaining unit tests much easier, especially when paired with &lt;a href=&quot;http://www.easymock.org/index.html&quot;&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&#39;t.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/4963642410909899091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/03/statically-typed-foreword.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4963642410909899091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/4963642410909899091'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/03/statically-typed-foreword.html' title='Statically Typed Foreword'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>19</thr:total></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=&quot;http://www.flickr.com/photos/crazybob/2321887906/&quot; title=&quot;Jolt&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3129/2321887906_55c402cfa2.jpg&quot; width=&quot;405&quot; height=&quot;270&quot; alt=&quot;Jolt&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
The Jolt Awards recognize those products, books, and websites that have &quot;jolted&quot; 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&#39;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=&quot;http://smallwig.blogspot.com/&quot;&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&#39;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=&quot;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&quot;&gt;Josh Bloch&lt;/a&gt; and &lt;a href=&quot;http://gafter.blogspot.com/&quot;&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=&quot;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&quot;&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=&quot;http://slesinsky.org/brian/&quot;&gt;Brian Slesinsky&lt;/a&gt;, for his apt analogies, &lt;a href=&quot;http://stuffthathappens.com/blog/&quot;&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=&quot;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&quot;&gt;a Guice book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dhanji for writing &lt;a href=&quot;http://www.manning.com/prasanna/&quot;&gt;a Guice book&lt;/a&gt;, and integrating Guice with Hibernate and JPA in &lt;a href=&quot;http://www.wideplay.com/guicewebextensions2&quot;&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&#39;d like to thank Google for its unparalleled commitment to open source. If you haven&#39;t tried Guice yet, &lt;a href=&quot;http://code.google.com/p/google-guice/&quot;&gt;now is the time&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/1563180514681075465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/03/thanks-for-jolt.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1563180514681075465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/1563180514681075465'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/03/thanks-for-jolt.html' title='Thanks for the Jolt!'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3129/2321887906_55c402cfa2_t.jpg" height="72" width="72"/><thr:total>6</thr:total></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&#39;s down, the first thing you want to do is &lt;a href=&quot;http://twitter.com/crazybob&quot;&gt;Twitter about it being down&lt;/a&gt;. I originally wanted to tell Duncan Davidson how much I love &lt;a href=&quot;http://duncandavidson.com/&quot;&gt;his site design&lt;/a&gt;. I&#39;m sure it&#39;s been that way for awhile, but I normally only see his RSS feed.

&lt;p&gt;I&#39;m also thinking about picking up the second edition of the &lt;a href=&quot;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&quot;&gt;Dragon Book&lt;/a&gt;. I want to learn more about language design and compilers. I know the Dragon Book has it&#39;s shortcomings, but I love that the new edition covers JIT compiling and garbage collection, and I&#39;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=&quot;http://www.acm.org/&quot;&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=&quot;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&quot;&gt;Programming Language Pragmatics&lt;/a&gt;&lt;/i&gt; instead.</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/2011501516103519803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/01/thing-about-twitter-is.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2011501516103519803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/2011501516103519803'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/01/thing-about-twitter-is.html' title='The trouble with Twitter is...'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>6</thr:total></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=&quot;http://parleys.com/display/PARLEYS/Interview+with+Bob+Lee+at+JavaPolis%2707?showComments=true&quot;&gt; the video is now up on parleys.com&lt;/a&gt;. You can also find &lt;a href=&quot;http://javaposse.com/index.php?post_id=299505#&quot;&gt;an audio-only podcast version on the Java Posse&#39;s web site&lt;/a&gt;. In it, we talk frankly about:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://parleys.com/display/PARLEYS/Interview+with+Bob+Lee+at+JavaPolis%2707?showComments=true&quot;&gt;&lt;img src=&quot;http://parleys.com/download/attachments/6815785/thumbnail1.jpg&quot; style=&quot;padding: 10px 0px 10px 10px&quot; align=&quot;right&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;The history of and philosophy behind Guice, what problems it solves, how we implemented it, the secret sauce in Guice&#39;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&#39;t fly for much longer. Readability doesn&#39;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&#39;d like to see dependency injection on mobile devices and deeply integrated into Java SE. One day, many of the problems we&#39;re solving in a separate framework will be addressed seamlessly by the core platform, and we&#39;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=&quot;http://code.google.com/p/google-collections/&quot;&gt;Google Collections&lt;/a&gt;, an excellent open source project led by Guice co-lead &lt;a href=&quot;http://smallwig.blogspot.com/&quot;&gt;Kevin Bourrillion&lt;/a&gt;. Check it out if you haven&#39;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&#39;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='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/628723975310252015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2008/01/in-hot-seat.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/628723975310252015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/628723975310252015'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2008/01/in-hot-seat.html' title='In the hot seat'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>3</thr:total></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&#39;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=&quot;http://crazybob.org/2007/06/introduction-to-guice-video-redux.html&quot;&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='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/7223925806839443408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2007/12/guice-javapolis.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7223925806839443408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/7223925806839443408'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2007/12/guice-javapolis.html' title='Guice @ Javapolis'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>9</thr:total></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=&quot;http://www.openhandsetalliance.com/images/android_robot.gif&quot; width=&quot;125&quot; height=&quot;137&quot; align=&quot;right&quot;&gt;
In roughly 24 hours, we&#39;ll release the &lt;a href=&quot;http://code.google.com/android/&quot;&gt;Android SDK&lt;/a&gt;, and I&#39;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=&quot;http://code.google.com/android/&quot;&gt;It&#39;s alive!&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.crazybob.org/feeds/3433575267865443534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.crazybob.org/2007/11/i-dream-of-electric-sheep.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3433575267865443534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12626926/posts/default/3433575267865443534'/><link rel='alternate' type='text/html' href='http://blog.crazybob.org/2007/11/i-dream-of-electric-sheep.html' title='I dream of electric sheep.'/><author><name>Bob</name><uri>http://www.blogger.com/profile/17659001534221131143</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://farm1.static.flickr.com/87/277001636_c52e65c63f_m.jpg'/></author><thr:total>9</thr:total></entry></feed>