<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5638372</id><updated>2012-01-26T07:25:15.011-06:00</updated><category term='ruby'/><category term='cooking'/><category term='tools'/><category term='javascript'/><category term='clojure'/><category term='swing'/><category term='ani'/><category term='perl'/><category term='maven'/><category term='kotlin'/><category term='lua'/><category term='protobuf'/><category term='c#'/><category term='make'/><category term='osgi'/><category term='guice'/><category term='agile'/><category term='git'/><category term='python'/><category term='spring'/><category term='functional'/><category term='haskell'/><category term='azul'/><category term='performance'/><category term='physics'/><category term='c++'/><category term='code generation'/><category term='linux'/><category term='jmockit'/><category term='distributed'/><category term='math'/><category term='scala'/><category term='ant'/><category term='java'/><category term='cygwin'/><category term='disruptor'/><category term='zing'/><category term='programming'/><category term='aop'/><category term='lisp'/><category term='intellij'/><category term='algorithm'/><category term='jvm'/><category term='bash'/><category term='ml'/><category term='go'/><category term='concurrency'/><category term='corba'/><category term='kde'/><category term='c'/><category term='android'/><category term='posix'/><category term='unix'/><category term='lotro'/><category term='nexus one'/><category term='design'/><category term='network'/><category term='article'/><category term='testing'/><category term='jms'/><category term='google'/><category term='jdk7'/><title type='text'>binkley's BLOG</title><subtitle type='html'>Just myself.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default?start-index=101&amp;max-results=100'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>615</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5638372.post-7801172570898763292</id><published>2012-01-25T13:11:00.001-06:00</published><updated>2012-01-25T13:11:48.829-06:00</updated><title type='text'>1-1 beats N-M</title><content type='html'>&lt;p&gt;SpiderMonkey, the JavaScript engine in Firefox, is moving towards a 1-1 threading model, away from a N-M model: &lt;a href="http://blog.mozilla.com/luke/2012/01/24/jsruntime-is-now-officially-single-threaded/"&gt;&lt;cite&gt;JSRuntime is now officially single-threaded&lt;/cite&gt;&lt;/a&gt;.  Let me explain by looking back.&lt;/p&gt; &lt;p&gt;In Solaris &lt;a href="http://java.sun.com/docs/hotspot/threads/threads.html" title="Nice picture"&gt;the threading model is M-N&lt;/a&gt;, that is, for each program with N user threads there are M kernel threads servicing the program.  This was thought to be the most flexible design and kernel threads were a limited resource.&lt;/p&gt; &lt;p&gt;Linux &lt;a href="http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library" title="You can always count on Linux to do the right thing – after they've tried everything else!"&gt;eventually settled on a 1-1 model&lt;/a&gt;, that is, for each program with N user threads there are N kernel threads each mapped uniquely to a user thread.  This was found to be the simplest to code and the most performant in practice.&lt;/p&gt; &lt;p&gt;Back to JavaScript:&lt;/p&gt; &lt;blockquote&gt;A single SpiderMonkey runtime (that is, instance of JSRuntime) — and all the objects, strings and contexts associated with it — may only be accessed by a single thread at any given time. However, a SpiderMonkey embedding may create multiple runtimes in the same process (each of which may be accessed by a different thread).&lt;/blockquote&gt; &lt;p&gt;I read this to say: 1-1 mapping from SpiderMonkey to user thread.  The same simplifications and performance gains Linux saw from the 1-1 model will be gained for SpiderMonkey.&lt;/p&gt; &lt;p&gt;Old lessons learned again; better than the alternative.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-7801172570898763292?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/7801172570898763292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=7801172570898763292' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7801172570898763292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7801172570898763292'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/1-1-beats-n-m.html' title='1-1 beats N-M'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6267871744699087083</id><published>2012-01-24T16:59:00.002-06:00</published><updated>2012-01-24T17:00:49.132-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Spawn of Java</title><content type='html'>&lt;p&gt;Brian McCallister writes &lt;a href="http://skife.org/java/2012/01/24/java_daemonization_with_gressil.html"&gt;&lt;cite&gt;Java Daemonization with posix_spawn(2)&lt;/cite&gt;&lt;/a&gt;, or as I like to think of it, &lt;em&gt;Spawn of Java&lt;/em&gt;.  The problem description:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;The &lt;a href='http://www.enderunix.org/docs/eng/daemon.php'&gt;traditional way&lt;/a&gt; of daemonizing a process involves forking the process and daemonizing it from the current running state. This doesn&amp;#8217;t work so well in Java because the JVM relies on several additional worker threads, and &lt;code&gt;fork&lt;/code&gt; only keeps the thread calling &lt;code&gt;fork&lt;/code&gt;. So, basically, you need to start a new JVM from scratch to create a child process.&lt;/p&gt; &lt;p&gt;The traditional way of launching a new program is to &lt;a href='http://www-h.eng.cam.ac.uk/help/tpl/unix/fork.html'&gt;&lt;code&gt;fork&lt;/code&gt; and &lt;code&gt;exec&lt;/code&gt;&lt;/a&gt; the program you wish to start. Sadly, this also fails on Java because the calls to &lt;code&gt;fork&lt;/code&gt; and &lt;code&gt;exec&lt;/code&gt; are seperate, non-atomic (in the platonic sense, not the JMM sense) operations. There is no guarantee that the exec will be reached, or that the memory state of the JVM will even be sound when the exec is reached, because you could be in the middle of a garbage collection and pointers could be all over. In practice, this would happen exceptionally rarely, at least. Charles Nutter has talked &lt;a href='http://blog.headius.com/2009/05/fork-and-exec-on-jvm-jruby-to-rescue.html'&gt;about this problem&lt;/a&gt; in JRuby as well.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Visit Brian's post for the solution.&lt;/p&gt; &lt;p&gt;(You may also enjoy his related &lt;a href="http://skife.org/java/2012/01/10/posix_from_java.html"&gt;&lt;cite&gt;POSIX from Java&lt;/cite&gt;&lt;/a&gt; post.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6267871744699087083?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6267871744699087083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6267871744699087083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6267871744699087083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6267871744699087083'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/spawn-of-java.html' title='Spawn of Java'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-435883330083750696</id><published>2012-01-24T14:49:00.001-06:00</published><updated>2012-01-24T14:49:10.216-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Major code irritants</title><content type='html'>&lt;p&gt;I could not agree more with this Java anti-pattern: &lt;a href="http://www.odi.ch/prog/design/newbies.php#43"&gt;&lt;cite&gt;Storing money in floating point variables&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;In my interviews of Java candidates (or C++, for that matter) I always include questions about creating a hypothetical &lt;code&gt;Money&lt;/code&gt; class, and pay close attention to their ideas for representation.  International candidates often fare better on not assuming US dollars, but most all candidates fail completely on avoiding floating point.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-435883330083750696?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/435883330083750696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=435883330083750696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/435883330083750696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/435883330083750696'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/major-code-irritants.html' title='Major code irritants'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4802723906073834842</id><published>2012-01-13T17:12:00.001-06:00</published><updated>2012-01-14T12:02:09.684-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='protobuf'/><title type='text'>Defaulting message fields in protobuf</title><content type='html'>&lt;p&gt;Not well documented is the technique for defaulting message fields in protobuf.  Say you have a field of message type, named "start" here:&lt;/p&gt; &lt;pre class="code"&gt;message Complex {
    required int64 real = 1;
    optional int64 imaginary = 2 [default = 0];
}

message Vector {
    required Complex start = 1;
    required int64 length = 2;
}&lt;/pre&gt; &lt;p&gt;How to you provide a default value, say at the origin?  Like this:&lt;/p&gt; &lt;pre class="code"&gt;import "google/protobuf/descriptor.proto";

extend google.protobuf.FieldOptions {
    // Pick the field number that is right for you!
    optional Complex complex = 50000;
}

message Vector {
    optional Complex start = 1
    [(complex) = { real: 0 imaginary: 0 }];
    required int64 length = 2;
}&lt;/pre&gt; &lt;p&gt;See the &lt;a href="http://code.google.com/apis/protocolbuffers/docs/proto.html#options" title="Language Guide - Protocol Buffers"&gt;&lt;cite&gt;Custom Options&lt;/cite&gt; section&lt;/a&gt; for details.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4802723906073834842?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4802723906073834842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4802723906073834842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4802723906073834842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4802723906073834842'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/defaulting-message-fields-in-protobuf.html' title='Defaulting message fields in protobuf'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-7176845176098888686</id><published>2012-01-11T19:33:00.001-06:00</published><updated>2012-01-11T19:33:08.106-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>Write your own kernel</title><content type='html'>&lt;p&gt;James Malloy &lt;a href="http://www.jamesmolloy.co.uk/tutorial_html/" title="Roll your own toy UNIX-clone OS"&gt;will show you how!&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-7176845176098888686?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/7176845176098888686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=7176845176098888686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7176845176098888686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7176845176098888686'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/write-your-own-kernel.html' title='Write your own kernel'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2073815450728087521</id><published>2012-01-11T10:13:00.004-06:00</published><updated>2012-01-11T10:13:58.551-06:00</updated><title type='text'>Better than null</title><content type='html'>&lt;p&gt;&lt;a href="http://joelneely.wordpress.com/2010/04/17/dont-return-null-use-a-tail-call/" title="Don’t return null; use a tail call"&gt;A rich, delightful post&lt;/a&gt; from Joel Neely on an alternative to returning &lt;code&gt;null&lt;/code&gt; to signal "not found" or "No": have the caller supply a callback with appropriate methods for condition signaling.  In Java:&lt;/p&gt; &lt;pre class="code"&gt;interface Found {
    void present(final String name);

    void absent(final String name);
}

class Phonebook {
    private final Set&amp;lt;String&amp;gt; names = new HashSet&amp;lt;&amp;gt;;

    void add(final String name) {
        names.add(name);
    }

    void remove(final String name) {
        names.remove(name);
    }

    void find(final String name, final Found found) {
        if (names.contains(name))
            found.present(name);
        else
            found.absent(name);
    }
}

class LookupPhone extends Phone implements Found {
    private final Phonebook phonebook;

    LookupPhone(final Phonebook phonebook) {
        this.phonebook = phonebook;
    }

    @Override
    public void present(final String name) {
        ringUp(name);
    }

    @Override
    public void absent(final String name) {
        complainIsUnknown(name);
    }

    void placeCall(final String name) {
        phonebook.find(name, this);
    }
}&lt;/pre&gt; &lt;p&gt;(Keyed directly into the editor: apologies for typos.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2073815450728087521?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2073815450728087521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2073815450728087521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2073815450728087521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2073815450728087521'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/better-than-null.html' title='Better than null'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-354168283523179047</id><published>2012-01-10T10:27:00.001-06:00</published><updated>2012-01-10T10:27:30.203-06:00</updated><title type='text'></title><content type='html'>&lt;p&gt;Bill Bejeck &lt;a href="http://codingjunkie.net/guava-eventbus/" title="Event Programming with Google Guava EventBus"&gt;writes on Guava EventBus&lt;/a&gt;.  This is very similar to the "MagicBus" code I wrote for a client while at ThoughtWorks in the mid-naughts.  Essentially it is an in-process event bus respecting Java method signatures rather than a string-based topic space.  You can write decoupled code in a pub-sub style within your own application.&lt;/p&gt; &lt;p&gt;In some weird sense it is an implementation of the &lt;a href="http://en.wikipedia.org/wiki/COMEFROM"&gt;&lt;code&gt;COMEFROM&lt;/code&gt;&lt;/a&gt; instruction.  When a "caller" publishes the right parameter list, subscribing methods are invoked as if called directly.  Adding new subscribers changes the meaning of the call site.  The difference is that control returns to the publisher after all subscribers run; &lt;code&gt;COMEFROM&lt;/code&gt; is a complete transfer of control and does not multiplex.&lt;/p&gt; &lt;p&gt;Long live &lt;a href="http://catb.org/~esr/intercal/" title="The INTERCAL Resources Page "&gt;INTERCAL!&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-354168283523179047?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/354168283523179047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=354168283523179047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/354168283523179047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/354168283523179047'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2012/01/bill-bejeck-writes-on-guava-eventbus.html' title=''/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4775176701052268812</id><published>2011-12-29T11:18:00.000-06:00</published><updated>2011-12-29T11:18:05.560-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><title type='text'>Loading the dice</title><content type='html'>&lt;p&gt;&lt;a href="http://www.keithschwarz.com/darts-dice-coins/" title="Darts, Dice, and Coins: Sampling from a Discrete Distribution"&gt;A thoughtful algorithm/data structure post&lt;/a&gt; from Keith Schwartz on dice rolling, applicable to a broad range of simulations, using &lt;a href="http://www.jstor.org/pss/2683739" title="JSTOR: On the Alias Method for Generating Random Variables from a Discrete Distribution"&gt;&lt;cite&gt;the Alias Method&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4775176701052268812?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4775176701052268812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4775176701052268812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4775176701052268812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4775176701052268812'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/12/loading-dice.html' title='Loading the dice'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5794757230434454370</id><published>2011-12-16T11:59:00.001-06:00</published><updated>2011-12-16T11:59:33.952-06:00</updated><title type='text'>Linking profile to Google+</title><content type='html'>&lt;p&gt;I've linked my Blogger profile to my Google+ account.  Please comment if you have any thoughts on this, or if you see anything odd or missing as a result.  Thanks!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5794757230434454370?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5794757230434454370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5794757230434454370' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5794757230434454370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5794757230434454370'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/12/linking-profile-to-google.html' title='Linking profile to Google+'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1720452760921491440</id><published>2011-12-16T11:58:00.000-06:00</published><updated>2011-12-16T11:58:41.551-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java server hiccups</title><content type='html'>&lt;p&gt;Gil Tene at Azul has great insight into Java server performance gaffs.  He calls them &lt;a href="http://www.azulsystems.com/blog/gil/2011-12-13-how-java-got-the-hiccups" title="How Java got the Hiccups"&gt;&lt;b&gt;hiccups&lt;/b&gt;&lt;/a&gt; and provides tooling to find them.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1720452760921491440?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1720452760921491440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1720452760921491440' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1720452760921491440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1720452760921491440'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/12/gil-tene-at-azul-has-great-insight-into.html' title='Java server hiccups'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1692624739092914793</id><published>2011-12-15T12:24:00.002-06:00</published><updated>2011-12-15T12:25:21.215-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><title type='text'>Monad in Java</title><content type='html'>&lt;p&gt;The &lt;a href="http://kerflyn.wordpress.com/2011/12/05/from-optional-to-monad-with-guava/" title="From Optional to Monad with Guava"&gt;shortest, clearest description of monads&lt;/a&gt; in Java I have read:&lt;/p&gt; &lt;pre class="code"&gt;public class OptionalMonad {
    public static &amp;lt;T&amp;gt; Optional&amp;lt;T&amp;gt; unit(T value) {
        return Optional.of(value);
    }

    public static &amp;lt;T, U&amp;gt; Optional&amp;lt;U&amp;gt; bind(
            Optional&amp;lt;T&amp;gt; value,
            Function&amp;lt;T, Optional&amp;lt;U&amp;gt;&amp;gt; function) {
        if (value.isPresent()) return function.apply(value.get());
        else return Optional.absent();
    }
}&lt;/pre&gt; &lt;p&gt;Thanks to &lt;a href="http://kerflyn.wordpress.com/about/" title="Who am I?"&gt;François Sarradin&lt;/a&gt; in a very nice post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1692624739092914793?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1692624739092914793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1692624739092914793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1692624739092914793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1692624739092914793'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/12/monad-in-java.html' title='Monad in Java'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5911880272752576565</id><published>2011-12-09T07:57:00.001-06:00</published><updated>2011-12-09T08:01:04.863-06:00</updated><title type='text'>Netflix circuit breaker</title><content type='html'>&lt;p&gt;Ben Schmaus of the Netflix team posts a lovely description of the &lt;a href="http://techblog.netflix.com/2011/12/making-netflix-api-more-resilient.html" title="Making the Netflix API More Resilient "&gt;degraded service features&lt;/a&gt; of their API.  The real life use case is compelling.  The dashboard is just brilliant.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5911880272752576565?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5911880272752576565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5911880272752576565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5911880272752576565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5911880272752576565'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/12/netflix-circuit-breaker.html' title='Netflix circuit breaker'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-456724070230033209</id><published>2011-11-30T14:13:00.001-06:00</published><updated>2011-12-06T05:46:06.303-06:00</updated><title type='text'>The death of HyperCard, a whodunit</title><content type='html'>&lt;p&gt;Stanislav Datskovskiy posts &lt;a href="http://www.loper-os.org/?p=568" title=Why Hypercard Had to Die"&gt;his theory&lt;/a&gt; on the murder of HyperCard.  It wasn't the butler.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-456724070230033209?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/456724070230033209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=456724070230033209' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/456724070230033209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/456724070230033209'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/death-of-hypercard-whodunit.html' title='The death of HyperCard, a whodunit'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8372990507500062553</id><published>2011-11-30T10:01:00.001-06:00</published><updated>2011-11-30T10:04:30.482-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Baker's Treadmill and Disruptor</title><content type='html'>&lt;p&gt;Flying Frog Consultancy in Cambridge, England posts &lt;a href="http://flyingfrogblog.blogspot.com/2011/11/lmax-disruptor-and-bakers-treadmill.html"&gt;a nice comparison&lt;/a&gt; between Disruptor and low-latency GC algorithms:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;The core of [Disruptor's] idea is to accomplish all of this message passing using a single shared data structure, the disruptor, rather than using several separate concurrent queues.&lt;/p&gt; &lt;p&gt;Baker's Treadmill is a low-latency garbage collection algorithm. Allocated blocks in the heap are linked together to form a cyclic doubly-linked list that is divided into four segments using four iterators that chase each other around the ring as heap blocks are allocated, traced and freed.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Cleverly observed with a good diagram.  As they say, read the whole thing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8372990507500062553?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8372990507500062553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8372990507500062553' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8372990507500062553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8372990507500062553'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/flying-frog-consultancy-in-cambridge.html' title='Baker&apos;s Treadmill and Disruptor'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3964660734557139582</id><published>2011-11-22T14:37:00.001-06:00</published><updated>2011-11-22T14:56:45.453-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Microbenchmarking and JVM magic</title><content type='html'>&lt;p&gt;Martin Thompson posts on what I call &lt;a href="http://mechanical-sympathy.blogspot.com/2011/11/biased-locking-osr-and-benchmarking-fun.html"&gt;microbenchmarking and JVM magic&lt;/a&gt;, &lt;cite&gt;Biased Locking, OSR, and Benchmarking Fun&lt;/cite&gt;.  It is a good praticum to Cliff Click's &lt;a href="http://www.azulsystems.com/blog/cliff/2011-11-22-what-the-heck-is-osr-and-why-is-it-bad-or-good"&gt;&lt;cite&gt;What the heck is OSR and why is it Bad (or Good)?&lt;/cite&gt;&lt;/a&gt;.  OSR is the kind of JVM magic that both surprises and frightens, but makes perfect sense.  I walked a colleague through OSR and he agreed with a shrug: the thing you are glad &lt;em&gt;someone else&lt;/em&gt; wrote, &lt;a href="http://catb.org/jargon/html/H/hair.html"&gt;excess hair&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3964660734557139582?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3964660734557139582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3964660734557139582' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3964660734557139582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3964660734557139582'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/microbenchmarking-and-jvm-magic.html' title='Microbenchmarking and JVM magic'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5013454853501400616</id><published>2011-11-22T05:32:00.001-06:00</published><updated>2011-11-22T05:35:08.050-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Colebourne on Scala: EJB2 redux?</title><content type='html'>&lt;p&gt;Stephen Colebourne posts a lengthy critique of Scala, &lt;a href="http://blog.joda.org/2011/11/scala-feels-like-ejb-2-and-other.html"&gt;&lt;cite&gt;Scala feels like EJB2&lt;/cite&gt;&lt;/a&gt;.  Scala attracts my inner physicist but brings concern to my practical programmer.  Colebourne makes these implicit thoughts explicit.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5013454853501400616?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5013454853501400616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5013454853501400616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5013454853501400616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5013454853501400616'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/colebourne-on-scala-ejb2-redux.html' title='Colebourne on Scala: EJB2 redux?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2667082204023400962</id><published>2011-11-18T11:15:00.001-06:00</published><updated>2011-11-18T11:22:12.063-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Defeating SSL certificate validation in Java</title><content type='html'>&lt;p&gt;This post is a hack.  You have been warned.&lt;/p&gt; &lt;p&gt;My employer swaps out SSL certificates traversing the corporate firewall.  It is a financial firm with regulatory responsibilities that require monitoring all traffic leaving the company, including encrypted traffic.&lt;/p&gt; &lt;p&gt;One side effect is trouble with well-meaning programs which validate SSL certificates before trusting an encrypted connection.  These validations fail using the self-signed replacement certificate.&lt;/p&gt; &lt;p&gt;Maven is such a tool:&lt;/p&gt; &lt;blockquote&gt;[WARNING] Could not transfer metadata com.devspan.vendor.envjs:envjs-rhino/maven-metadata.xml from/to sonatype-oss (https://oss.sonatype.org/content/groups/public): Error transferring file: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target&lt;/blockquote&gt; &lt;p&gt;The remark about "PKIX path building failed" is characteristic of the probelm.&lt;/p&gt; &lt;p&gt;There is lots of good advice on fixing this correctly, say, &lt;a href="http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services"&gt;here&lt;/a&gt;, &lt;a href="http://www.nakov.com/blog/2009/07/16/disable-certificate-validation-in-java-ssl-connections/"&gt;here&lt;/a&gt; or &lt;a href="http://stackoverflow.com/questions/1828775/httpclient-and-ssl"&gt;here&lt;/a&gt;.  But none of them work just now; I cannot edit the locked-down trust store for Java, it does not already contain the aforementioned replacement certificate, and I do not want to build a custom Maven to work around the problem.&lt;/p&gt; &lt;p&gt;Enter the hack.&lt;/p&gt; &lt;pre&gt;$ mvn -Djavax.net.ssl.trustStore=/dev/null package&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2667082204023400962?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2667082204023400962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2667082204023400962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2667082204023400962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2667082204023400962'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/defeating-ssl-certificate-validation-in.html' title='Defeating SSL certificate validation in Java'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4443152314624274931</id><published>2011-11-08T12:11:00.004-06:00</published><updated>2011-11-08T12:12:08.561-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Martin Thompson on lock cost</title><content type='html'>&lt;p&gt;Anything Martin Thompson says about performance is usually worth a good study.  No exception is &lt;a href="http://mechanical-sympathy.blogspot.com/2011/11/locks-condition-variables-latency.html" title="Locks &amp;amp; Condition Variables - Latency Impact "&gt;&lt;cite&gt;Locks &amp;amp; Condition Variables - Latency Impact&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;  His takeaway points: &lt;ol&gt;&lt;li&gt;The one-way latency to signal a change is pretty much the same as what is considered current state of the art for network hops between nodes via a switch.&lt;/li&gt; &lt;li&gt;The impact is clear when letting the OS choose what CPUs the threads get scheduled on rather than pinning them manually.&lt;/li&gt; &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4443152314624274931?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4443152314624274931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4443152314624274931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4443152314624274931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4443152314624274931'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/martin-thompson-on-lock-cost.html' title='Martin Thompson on lock cost'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2749195677185172076</id><published>2011-11-08T11:56:00.001-06:00</published><updated>2011-11-08T11:56:38.593-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zing'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='azul'/><title type='text'>Azul's approach for low-latency Java servers</title><content type='html'>&lt;p&gt;I no longer work in the low-latency space.  Still Azul's completion of &lt;a href="http://www.infoq.com/news/2011/11/zing5-native" title="Azul's Pauseless Garbage Collector Goes Native on Linux"&gt;a non-VM "pause-less" JVM for Linux&lt;/a&gt; is exciting.  (Also running a JVM on a VM was too recursive.)  May it be a benefit to those who need low-latency java servers.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2749195677185172076?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2749195677185172076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2749195677185172076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2749195677185172076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2749195677185172076'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/azuls-approach-for-low-latency-java.html' title='Azul&apos;s approach for low-latency Java servers'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8659722846210369614</id><published>2011-11-08T04:52:00.001-06:00</published><updated>2011-11-08T04:52:22.297-06:00</updated><title type='text'>Whither JDK8?</title><content type='html'>&lt;p&gt;Stephen Colebourne posts on &lt;a href="http://blog.joda.org/2011/11/future-is-in-jeps.html" title="The future is in the JEPs"&gt;the future of JDK8&lt;/a&gt; based on current JEPs.  Among the possiblities, I'm looking forward to:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://openjdk.java.net/jeps/102"&gt;Getting the PID of the current process&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://openjdk.java.net/jeps/108"&gt;Multi-style collections&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://openjdk.java.net/jeps/118"&gt;Reflection for parameter names&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://openjdk.java.net/jeps/119"&gt;Significant help for annotation writers (the compiler model stinks for usability)&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8659722846210369614?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8659722846210369614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8659722846210369614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8659722846210369614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8659722846210369614'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/whither-jdk8.html' title='Whither JDK8?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5299617409326106437</id><published>2011-11-07T12:24:00.001-06:00</published><updated>2011-11-07T12:24:57.068-06:00</updated><title type='text'>Punk rock languages</title><content type='html'>&lt;p&gt;I love Chris Adamson's description of &lt;a href="http://pragprog.com/magazines/2011-03/punk-rock-languages" title="The Pragmatic Bookshelf | PragPub 2011-03 | Punk Rock Languages"&gt;&lt;cite&gt;Punk Rock Languages&lt;/cite&gt;&lt;/a&gt;.  His introduction should get your blood flowing:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;That C has won the end-user practicality battle is obvious to everyone except developers.&lt;/p&gt; &lt;p&gt;The year is 1978, and the first wave of punk rock is reaching its nihilistic peak with infamous U.K. band the Sex Pistols touring the United States and promptly breaking up by the time they reach the West Coast. Elsewhere, Brian Kernighan and Dennis Ritchie are putting the finishing touches on their book The C Programming Language, which will become the de facto standardization of the language for years. While totally unrelated, these two events share a common bond: the ethos of both punk rock and C have lasted for decades, longer than anyone in 1978 could possibly have imagined.&lt;/p&gt; &lt;p&gt;And in many important ways, C is the programmer’s punk rock: it’s fast, messy, dangerous, and perfectly willing to kick your ass, but it’s also an ideal antidote to the pretensions and vanities that plague so many new programming languages. In an era of virtual machines and managed environments, C is the original Punk Rock Language.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5299617409326106437?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5299617409326106437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5299617409326106437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5299617409326106437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5299617409326106437'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/punk-rock-languages.html' title='Punk rock languages'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6982033685645903231</id><published>2011-11-07T08:31:00.001-06:00</published><updated>2011-11-07T08:31:34.707-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Peregrine: Help for programming concurrency</title><content type='html'>&lt;p&gt;Good news from Columbia University.  Peregrine is automated software to aid in programming concurrency.  More in the ACM: &lt;a href="http://cacm.acm.org/news/140067-major-breakthrough-improves-software-reliability-and-security/fulltext"&gt;&lt;cite&gt;Major Breakthrough Improves Software Reliability and Security&lt;/cite&gt;&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt;"Our main finding in developing Peregrine is that we can make threads deterministic in an efficient and stable way: Peregrine can compute a plan for allowing when and where a thread can 'change lanes' and can then place barriers between the lanes, allowing threads to change lanes only at fixed locations, following a fixed order," says Columbia professor Junfeng Yang. "Once Peregrine computes a good plan without collisions for one group of threads, it can reuse the plan on subsequent groups to avoid the cost of computing a new plan for each new group."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6982033685645903231?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6982033685645903231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6982033685645903231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6982033685645903231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6982033685645903231'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/11/peregrine-help-for-programming.html' title='Peregrine: Help for programming concurrency'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-502382028218068765</id><published>2011-10-28T20:50:00.000-05:00</published><updated>2011-10-28T20:50:14.506-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>Herb Sutter: Elements of Modern C++ Style</title><content type='html'>&lt;p&gt;The always readable Herb Sutter begins &lt;a href="http://herbsutter.com/elements-of-modern-c-style/"&gt;&lt;cite&gt;Elements of Modern C++ Style&lt;/cite&gt;&lt;/a&gt; with:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;The C++11 standard offers &lt;a href="http://www2.research.att.com/~bs/C++0xFAQ.html"&gt;many useful new features&lt;/a&gt;. This page focuses specifically and only on those features that make C++11 really feel like a new language compared to C++98, because:&lt;/p&gt;&lt;ul&gt; &lt;li&gt;They change the styles and idioms you’ll use when writing C++ code, often including the way you’ll design C++ libraries. For example, you’ll see more smart pointer parameters and return values, and functions that return big objects by value.&lt;/li&gt; &lt;li&gt;They will be used so pervasively that you’ll probably see them in most code examples. For example, virtually every five-line modern C++ code example will say “auto” somewhere.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Use the other great C++11 features too. But get used to these ones first, because these are the pervasive ones that show why C++11 code is clean, safe, and fast – just as clean and safe as code written in any other modern mainstream language, and with C++’s traditional to-the-metal performance as strong as ever.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;This sounds good.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-502382028218068765?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/502382028218068765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=502382028218068765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/502382028218068765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/502382028218068765'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/herb-sutter-elements-of-modern-c-style.html' title='Herb Sutter: Elements of Modern C++ Style'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-7349845839178944402</id><published>2011-10-24T11:52:00.003-05:00</published><updated>2011-10-24T11:52:40.865-05:00</updated><title type='text'>Focus, focus, focus</title><content type='html'>&lt;p&gt;Steve Jobs, &lt;a href="http://googlesystem.blogspot.com/2011/10/how-steve-jobs-influenced-googles.html" title="How Steve Jobs Influenced Google's Restructuring"&gt;role-model for Google CEO.&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-7349845839178944402?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/7349845839178944402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=7349845839178944402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7349845839178944402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7349845839178944402'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/focus-focus-focus.html' title='Focus, focus, focus'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3634868876304754837</id><published>2011-10-24T10:12:00.000-05:00</published><updated>2011-10-24T10:12:54.075-05:00</updated><title type='text'>The 300</title><content type='html'>&lt;p&gt;&lt;a href="http://www.scriptol.com/programming/list-algorithms.php"&gt;A collation of the top 300 algorithms&lt;/a&gt;.  Please contribute implementations.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3634868876304754837?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3634868876304754837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3634868876304754837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3634868876304754837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3634868876304754837'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/300.html' title='The 300'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6113467492655235630</id><published>2011-10-20T20:34:00.004-05:00</published><updated>2011-10-20T20:34:53.986-05:00</updated><title type='text'>Why does blogger republish my posts so often?</title><content type='html'>&lt;p&gt;Watching the ThoughtWorks Alumni aggregator feed, I see my own posts reappear frequently in batches.  I'll see posts last edited days ago suddenly repost.  Any suggestion on stopping this misbehavior would be appreciated.&lt;/p&gt; &lt;p&gt;Cheers,&lt;br/&gt;--binkley&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6113467492655235630?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6113467492655235630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6113467492655235630' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6113467492655235630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6113467492655235630'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/why-does-blogger-republish-my-posts-so.html' title='Why does blogger republish my posts so often?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4764775722019825397</id><published>2011-10-19T13:14:00.000-05:00</published><updated>2011-10-19T13:14:11.282-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><title type='text'>When it rains, it pours</title><content type='html'>&lt;p&gt;More on &lt;a href="http://binkley.blogspot.com/2011/10/thoughtworks-neal-ford-posts-great.html" title="Neal Ford on functional programming "&gt;one of my favorite themes&lt;/a&gt;: Romain Prieto provides &lt;a href="http://blog.cuttleworks.com/2011/10/expressive-code-guava-lambdaj-hamcrest/" title="Expressive code: combining Guava, LambdaJ and Hamcrest"&gt;&lt;cite&gt;Expressive code: combining Guava, LambdaJ and Hamcrest&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4764775722019825397?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4764775722019825397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4764775722019825397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4764775722019825397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4764775722019825397'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/when-it-rains-it-pours.html' title='When it rains, it pours'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2525514968555034826</id><published>2011-10-19T07:07:00.000-05:00</published><updated>2011-10-19T07:08:35.574-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kotlin'/><title type='text'>Kotlin and delegation</title><content type='html'>&lt;p&gt;I have harped on Java for some time &lt;a href="http://binkley.blogspot.com/2007/11/followup-to-feature-request-for-jdk7.html" title="Followup to Feature request for JDK7: delegation"&gt;to add language support for delegation&lt;/a&gt;.  Well, Java is not headed that direction anytime soon.  But Kotlin delivers!&lt;/p&gt; &lt;p&gt;Saying:&lt;/p&gt; &lt;pre class="code"&gt;class Derived(b : Base) : Base by b&lt;/pre&gt; &lt;p&gt;forwards method calls on "Derived" to "Base" through the instance of Base named "b".  &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Classes+and+Inheritance#ClassesandInheritance-Delegation"&gt;Nifty!&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Kotlin is so full of good ideas it's hard to know where to start.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2525514968555034826?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2525514968555034826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2525514968555034826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2525514968555034826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2525514968555034826'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/kotlin-and-delegation.html' title='Kotlin and delegation'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6543120101049376693</id><published>2011-10-18T15:50:00.003-05:00</published><updated>2011-10-20T20:35:21.383-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional'/><title type='text'>Neal Ford on functional programming</title><content type='html'>&lt;p&gt;ThoughtWork's Neal Ford posts &lt;a href="http://www.ibm.com/developerworks/java/library/j-ft6/index.html"&gt;a great discussion of object-oriented vs. functional style&lt;/a&gt; for coupling and composition.  Functional is where it's at.  Read Neal to see why.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6543120101049376693?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6543120101049376693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6543120101049376693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6543120101049376693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6543120101049376693'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/thoughtworks-neal-ford-posts-great.html' title='Neal Ford on functional programming'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2286627858838154810</id><published>2011-10-14T05:22:00.000-05:00</published><updated>2011-10-14T05:22:30.375-05:00</updated><title type='text'>Amazon and SOA</title><content type='html'>&lt;p&gt;&lt;a href="http://steverant.pen.io/" title="Stevey's Google Platforms Rant"&gt;Steve Yegge's rant&lt;/a&gt; really describes how to make SOA work at full-on scales.  This is pure gold:&lt;/p&gt; &lt;blockquote&gt;[M]onitoring and QA are the same thing. You'd never think so until you try doing a big SOA. But when your service says "oh yes, I'm fine", it may well be the case that the only thing still functioning in the server is the little component that knows how to say "I'm fine, roger roger, over and out" in a cheery droid voice. In order to tell whether the service is actually responding, you have to make individual calls. The problem continues recursively until your monitoring is doing comprehensive semantics checking of your entire range of services and data, at which point it's indistinguishable from automated QA. So they're a continuum.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2286627858838154810?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2286627858838154810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2286627858838154810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2286627858838154810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2286627858838154810'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/amazon-and-soa.html' title='Amazon and SOA'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1155638105042616364</id><published>2011-10-08T09:32:00.000-05:00</published><updated>2011-10-08T09:32:11.429-05:00</updated><title type='text'>Memory for nothing and chips for free</title><content type='html'>&lt;p&gt;As a long time Linux user, &lt;a href="http://blogs.msdn.com/b/b8/archive/2011/10/07/reducing-runtime-memory-in-windows-8.aspx" title="Reducing runtime memory in Windows 8"&gt;this quote from MSDN&lt;/a&gt; nearly spilled my coffee (emphasis mine):&lt;/p&gt; &lt;blockquote&gt;Fundamentals such as memory usage represent a key engineering tenet of Windows 8. In building Windows 8 we set out to significantly reduce the overall runtime memory requirements of the core system. This is always good for everyone and especially in a world where people want to &lt;b&gt;run more and more apps at the same time or run on systems with only 1 or 2GB of memory&lt;/b&gt;.&lt;/blockquote&gt; &lt;p&gt;I'm happy to read this post and see engineering has a seat at the table for Windows 8.  Funny world where memory is next to free.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1155638105042616364?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1155638105042616364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1155638105042616364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1155638105042616364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1155638105042616364'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/memory-for-nothing-and-chips-for-free.html' title='Memory for nothing and chips for free'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8718644336939219273</id><published>2011-10-07T13:31:00.002-05:00</published><updated>2011-10-07T13:31:19.524-05:00</updated><title type='text'>If you say "world's best", you should be right</title><content type='html'>&lt;p&gt;Peteris Krumins publishes the &lt;a href="http://www.catonmat.net/blog/worlds-best-introduction-to-sed/"&gt;&lt;cite&gt;World's best introduction to sed&lt;/cite&gt;&lt;/a&gt;.  And he's right.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8718644336939219273?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8718644336939219273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8718644336939219273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8718644336939219273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8718644336939219273'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/if-you-say-worlds-best-you-should-be.html' title='If you say &quot;world&apos;s best&quot;, you should be right'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1795082410863104049</id><published>2011-10-07T11:52:00.001-05:00</published><updated>2011-10-07T11:52:14.960-05:00</updated><title type='text'>The power of laziness</title><content type='html'>&lt;p&gt;On the &lt;a href="http://www.cio.com.au/article/399763/lazy_project_manager_what_productive_laziness" title="The 'lazy' project manager: What is productive laziness?"&gt;power of laziness&lt;/a&gt; from Australian &lt;cite&gt;CIO Magazine&lt;/cite&gt;:&lt;/p&gt; &lt;blockquote&gt;'Progress isn't made by early risers. It's made by lazy men trying to find easier ways to do something.' Robert Heinlein (1907-1988)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1795082410863104049?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1795082410863104049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1795082410863104049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1795082410863104049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1795082410863104049'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/power-of-laziness.html' title='The power of laziness'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4542631236289254968</id><published>2011-10-07T10:53:00.002-05:00</published><updated>2011-10-07T12:10:08.050-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='kotlin'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>And Seth lived a hundred and five years, and begat Enos</title><content type='html'>&lt;p&gt;Well, Java has not been &lt;a href="http://www.oracle.com/technetwork/java/javase/overview/javahistory-timeline-198369.html" title="The Java History Timeline"&gt;around 105 years&lt;/a&gt;, but it feels like that sometimes.&lt;/p&gt; &lt;p&gt;David Polak explains &lt;a href="http://goodstuff.im/yes-virginia-scala-is-hard" title="Yes, Virginia, Scala is hard"&gt;why Scala is too hard&lt;/a&gt; to replace Java.  I laughed at this true description of JEE programming:&lt;/p&gt; &lt;blockquote&gt;Junior developers who are asked to maintain code written by senior developers have to understand the idioms and patterns in the code.  While Scala makes putting business logic at the forefront of the code (rather than distributed through a bunch of for loops and complex if statements), depending on the idioms used, decoding that logic is non-obvious.  This is a variant of the lack of idioms issue, but at the end of the day, you need a team with a mind-meld to grok some Scala code. &lt;em&gt;&amp;hellip;&lt;/em&gt; In Java, the patterns are vomited out of the IDE, so developers grow up being able to spot the patterns.  That's not true of Scala where the idioms are diverse and team/framework specific.&lt;/blockquote&gt; &lt;p&gt;How to know if Scala is right for you?&lt;/p&gt; &lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Your company has speakers at JavaOne, OSCON, Strangle Loop, QCon: Scala will be easy&lt;/li&gt; &lt;li&gt;Lunch-time discussions involve the criteria for moving from a developer to a senior developer: Scala will be hard&lt;/li&gt; &lt;li&gt;Your developers can write code in NotePad if they have to: Easy&lt;/li&gt; &lt;li&gt;Your developers stare blankly or say 3 &amp;quot;Hail Marys&amp;quot; when they hear the name &amp;quot;Zed Shaw&amp;quot;: Scala == Hard&lt;/li&gt; &lt;li&gt;Developers all follow Dean Wampler on Twitter: Scala Easy&lt;/li&gt; &lt;li&gt;Your developers come in at 9:15 and leave before 6 and don&amp;#39;t check work email at night: Hard&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;p&gt;Given Dave's solid criteria in the posting, my organization will find Scala hard to adopt.  I am saddened, because Scala looks fun, productive and intelligent.  But my foremost job is to help my organization succeed.&lt;/p&gt; &lt;p&gt;Which brings me to &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Welcome" title="Welcome - Kotlin - Confluence"&gt;Kotlin&lt;/a&gt; (emphasis in the original):&lt;/p&gt; &lt;blockquote&gt;"Project Kotlin" is the codename for a &lt;b&gt;statically-typed JVM-targeted programming language&lt;/b&gt; developed by JetBrains and intended &lt;b&gt;for industrial use&lt;/b&gt;.&lt;/blockquote&gt; &lt;p&gt;On the Java to Scala scale Kotlin lies solidly between, &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Comparison+to+Java" title="Comparison to Java - Kotlin - Confluence"&gt;more like Java&lt;/a&gt; in some areas, &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Comparison+to+Scala" title="Comparison to Scala - Kotlin - Confluence"&gt;more like Scala&lt;/a&gt; in others, &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Properties+And+Fields" title="Properties And Fields - Kotlin - Confluence"&gt;unlike either&lt;/a&gt; in yet others.  Overall Kotlin looks like a winner for organizations looking to bail from Java but find &lt;a href="http://steve-yegge.blogspot.com/2007/02/next-big-language.html" title="Stevey's Blog Rants: The Next Big Language"&gt;Scala and friends daunting&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Kotlin may prove a winner.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4542631236289254968?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4542631236289254968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4542631236289254968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4542631236289254968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4542631236289254968'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/and-seth-lived-hundred-and-five-years.html' title='And Seth lived a hundred and five years, and begat Enos'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8926778737268318731</id><published>2011-10-06T09:11:00.000-05:00</published><updated>2011-10-06T09:11:58.215-05:00</updated><title type='text'>Architecture gone wild</title><content type='html'>&lt;p&gt;Tony Arcieri rants on &lt;a href="http://www.dzone.com/links/r/nodejs_has_jumped_the_shark.html"&gt;bad suggestions from Node.js folks&lt;/a&gt;.  His catch phrase, "It gets worse".  I love his conclusion:&lt;/p&gt; &lt;blockquote&gt;Clearly the next logical steps are to store previously computed Fibonacci numbers in MongoDB. Or you could build a system with Socket.IO which caches previously computed Fibonacci numbers client-side using a distributed hash table. Then you'd be well on your way to a multimillion dollar cloud-based Fibonacci number service. Eventually you'll probably want to build in an OpenMP C++ native extension to calculate Fibonacci numbers across multiple CPU cores. That way you'll have a truly roflscale Fibonacci web service.&lt;/blockquote&gt; &lt;p&gt;I run into this kind of thinking occassionally at work, but it is quickly tamped down before real money gets burned.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8926778737268318731?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8926778737268318731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8926778737268318731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8926778737268318731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8926778737268318731'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/architecture-gone-wild.html' title='Architecture gone wild'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1771682730840225832</id><published>2011-10-04T14:05:00.002-05:00</published><updated>2011-10-04T14:05:58.508-05:00</updated><title type='text'>OCaml in real life</title><content type='html'>&lt;p&gt;Yaron Minsky of the quant prop shop, &lt;a href="http://www.janestreet.com/"&gt;Jane Street&lt;/a&gt;, promotes OCaml in the &lt;cite&gt;ACM Queue&lt;/cite&gt; with &lt;a href="http://queue.acm.org/detail.cfm?id=2038036" title="OCaml for the Masses"&gt;&lt;cite&gt;OCaml for the Masses&lt;/cite&gt;&lt;/a&gt;.  His writing is exact, his code example illuminating and short.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1771682730840225832?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1771682730840225832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1771682730840225832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1771682730840225832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1771682730840225832'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/ocaml-in-real-life.html' title='OCaml in real life'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1944962927918420370</id><published>2011-10-04T12:27:00.003-05:00</published><updated>2011-10-20T20:35:40.004-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><title type='text'>JetBrains IntelliJ IDEA on github</title><content type='html'>&lt;p&gt;Cool beans: &lt;a href="http://blogs.jetbrains.com/idea/2011/10/intellij-idea-community-edition-now-on-github" title="IntelliJ IDEA Community Edition now on GitHub"&gt;&lt;cite&gt;IntelliJ IDEA Community Edition now on GitHub&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1944962927918420370?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1944962927918420370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1944962927918420370' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1944962927918420370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1944962927918420370'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/jetbrains-intellij-idea-on-github.html' title='JetBrains IntelliJ IDEA on github'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2596676852436229859</id><published>2011-10-04T11:03:00.001-05:00</published><updated>2011-10-04T11:03:03.844-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Dream on</title><content type='html'>&lt;p&gt;&lt;a href="http://www.dzone.com/links/r/oracle_java_8_will_be_revolution_not_evolution.html" title="Oracle: Java 8 will be revolution, not evolution"&gt;Big words from Oracle:&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt;Looking ahead to Java 9 and beyond, he explained, Oracle is already identifying key areas of development: a self-tuning JVM, improved native integration and big-data support, reification, adding tail calls and continuations, a new meta-object protocol to improve cross language support, multi-tenancy, resource management for cloud applications, and the building of heterogeneous compute models.&lt;/blockquote&gt; &lt;p&gt;If they deliever this will help poor Java.  &lt;a href="http://en.wikipedia.org/wiki/Continuation#History"&gt;60s&lt;/a&gt; &amp;amp; &lt;a href="http://en.wikipedia.org/wiki/Tail_call#History"&gt;70s&lt;/a&gt; technologies 30 years later is better than a poke in the eye with a sharp stick.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2596676852436229859?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2596676852436229859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2596676852436229859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2596676852436229859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2596676852436229859'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/10/dream-on.html' title='Dream on'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5191106716318580450</id><published>2011-09-26T12:40:00.000-05:00</published><updated>2011-09-26T12:40:32.605-05:00</updated><title type='text'>My first github fork - maven-protoc-plugin</title><content type='html'>&lt;p&gt;I just finished with my first github fork, &lt;a href="https://github.com/binkley"&gt;the maven-protoc-plugin&lt;/a&gt;.  David Trott's original works great, but does not provide all the options available to the &lt;code&gt;protoc&lt;/code&gt; program.  I added &lt;code&gt;--descriptor_set_out&lt;/code&gt; and &lt;code&gt;--include_imports&lt;/code&gt;.  Enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5191106716318580450?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5191106716318580450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5191106716318580450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5191106716318580450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5191106716318580450'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/my-first-github-fork-maven-protoc.html' title='My first github fork - maven-protoc-plugin'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-525625175552424625</id><published>2011-09-26T05:26:00.002-05:00</published><updated>2011-09-26T05:26:29.332-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven, the ideal vs. the reality</title><content type='html'>&lt;p&gt;Rob Williams describes his &lt;a href="http://java.dzone.com/articles/maven-and-nexus-not-all-pain"&gt;maven woes&lt;/a&gt;.  His solution is nexus, which is great software.  But why is this Rube Goldberg set up required?  Again, maven.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-525625175552424625?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/525625175552424625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=525625175552424625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/525625175552424625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/525625175552424625'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/maven-ideal-vs-reality.html' title='Maven, the ideal vs. the reality'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4693369506122824427</id><published>2011-09-23T08:47:00.003-05:00</published><updated>2011-09-23T08:48:19.082-05:00</updated><title type='text'>Web application scaling punch list</title><content type='html'>&lt;p&gt;Sean Hull posts &lt;a href="http://www.dzone.com/links/r/5_things_that_are_toxic_to_scalability.html"&gt;a punch list&lt;/a&gt; of do-nots for web application scalability:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Object Relational Mappers&lt;/li&gt; &lt;li&gt;Synchronous, Serial, Coupled or Locking Processes&lt;/li&gt; &lt;li&gt;One Copy of Your Database&lt;/li&gt; &lt;li&gt;Having No Metrics&lt;/li&gt; &lt;li&gt;Lack of Feature Flags&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;A good introduction for intermediate web developers looking to broaden their perspective: read the whole thing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4693369506122824427?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4693369506122824427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4693369506122824427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4693369506122824427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4693369506122824427'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/sean-hull-posts-punch-list-of-do-nots.html' title='Web application scaling punch list'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2242306156466260686</id><published>2011-09-22T08:24:00.001-05:00</published><updated>2011-09-22T08:25:50.319-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='aop'/><category scheme='http://www.blogger.com/atom/ns#' term='code generation'/><title type='text'>Java code injection</title><content type='html'>&lt;p&gt;Jakub Holý posts &lt;a href="http://java.dzone.com/articles/practical-introduction-code" title="Practical Introduction into Code Injection with AspectJ, Javassist, and Java Proxy"&gt;a first-rate introduction to code injection in Java&lt;/a&gt;.  As Jakub points out, &lt;cite&gt;The coolest thing is that it enables you to modify third party, closed-source classes and actually even JVM classes&lt;/cite&gt;.&lt;/p&gt; &lt;p&gt;My personal experience with AOP and code injection is mixed, I generally prefer code generation and classpath fiddling, but Jakub is right that one should use the best tool for the job.  If a tool is unfamiliar, it's an opportunity.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2242306156466260686?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2242306156466260686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2242306156466260686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2242306156466260686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2242306156466260686'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/jakub-holy-posts-first-rate.html' title='Java code injection'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-681903872551906873</id><published>2011-09-22T08:10:00.000-05:00</published><updated>2011-09-22T08:10:08.094-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='posix'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Non-portable</title><content type='html'>&lt;p&gt;&lt;a href="http://elliotth.blogspot.com/2011/09/how-can-i-get-threads-stack-bounds.html" title="How can I get a thread's stack bounds?"&gt;Elliott Hughes quips&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt;Oh, yeah... The "_np" suffix means "non-portable". The pthread_getattr_np(3) function is available on glibc and bionic, but not (afaik) on Mac OS. But let's face it; any app that genuinely needs to query stack addresses and sizes is probably going to contain an #ifdef or two anyway...&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-681903872551906873?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/681903872551906873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=681903872551906873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/681903872551906873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/681903872551906873'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/non-portable.html' title='Non-portable'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3127339310934916966</id><published>2011-09-09T15:25:00.000-05:00</published><updated>2012-01-20T06:58:42.977-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Generic database records in Java</title><content type='html'>&lt;p&gt;I haven't posted code in too long.  In part I am enjoying work so much these days I don't need this blog as an outlet for my creativity.  Still, I feel a touch of guilt.&lt;/p&gt; &lt;p&gt;In a trivial context this came up: &lt;em&gt;How to represent a database record efficiently and generically in Java?&lt;/em&gt;  By &lt;em&gt;efficiently&lt;/em&gt; I mean close to the efficiency of standard Java beans. By &lt;em&gt;generically&lt;/em&gt; I mean without the custom writing of standard Java beans.  The traditional map representation is certainly generic and simple to write but is not efficient in time or space.&lt;/p&gt; &lt;p&gt;With one condition a nice solution arises: generically applies only to compile-time; that is, I know at compile-time the types and labels of columns read from the database record.  That solution: &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/EnumMap.html"&gt;EnumMap&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Some code:&lt;/p&gt; &lt;pre class="code"&gt;interface Field&amp;lt;R, X extends Exception&amp;gt; {
    &amp;lt;T&amp;gt; T get(final R set) throws X;
}

class EnumRecord&amp;lt;R, X extends Exception,
                E extends Enum&amp;lt;E&amp;gt; &amp;amp; Field&amp;lt;R, X&amp;gt;&amp;gt;
            implements Field&amp;lt;E, RuntimeException&amp;gt; {
    private Map&amp;lt;E, Object&amp;gt; fields;

    EnumRecord(Class&amp;lt;E&amp;gt; enumType, R set) throws X {
        this(enumType, getKeyUniverse(enumType), set);
    }

    EnumRecord(Class&amp;lt;E&amp;gt; enumType, E[] values, R set)
            throws X {
        fields = new EnumMap&amp;lt;E, Object&amp;gt;(enumType);

        for (E field : values)
            fields.put(field, field.get(set));
    }

    EnumRecord(Class&amp;lt;E&amp;gt; enumType, Iterable&amp;lt;E&amp;gt; values, R set)
            throws X {
        fields = new EnumMap&amp;lt;E, Object&amp;gt;(enumType);

        for (E field : values)
            fields.put(field, field.get(set));
    }

    @Override
    public final &amp;lt;T&amp;gt; T get(E value) {
        return (T) fields.get(value);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (null == o || getClass() != o.getClass())
            return false;

        EnumRecord detail = (EnumRecord) o;

        return fields.equals(detail.fields);
    }

    @Override
    public int hashCode() {
        return fields.hashCode();
    }

    private static &amp;lt;K extends Enum&amp;lt;K&amp;gt;&amp;gt;
            K[] getKeyUniverse(Class&amp;lt;K&amp;gt; enumType) {
        // Copied shamelessly from EnumMap
        return SharedSecrets.getJavaLangAccess()
                .getEnumConstantsShared(enumType);
    }
}

class ResultSetRecord&amp;lt;E extends Enum&amp;lt;E&amp;gt;
            &amp;amp; Field&amp;lt;ResultSet, SQLException&amp;gt;&amp;gt;
        extends EnumRecord&amp;lt;ResultSet, SQLException, E&amp;gt; {
    ResultSetRecord(Class&amp;lt;E&amp;gt; enumType, ResultSet set)
            throws SQLException {
        super(enumType, set);
    }

    ResultSetRecord(Class&amp;lt;E&amp;gt; enumType, E[] values, ResultSet set)
            throws SQLException {
        super(enumType, values, set);
    }

    ResultSetRecord(Class&amp;lt;E&amp;gt; enumType, Iterable&amp;lt;E&amp;gt; values,
                ResultSet set) throws SQLException {
        super(enumType, values, set);
    }
}

enum SampleSQLEnum
        implements Field&amp;lt;ResultSet, SQLException&amp;gt; {
    nick_name() {
        @Override
        public String get(ResultSet set) throws SQLException {
            return getString(set);
        }
    },
    lucky_number() {
        @Override
        public Integer get(final ResultSet set)
                throws SQLException {
            return getInteger(set);
        }
    };

    @Override
    public abstract &amp;lt;T&amp;gt; T get(final ResultSet set)
            throws SQLException;

    protected String getString(ResultSet set)
            throws SQLException {
        String value = set.getString(name()).trim();
        return isBlank(value) ? null : value;
    }

    protected Integer getInteger(ResultSet set)
            throws SQLException {
        int value = set.getInt(name());
        return set.wasNull() ? null : value;
    }
}

class SampleRecord
        extends ResultSetRecord&amp;lt;SampleSQLEnum&amp;gt; {
    SampleRecord(ResultSet set) throws SQLException {
        super(SampleSQLEnum.class, SampleSQLEnum.values(), set);
    }


    String nick_name() {
        return get(SampleSQLEnum.nick_name);
    }

    Integer luck_number() {
        return get(SampleSQLEnum.lucky_number);
    }
}

public class SampleRecordMain {
    public static void main(final String... args)
            throws SQLException {
        SampleRecord record = new SampleRecord(readFromSomewhere());
        System.out.println(record.nick_name());
        System.out.println(record.luck_number());
    }

    private static ResultSet readFromSomewhere() {
        throw null;
    }
}&lt;/pre&gt; &lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Some have had trouble importing &lt;code&gt;SharedSecrets&lt;/code&gt;.  I used it as a convenience to avoid reflection.  As an alternative you could reflect over the &lt;code&gt;enum&lt;/code&gt; to implement &lt;code&gt;getKeyUniverse&lt;/code&gt; yourself.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3127339310934916966?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3127339310934916966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3127339310934916966' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3127339310934916966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3127339310934916966'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/generic-database-records-in-java.html' title='Generic database records in Java'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5858080464530002155</id><published>2011-09-09T08:40:00.001-05:00</published><updated>2011-09-09T08:40:23.879-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java lambdas: C# for the win</title><content type='html'>&lt;p&gt;&lt;a href="http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html" title="Syntax decision"&gt;Goetz, et al&lt;/a&gt; have picked the C# syntax for Java lambdas.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5858080464530002155?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5858080464530002155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5858080464530002155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5858080464530002155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5858080464530002155'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/java-lambdas-c-for-win.html' title='Java lambdas: C# for the win'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8804184682612841509</id><published>2011-09-09T05:19:00.000-05:00</published><updated>2011-09-09T05:19:07.949-05:00</updated><title type='text'>Is state wrong?</title><content type='html'>&lt;p&gt;An interesting take on state by Tony Arcieri &lt;a href="http://lambda-the-ultimate.org/node/4350" title="The Trouble with Erlang"&gt;summarized here&lt;/a&gt;.  My favorite passage is on immuability:&lt;/p&gt; &lt;blockquote&gt;&lt;p&gt;In mutable state languages, performance problems can often be mitigated by mutating local (i.e. non-shared) state instead of creating new objects. To give an example from the Ruby language, combining two strings with the + operator, which creates a new string from two old ones, is significantly slower than combining two strings with the concatenating &gt;&gt; operator, which modifies the original string. Mutating state rather than creating new objects means there's fewer objects for the garbage collector to clean up and helps keep your program in-cache on inner loops. If you've seen Cliff Click's crash course on modern hardware, you're probably familiar with the idea that latency from cache misses is quickly becoming the dominating factor in today's software performance. Too much object creation blows the cache.&lt;/p&gt; &lt;p&gt;Cliff Click also covered Actors, the underpinning of Erlang's concurrency model, in his Concurrency Revolution from a Hardware Perspective talk at JavaOne. One takeaway from this is that actors should provide a safe system for mutable state, because all mutable state is confined to actors which only communicate using messages. Actors should facilitate a shared-nothing system where concurrent state mutations are impossible because no two actors share state and rely on messages for all synchronization and state exchange.&lt;/p&gt; &lt;p&gt;The Kilim library for Java provides a fast zero-copy messaging system for Java which still enables mutable state. In Kilim, when one actor sends a message, it loses visibility of the object it sends, and it becomes the responsibility of the recipient. If both actors need a copy of the message, the sender can make a copy of an object before it's sent to the recipient. Again, Erlang doesn't provide zero-copy (except for binaries) so Kilim's worst case is actually Erlang's best case.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a href="http://www.unlimitednovelty.com/2011/07/trouble-with-erlang-or-erlang-is-ghetto.html"&gt;The original posting from July.&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8804184682612841509?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8804184682612841509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8804184682612841509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8804184682612841509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8804184682612841509'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/is-state-wrong.html' title='Is state wrong?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3157260576202215169</id><published>2011-09-08T06:25:00.001-05:00</published><updated>2011-09-08T06:25:50.985-05:00</updated><title type='text'>Props for github</title><content type='html'>&lt;p&gt;You cannot pay for an endorsement like this: Linus Torvalds &lt;a href="http://www.theregister.co.uk/2011/09/06/linus_torvalds_dumps_kernel_for_github/" title="Torvalds dumps Kernel.org for Github after breach"&gt;posts the Linux kernel source on github&lt;/a&gt; rather than kernel.org, at least for now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3157260576202215169?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3157260576202215169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3157260576202215169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3157260576202215169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3157260576202215169'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/props-for-github.html' title='Props for github'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1647239634478765183</id><published>2011-09-04T05:53:00.001-05:00</published><updated>2011-09-04T05:53:12.867-05:00</updated><title type='text'>Paen to the state machine</title><content type='html'>&lt;p&gt;Alan Skorkin writes &lt;a href=""http://www.skorks.com/2011/09/why-developers-never-use-state-machines/" title="Why Developers Never Use State Machines"&gt;a paen to the state machine&lt;/a&gt;.  I've only written state machines for two classes of problems.  They are indispensable for scanner-parsers, but I did not do the actual writing: a tool took my grammar and wrote the state machine for me.  And for small logic problems I've written trivial state machines around the switch/case statement.&lt;/p&gt; &lt;p&gt;I think Skorkin (and van Bergen, whom he references) overlook the main reason few programmers write state machines: they are hard to reason about which makes them hard to write and hard to test.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1647239634478765183?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1647239634478765183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1647239634478765183' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1647239634478765183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1647239634478765183'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/09/paen-to-state-machine.html' title='Paen to the state machine'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1717187498768424705</id><published>2011-08-23T11:29:00.002-05:00</published><updated>2011-08-23T11:29:57.494-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>What is maven doing now?</title><content type='html'>&lt;p&gt;&lt;cite&gt;Pragmatic Java&lt;/cite&gt; give &lt;a href="http://pragmaticjava.blogspot.com/2011/08/customizing-mavens-lifecycle.html" title="Customizing Maven's lifecycle"&gt;a first rate explanation of Maven lifecycles&lt;/a&gt; and where and why you use hooks into them.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1717187498768424705?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1717187498768424705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1717187498768424705' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1717187498768424705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1717187498768424705'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/what-is-maven-doing-now.html' title='What is maven doing now?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5768763636247401865</id><published>2011-08-23T08:51:00.001-05:00</published><updated>2011-08-23T08:51:22.323-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile seating for the perplexed</title><content type='html'>&lt;p&gt;Great post from Mike Caspar &lt;a href="http://www.agileadvice.com/2011/08/23/scrumxplean/where-should-i-sit/" title="Where should I sit?"&gt;&lt;cite&gt;Where should I sit?&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5768763636247401865?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5768763636247401865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5768763636247401865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5768763636247401865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5768763636247401865'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/agile-seating-for-perplexed.html' title='Agile seating for the perplexed'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5564849158115095968</id><published>2011-08-16T14:31:00.002-05:00</published><updated>2011-08-16T14:32:40.294-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'></title><content type='html'>&lt;p&gt;I am a bit late but more marvel from Trisha of LMAX, &lt;a href="http://mechanitis.blogspot.com/2011/08/dissecting-disruptor-why-its-so-fast.html" title="Dissecting the Disruptor: Demystifying Memory Barriers"&gt;&lt;cite&gt;Dissecting the Disruptor: Demystifying Memory Barriers&lt;/cite&gt;&lt;/a&gt;.  How can one not love this writing?&lt;/p&gt; &lt;blockquote&gt;Compilers and CPUs can re-order instructions, provided the end result is the same, to try and optimise performance.  Inserting a memory barrier tells the CPU and the compiler that what happened before that command needs to stay before that command, and what happens after needs to stay after.  All similarities to a trip to Vegas are entirely in your own mind.&lt;/blockquote&gt; &lt;p&gt;And with diagrams.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5564849158115095968?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5564849158115095968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5564849158115095968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5564849158115095968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5564849158115095968'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/i-am-bit-late-but-more-marvel-from.html' title=''/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-636738441746160677</id><published>2011-08-15T06:04:00.003-05:00</published><updated>2011-08-15T06:05:19.056-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='protobuf'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Working with Google Protobuf DynamicMessage</title><content type='html'>&lt;p&gt;Google Protobuf is an stand out project with mixed quality documentation.  A corporate cynic points &lt;a href="http://corporateinsanity.us/?p=51" title="Protobuf Dynamic Messages"&gt;working with &lt;tt&gt;DynamicMessage&lt;/tt&gt;&lt;/a&gt;, an interesting Protobuf feature lacking official documentation beyond &lt;a href="http://code.google.com/apis/protocolbuffers/docs/reference/java/com/google/protobuf/DynamicMessage.html"&gt;skeletal javadoc&lt;/a&gt; and &lt;a href="http://code.google.com/apis/protocolbuffers/docs/techniques.html#self-description"&gt;a short blurb&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The key trick condenses down to:&lt;/p&gt; &lt;pre class="code"&gt;public static Descriptor descriptorFor(
        final InputStream in, final String name)
        throws IOException, DescriptorValidationException {
    final FileDescriptorSet fileDescriptorSet
            = FileDescriptorSet.parseFrom(in);
    final FileDescriptorProto fileDescriptorProto
            = fileDescriptorSet.getFile(0);
    final FileDescriptor fileDescriptor = FileDescriptor.
            buildFrom(fileDescriptorProto, new FileDescriptor[0]);
    return fileDescriptor.findMessageTypeByName(name);
}

// Elsewhere

final InputStream in = Class.class.
        getResourceAsStream("... your descriptors from protoc ...");
final Descriptor descriptor = descriptorFor(in,
        Outer.getDescriptor().getName());
final DynamicMessage dynamicMessage = DynamicMessage.
        parseFrom(descriptor, outer.toByteArray());
System.out.println("dynamicMessage = " + dynamicMessage);&lt;/pre&gt; &lt;p&gt;Note the baked-in assumption of "getFile(0)", etc.  The cynic's example is more forthcoming.  Caveat coder.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-636738441746160677?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/636738441746160677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=636738441746160677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/636738441746160677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/636738441746160677'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/working-with-google-protobuf.html' title='Working with Google Protobuf DynamicMessage'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4982954969975408124</id><published>2011-08-04T13:29:00.001-05:00</published><updated>2011-08-04T13:29:57.019-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Avoid feature branches</title><content type='html'>&lt;p&gt;Another explanation, with typically excellent illustrations, from Martin Fowler on why you should &lt;a href="http://martinfowler.com/bliki/SemanticConflict.html" title="SemanticConflict"&gt;avoid feature branches&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4982954969975408124?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4982954969975408124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4982954969975408124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4982954969975408124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4982954969975408124'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/avoid-feature-branches.html' title='Avoid feature branches'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5269971007741306489</id><published>2011-08-04T07:30:00.001-05:00</published><updated>2011-08-04T07:30:06.015-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>A rewrite success story</title><content type='html'>&lt;p&gt;I avoid rewriting when possible, but greenfield work is ideal: &lt;a href="http://blog.nowjs.com/why-we-threw-out-all-our-code-and-why-you-sho"&gt;a rewrite success story&lt;/a&gt; from the NowJS team.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5269971007741306489?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5269971007741306489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5269971007741306489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5269971007741306489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5269971007741306489'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/rewrite-success-story.html' title='A rewrite success story'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5524467260419288497</id><published>2011-08-03T08:51:00.001-05:00</published><updated>2011-08-03T12:59:25.242-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kotlin'/><title type='text'>Why Kotlin?</title><content type='html'>&lt;p&gt;Dmitri Jemerov answers &lt;a href="http://blog.jetbrains.com/kotlin/2011/08/02/why-jetbrains-needs-kotlin/" title="Why JetBrains needs Kotlin"&gt;"Why Kotlin?".&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Maria Arias adds &lt;a href="http://neuronica.wordpress.com/2011/08/03/my-thoughs-on-kotlin/" title="My thoughs on Kotlin"&gt;his two cents&lt;/a&gt; on this question.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5524467260419288497?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5524467260419288497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5524467260419288497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5524467260419288497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5524467260419288497'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/why-kotlin.html' title='Why Kotlin?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2533819984827602187</id><published>2011-08-02T11:39:00.001-05:00</published><updated>2011-08-02T11:40:01.050-05:00</updated><title type='text'>ThoughtWorks technology radar for 2011</title><content type='html'>&lt;p&gt;&lt;a href="http://www.thoughtworks.com/articles/technology-radar-july-2011" title="Technology Radar July 2011 | www.thoughtworks.com"&gt;The ThoughtWorks Technology Radar for 2011&lt;/a&gt; (h/t Martin Fowler, &lt;a href="http://www.thoughtworks.com/radar"&gt;previous versions&lt;/a&gt;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2533819984827602187?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2533819984827602187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2533819984827602187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2533819984827602187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2533819984827602187'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/thoughtworks-technology-radar-for-2011.html' title='ThoughtWorks technology radar for 2011'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5801239213010949463</id><published>2011-08-02T05:12:00.000-05:00</published><updated>2011-08-02T05:12:01.903-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Great problem report on JDK7 bug</title><content type='html'>&lt;p&gt;A great problem report from Alex Blewitt on &lt;a href="http://www.infoq.com/news/2011/08/java7-hotspot" title="Java7 Hotspot Loop Bug Details"&gt;the JDK7 loop bug&lt;/a&gt;, which turns out is avoidable and not limited to JDK7.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5801239213010949463?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5801239213010949463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5801239213010949463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5801239213010949463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5801239213010949463'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/great-problem-report-on-jdk7-bug.html' title='Great problem report on JDK7 bug'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4291964637027877399</id><published>2011-08-01T13:10:00.001-05:00</published><updated>2011-08-01T13:10:51.127-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kotlin'/><title type='text'>Exposure for Kotlin</title><content type='html'>&lt;p&gt;The early &lt;a href="http://www.newscientist.com/article/dn20748-egyptian-tomb-mystery-may-be-worlds-first-protractor.html" title="Erasure vs reification"&gt;signs of traction&lt;/a&gt; for &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Welcome" title="Welcome - Kotlin - Confluence"&gt;JetBrain's Kotlin&lt;/a&gt;: inclusion in discussions of JVM languages.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4291964637027877399?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4291964637027877399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4291964637027877399' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4291964637027877399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4291964637027877399'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/exposure-for-kotlin.html' title='Exposure for Kotlin'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-861883795625342765</id><published>2011-08-01T11:30:00.002-05:00</published><updated>2011-08-01T11:30:40.313-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java v. C++, redux redux redux</title><content type='html'>&lt;p&gt;Yet another Java/C++ comparison, this time for &lt;a href="http://vanillajava.blogspot.com/2011/07/c-or-java-which-is-faster-for-high.html" title="C++ or Java, which is faster for high frequency trading?"&gt;high-frequency trading&lt;/a&gt;, a sexy industrial programming area.&lt;/p&gt;&lt;p&gt;I found this quote most trenchant:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you have a typical Java programmer and typical C++ programmer, each with a few years experience writing a typical Object Oriented Program, and you give them the same amount of time, the Java programmer is likely to have a working program earlier and will have more time to tweak the application. In this situation it is likely the Java application will be faster. IMHO.&lt;/p&gt;&lt;p&gt;In my experience, Java performs better at C++ at detecting code which doesn't need to be done. esp micro-benchmarks which don't do anything useful. ;) If you tune Java and C++ as far as they can go given any amount of expertise and time, the C++ program will be faster. However, given limited resources and in changing environment a dynamic language will out perform. i.e. in real world applications.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You decide.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-861883795625342765?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/861883795625342765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=861883795625342765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/861883795625342765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/861883795625342765'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/08/java-v-c-redux-redux-redux.html' title='Java v. C++, redux redux redux'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-444606502371717422</id><published>2011-07-28T11:20:00.003-05:00</published><updated>2011-07-29T13:08:59.288-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>About time</title><content type='html'>&lt;p&gt;Mark Reinhold announces &lt;a href="http://mreinhold.org/blog/jdk7-ga" title="JDK 7: General Availability | Mark Reinhold"&gt;the JDK7 release&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; And &lt;a href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html"&gt;the release notes&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; &lt;a href="http://www.lucidimagination.com/search/document/1a0d3986e48a9348/warning_index_corruption_and_crashes_in_apache_lucene_core_apache_solr_with_java_7" title="[general] [WARNING] Index corruption and crashes in Apache Lucene Core / Apache Solr with Java 7"&gt;Oops.&lt;/a&gt;.  I'll wait until the next patch release.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-444606502371717422?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/444606502371717422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=444606502371717422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/444606502371717422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/444606502371717422'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/about-time.html' title='About time'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2559777012240502542</id><published>2011-07-25T17:31:00.002-05:00</published><updated>2011-07-25T17:31:33.415-05:00</updated><title type='text'>Straight from Darcy: JDK7</title><content type='html'>&lt;p&gt;Nice keynote deck from &lt;a href="http://blogs.oracle.com/darcy/entry/oscon_jdk_7_in_a" title="OSCON: JDK 7 in a Nutshell"&gt;Joseph Darcy&lt;/a&gt; on JDK7.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2559777012240502542?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2559777012240502542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2559777012240502542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2559777012240502542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2559777012240502542'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/straight-from-darcy-jdk7.html' title='Straight from Darcy: JDK7'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-652963905062112037</id><published>2011-07-25T15:47:00.000-05:00</published><updated>2011-07-25T15:47:10.231-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jmockit'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>JMockit and static methods</title><content type='html'>&lt;p&gt;Static methods are painful in Java when mocking but JMockit makes some impossible testing possible, though not easy:&lt;/p&gt;&lt;pre class="code"&gt;public final class MockitEg {
    public static final int SHOE_SIZE = 13;

    public static int shoeSize() {
        System.out.println("MockitEg.shoeSize");
        return SHOE_SIZE;
    }

    private MockitEg() {
    }
}

public class MockitTest {
    private static final int MOCK_SHOE_SIZE = SHOE_SIZE + 29;

    @Test
    public void shouldMockStaticMethod() {
        new NonStrictExpectations() {
            final MockitEg mock = null;

            {
                MockitEg.shoeSize();
                result = new MockitEgDelegate();
            }
        };

        assertThat(MockitEg.shoeSize(),
                is(equalTo(MOCK_SHOE_SIZE)));
    }

    private static final class MockitEgDelegate
            implements Delegate {
        public static int shoeSize() {
            return MOCK_SHOE_SIZE;
        }
    }
}&lt;/pre&gt;&lt;p&gt;The test passes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-652963905062112037?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/652963905062112037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=652963905062112037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/652963905062112037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/652963905062112037'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/jmockit-and-static-methods.html' title='JMockit and static methods'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1223497078145180179</id><published>2011-07-25T12:56:00.001-05:00</published><updated>2011-07-25T12:56:11.536-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Two web page nuggets</title><content type='html'>&lt;p&gt;Two great web page nuggest from colleagues today:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kegel.com/c10k.html" title="The C10K problem"&gt;&lt;cite&gt;The C10K problem&lt;/cite&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html" title="A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux"&gt;&lt;cite&gt;A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux&lt;/cite&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;(Kudos to Gorlak on a clever domain name.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1223497078145180179?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1223497078145180179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1223497078145180179' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1223497078145180179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1223497078145180179'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/two-web-page-nuggets.html' title='Two web page nuggets'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8174584728145801723</id><published>2011-07-23T08:53:00.004-05:00</published><updated>2011-08-16T14:32:29.841-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='disruptor'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Farwell LinkedBlockingQueue</title><content type='html'>&lt;p&gt;&lt;a href="http://blog.jteam.nl/2011/07/20/processing-1m-tps-with-axon-framework-and-the-disruptor/"&gt;More astonishing figures&lt;/a&gt; for the &lt;a href="http://code.google.com/p/disruptor/"&gt;LMAX disruptor&lt;/a&gt;.  More results like this and I feel a new JDK concurrency framework coming soon.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;Trisha posts &lt;a href="http://mechanitis.blogspot.com/search/label/disruptor"&gt;more explanation&lt;/a&gt; of the interesting technical tricks in Disruptor: magic cache line padding.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8174584728145801723?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8174584728145801723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8174584728145801723' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8174584728145801723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8174584728145801723'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/farwell-linkedblockingqueue.html' title='Farwell LinkedBlockingQueue'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3624504794469551848</id><published>2011-07-22T22:21:00.000-05:00</published><updated>2011-07-22T22:21:18.803-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Java Zipper</title><content type='html'>&lt;p&gt;A colleague moving between Python and Java asked me if there were an implementation of &lt;a href="http://docs.python.org/library/functions.html#zip"&gt;zip&lt;/a&gt;.  Handling arbitrary tuples is challenging in Java, but the simple 2-tuple is straight-forward enough:&lt;/p&gt;&lt;pre class="code"&gt;public final class Pair&amp;lt;T, U&amp;gt; {
    public final T first;
    public final U second;

    public static &amp;lt;T, U&amp;gt; Pair&amp;lt;T, U&amp;gt; pair(final T first, final U second) {
        return new Pair&amp;lt;T, U&amp;gt;(first, second);
    }

    private Pair(final T first, final U second) {
        this.first = first;
        this.second = second;
    }
}

public final class Zipper {
    public static &amp;lt;T, U&amp;gt; Iterable&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt; zip(
            final T[] first, final Iterable&amp;lt;U&amp;gt; second) {
        return zip(asList(first), second);
    }

    public static &amp;lt;T, U&amp;gt; Iterable&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt; zip(
            final Iterable&amp;lt;T&amp;gt; first, final U[] second) {
        return zip(first, asList(second));
    }

    public static &amp;lt;T, U&amp;gt; Iterable&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt; zip(
            final T[] first, final U[] second) {
        return zip(asList(first), asList(second));
    }

    public static &amp;lt;T, U&amp;gt; Iterable&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt; zip(
            final Iterable&amp;lt;T&amp;gt; first, final Iterable&amp;lt;U&amp;gt; second) {
        return new Iterable&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt;() {
            @Override
            public Iterator&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt; iterator() {
                return new Iterator&amp;lt;Pair&amp;lt;T, U&amp;gt;&amp;gt;() {
                    private final Iterator&amp;lt;T&amp;gt; fit
                            = first.iterator();
                    private final Iterator&amp;lt;U&amp;gt; sit
                            = second.iterator();

                    @Override
                    public boolean hasNext() {
                        return fit.hasNext() &amp;amp;&amp;amp; sit.hasNext();
                    }

                    @Override
                    public Pair&amp;lt;T, U&amp;gt; next() {
                        return pair(fit.next(), sit.next());
                    }

                    @Override
                    public void remove() {
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };
    }

    private Zipper() {
    }
}&lt;/pre&gt;&lt;p&gt;I found several functional Java libraries but none as simple as my colleague wanted.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3624504794469551848?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3624504794469551848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3624504794469551848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3624504794469551848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3624504794469551848'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/java-zipper.html' title='Java Zipper'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8524248503624025352</id><published>2011-07-20T05:30:00.002-05:00</published><updated>2011-07-21T13:03:05.175-05:00</updated><title type='text'>Kotlin: less is more</title><content type='html'>&lt;p&gt;JetBrains announced a new JVM language underway: &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Welcome" title="Welcome - Kotlin - Confluence"&gt;Kotlin&lt;/a&gt;. Thanks to Cedric Beust for &lt;a href="https://plus.google.com/108840253750748459271/posts/Q1P8xDp5inK"&gt;pointing this out&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;My first impression of Kotlin is a simpler Scala retaining the core principle: &lt;i&gt;let the compiler do more, the programmer less&lt;/i&gt;.  Heavy amounts of inference where it is useful, much shared syntax.&lt;/p&gt;&lt;p&gt;Good luck, JetBrains!&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; I missed this wiki page my first pass through: &lt;a href="http://confluence.jetbrains.net/display/Kotlin/Comparison+to+Scala"&gt;&lt;cite&gt;Comparison to Scala&lt;/cite&gt;&lt;/a&gt;.  The page has interesting comments as well.&lt;/p&gt;&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Stephen Colebourne &lt;a href="http://www.jroller.com/scolebourne/entry/kotlin_and_the_search_for" title="Kotlin and the search for a better Java"&gt;expresses a lot of my thoughts&lt;/a&gt; better than I do on Kotlin.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8524248503624025352?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8524248503624025352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8524248503624025352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8524248503624025352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8524248503624025352'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/kotlin-less-is-more.html' title='Kotlin: less is more'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3347923465421064812</id><published>2011-07-19T05:29:00.000-05:00</published><updated>2011-07-19T05:29:00.631-05:00</updated><title type='text'>A subtle shuffling bug</title><content type='html'>&lt;p&gt;Mike James explains why &lt;a href="http://www.i-programmer.info/programming/theory/2744-how-not-to-shuffle-the-kunth-fisher-yates-algorithm.html"&gt;random shuffling might not be so random&lt;/a&gt;.  Little surprise here: Knuth has the right solution.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3347923465421064812?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3347923465421064812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3347923465421064812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3347923465421064812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3347923465421064812'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/subtle-shuffling-bug.html' title='A subtle shuffling bug'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-728995098221594138</id><published>2011-07-15T10:02:00.001-05:00</published><updated>2011-07-15T10:02:37.409-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Closure: Google Javascript optimizer and more</title><content type='html'>&lt;p&gt;&lt;a href="http://www.developerfusion.com/news/122215/google-reveals-a-few-secrets-powering-google/" title="Google reveals a few secrets powering Google+"&gt;Chris Alexander&lt;/a&gt; cites &lt;a href="http://code.google.com/closure/"&gt;Closure&lt;/a&gt; as one of the technologies behind Google+.  &lt;a href="http://code.google.com/closure/faq.html"&gt;The FAQ&lt;/a&gt; contrasts Closure with GWT:&lt;/p&gt;&lt;blockquote&gt;Closure is geared toward developers who want to work with JavaScript and have a strong understanding of the language, while GWT allows developers to work primarily in Java (although they can work in JavaScript, too) without worrying about the underlying JavaScript.&lt;/blockquote&gt;&lt;p&gt;I wonder what my Javascript friends think?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-728995098221594138?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/728995098221594138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=728995098221594138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/728995098221594138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/728995098221594138'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/closure-google-javascript-optimizer-and.html' title='Closure: Google Javascript optimizer and more'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-172894400194560549</id><published>2011-07-14T18:51:00.006-05:00</published><updated>2011-07-15T05:21:42.923-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='make'/><title type='text'>A reminder why make is a beast</title><content type='html'>At work today was a vivid reminder why make is a beast.&lt;br /&gt;
I'm integrating protobuf into a custom build system based on GNU make, call it &lt;i&gt;yamake&lt;/i&gt; ("yet another make") and a proprietary IDL-like language, call it &lt;i&gt;SDL&lt;/i&gt; ("sort-of definition language").  SDL is firmly rooted in the culture and systems, so it is non-negotiable.  Over the course of the past few days, learned the steps:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Write a backend for the Python compiler script which translates SDL to your target language, in my case protobuf.&lt;/li&gt;
&lt;li&gt;Hand off protobuf backend to guru colleague who munges it to better match the overall systems, and patches it into yamake.&lt;/li&gt;
&lt;li&gt;Work on &lt;code&gt;makefile&lt;/code&gt; to actually build usable jar of compiled protobuf for Java.&lt;/li&gt;
&lt;li&gt;Watch colleague redo munging to something more permanent, less hacktastic.&lt;/li&gt;
&lt;li&gt;Rework on &lt;code&gt;makefile&lt;/code&gt; to actually build usable jar of compiled protobuf for Java.&lt;/li&gt;
&lt;li&gt;Roll fake maven local repo holding new jar, of course yamake knows nothing about deploying jars.&lt;/li&gt;
&lt;li&gt;Build new CORBA IDL jar for Java including new interfaces to access protobuf in other systems.&lt;/li&gt;
&lt;/ol&gt;
All this, and finally I can actually do useful work.  Tomorrow.&lt;br /&gt;
But this is not the point of my post.&lt;br /&gt;
Yamake is a wrapper around venerable GNU make, so I am editing makefiles.  Ultimately I have this dependency chain: SDL to protobuf to Java to classes to jar.  But watch:&lt;br /&gt;
&lt;pre class="code"&gt;$ sdlc -t protobuf foobar.sdl -o proto/foobar.proto
$ protoc --java_out=java proto/foobar.proto
$ javac -sourcepath java java/my/package/FoobarProtos.java
$ jar cf foobar.jar -C java my/package/FoobarProtos*.class&lt;/pre&gt;
It's actually more Rube-Goldbergesque than this, as the C++ versions of the protobuf play games with namespaces requiring various flags at various stages along with directory changes.  So I made Java keep up.  You come up with dependency rules that cope with &lt;code&gt;option java_package = "something.random"&lt;/code&gt; and &lt;code&gt;option java_outer_classname="SomethingProtos"&lt;/code&gt; and mismatched output directories!&lt;br /&gt;
I opted for using helper shell scripts for parsing protobuf for proper Java packages with class names and generating dependency makefiles to include in my actual &lt;code&gt;makefile&lt;/code&gt;.&lt;br /&gt;
Maven, remind me to quit poking on you for your ugly XML and ridiculously noisy output.  I forgot all the love you give me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-172894400194560549?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/172894400194560549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=172894400194560549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/172894400194560549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/172894400194560549'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/07/reminder-why-make-is-beast.html' title='A reminder why make is a beast'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6386617282957294031</id><published>2011-06-20T05:59:00.000-05:00</published><updated>2011-06-20T05:59:44.268-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>New Shimmer for Java Concurrency</title><content type='html'>&lt;p&gt;At work we use this Java idiom to coordinate start up:&lt;/p&gt; &lt;pre class="code"&gt;public class LatchExecutorService
        implements ExecutorService {
    private final ExecutorService threadPool
            = newSingleThreadExecutor();
    private final CountDownLatch latch;

    public LatchExecutorService(final int count) {
        latch = new CountDownLatch(count);
        threadPool.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    latch.await();
                    threadPool.shutdown();
                } catch (final InterruptedException e) {
                    threadPool.shutdownNow();
                }
            }
        });
    }

    public void countDown() {
        latch.countDown();
    }

    public int getCount() {
        return latch.getCount();
    }

    public &amp;lt;T&amp;gt; Future&amp;lt;T&amp;gt; submit(final Callable&amp;lt;T&amp;gt; task) {
        try {
            return threadPool.submit(task);
        } catch (final RejectedExecutionException e) {
            task.run();
        }
    }

    public &amp;lt;T&amp;gt; Future&amp;lt;T&amp;gt; submit(final Runnable task,
            final T result) {
        try {
            return threadPool.submit(task, result);
        } catch (final RejectedExecutionException e) {
            task.run();
        }
    }

    public Future&amp;lt;?&amp;gt; submit(final Runnable task) {
        try {
            return threadPool.submit(task);
        } catch (final RejectedExecutionException e) {
            task.run();
        }
    }

    // Delegate remaining executor service methods
    // Cut for brevity
}&lt;/pre&gt; &lt;p&gt;This class is like &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html"&gt;a count down latch&lt;/a&gt; but with the extra "runnable" feature of &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CyclicBarrier.html#CyclicBarrier(int, java.lang.Runnable)"&gt;a cyclic barrier&lt;/a&gt;.  When the latch fully counts down, it executes any registered runnables in order of submission.  And it is also &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html"&gt;an executor service&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Some explanation of the unusual submit semantics.  The intent of the class is use at start up, to delay actions that depend on some common initialization but guarantee their execution without coordination of parties.&lt;/p&gt; &lt;p&gt;Say there are four worker threads at start up performing essential work.  The rest of the program works in a reduced state until these four complete.  Rather than carry four independent signals, I collapsed all into &lt;code&gt;LatchExecutorService&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;As tasks are submitted, &lt;code&gt;LatchExecutorService&lt;/code&gt; delays their execution until its latch fully counts down.  With a blocking task at the head of the single-threaded inner executor service, all other tasks must wait on the latch.  When the latch triggers, the blocking task clears and all waiting tasks execute on the inner executor service thread.&lt;/p&gt; &lt;p&gt;Once the latch triggers, I do not need the inner executor service any longer except to clear out waiting tasks so I call &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#shutdown()"&gt;&lt;code&gt;shutdown()&lt;/code&gt;&lt;/a&gt; and free up that thread.&lt;/p&gt; &lt;p&gt;I want any new tasks submitted to run immediately.  Rather than have them fail or need to coordinate between slow submitters and fast count downers, I run submitted tasks in their caller's thread on rejection.  This guarantees new tasks eventually execute without any coordination, either on the original inner executor service or directly at submission.&lt;/p&gt; &lt;p&gt;You can also view &lt;code&gt;LatchExecutorService&lt;/code&gt; as an inside-out cyclic barrier.  Rather than one runnable registered at construction to execute when all parties signal, callers can provide as many runnables as they like at any time.&lt;/p&gt; &lt;p&gt;It's a count down latch; it's a cyclic barrier; it's an executor service.  It's &lt;a href="http://www.hulu.com/watch/61320/saturday-night-live-shimmer-floor-wax"&gt;&lt;em&gt;New Shimmer&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6386617282957294031?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6386617282957294031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6386617282957294031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6386617282957294031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6386617282957294031'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/06/new-shimmer-for-java-concurrency.html' title='New Shimmer for Java Concurrency'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-318953023226698878</id><published>2011-05-16T08:47:00.000-05:00</published><updated>2011-05-16T08:47:38.617-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Beautiful illustration of feature branching with git</title><content type='html'>&lt;p&gt;Vincent Driessen posted a while back &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/" title=" successful Git branching model &amp;raquo; nvie.com"&gt;a rather beautiful illustration of feature branching in git&lt;/a&gt;.  I wish I had not missed it when first posted (2010).  And just what I needed &amp;mdash; he includes git command line instructions for executing the model.  Posts like this are what make the Internet so helpful in my day-to-day work life.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-318953023226698878?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/318953023226698878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=318953023226698878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/318953023226698878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/318953023226698878'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/05/beautiful-illustration-of-feature.html' title='Beautiful illustration of feature branching with git'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5266707780210183684</id><published>2011-05-12T11:19:00.000-05:00</published><updated>2011-05-13T15:35:12.168-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Gosling and JoSQL</title><content type='html'>&lt;p&gt;Ran into &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=62320" title="James Gosling Extols the Virtues of HashTables and RAM"&gt;James Gosling promoting hash maps and RAM as an alternative to SQL&lt;/a&gt;.  My team has as positive experience with this approach.  Coupling it with &lt;a href="http://josql.sourceforge.net/" title="JoSQL - SQL for Java Objects"&gt;JoSQL for a SQL-like syntax&lt;/a&gt; we can query our object collections.  Adding a &lt;a href="http://www.gibello.com/code/zql"&gt;ZQL ANSI SQL parser&lt;/a&gt; and some simple AST editing, we can take pure SQL where clauses and find matching objects in our maps, performantly too.  Custom SQL functions are a bonus.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5266707780210183684?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5266707780210183684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5266707780210183684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5266707780210183684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5266707780210183684'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/05/gosling-and-josql.html' title='Gosling and JoSQL'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4628243742261541115</id><published>2011-05-07T11:16:00.001-05:00</published><updated>2011-05-07T11:20:24.239-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='ml'/><title type='text'>Why Carnegie-Mellon is one of the best undergraduate computer science educations in the world today</title><content type='html'>&lt;p&gt;I usually link to individual blog posts that catch my imagination &amp;mdash; this blog was started as a way for me to recall and find such posts again.  Today is an exception.&lt;/p&gt; &lt;p&gt;Robert Harper is a professor in Computer Science at Carnegie-Mellon.  His blog, &lt;a href="http://existentialtype.wordpress.com/" title="Of Course ML Has Monads! &amp;laquo;  Existential Type"&gt;&lt;cite&gt;Of Course ML Has Monads! &amp;laquo;  Existential Type&lt;/cite&gt;&lt;/a&gt;, chronicles his freshman introductory course in functional programming among other topics.  Lately I have been looking into Haskell as an alternative to Java at work for some kinds of projects.  Harper's posts on ML is opening my horizons further.&lt;/p&gt; &lt;p&gt;The main problem with Haskell or ML is the lack of a good JVM port.  Clojure is the next best thing, they all being moral equivalents of LISP even if quite different on the surface.&lt;/p&gt; &lt;p&gt;Back to point.  Though the blog is young, I have enjoyed each of Harper's posts and hope he continues.  And I with each post I learned something.  He is a good teacher outside the classroom.  Alas, I was a music major.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4628243742261541115?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4628243742261541115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4628243742261541115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4628243742261541115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4628243742261541115'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/05/why-carnegie-mellon-is-one-of-best.html' title='Why Carnegie-Mellon is one of the best undergraduate computer science educations in the world today'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1847700641506290269</id><published>2011-05-07T10:55:00.000-05:00</published><updated>2011-05-07T10:55:34.705-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Moving Java to Haskell</title><content type='html'>&lt;p&gt;I am enjoying Tim Carstens' post that &lt;a href="http://intoverflow.wordpress.com/2010/07/20/i-come-from-java-and-want-to-know-what-monads-are-in-haskell" title="I come from Java and want to know what monads are in Haskell"&gt;translates Java to Haskell&lt;/a&gt; focused around monads.  It is clean, complete and just how a guide for the novitiate should look.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1847700641506290269?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1847700641506290269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1847700641506290269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1847700641506290269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1847700641506290269'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/05/moving-java-to-haskell.html' title='Moving Java to Haskell'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-887519944940923390</id><published>2011-03-10T06:38:00.000-06:00</published><updated>2011-03-10T06:38:22.451-06:00</updated><title type='text'>On the fact that Donald Knuth is not Human</title><content type='html'>&lt;p&gt;Weiqi Gao reminds me that &lt;a href="http://www.weiqigao.com/blog/2011/03/09/you_dont_need_no_tests_if_you_are_knuth.html" title="You Don't Need No @!#% Tests If You Are Knuth"&gt;Donald Knuth is not made of the same stuff&lt;/a&gt; as the rest of us.  Or he is a very good leg-puller.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-887519944940923390?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/887519944940923390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=887519944940923390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/887519944940923390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/887519944940923390'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/03/on-fact-that-donald-knuth-is-not-human.html' title='On the fact that Donald Knuth is not Human'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-5701255241433803600</id><published>2011-02-09T15:11:00.000-06:00</published><updated>2011-02-09T15:11:39.577-06:00</updated><title type='text'>I won!</title><content type='html'>&lt;p&gt;To my utter surprise, I won a Google notebook.  Perhaps it is my wife who won.  :-)&lt;/p&gt; &lt;p&gt;Thank you, Google!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-5701255241433803600?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/5701255241433803600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=5701255241433803600' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5701255241433803600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/5701255241433803600'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/02/i-won.html' title='I won!'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3527977414340101487</id><published>2011-02-01T05:36:00.000-06:00</published><updated>2011-02-01T05:36:01.268-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile teams are self-organizing</title><content type='html'>&lt;p&gt;At &lt;a href="http://www.agileadvice.com/about-agile-advice/" title="About Agile Advice"&gt;&lt;cite&gt;Agile Advice&lt;/cite&gt;&lt;/a&gt; a clear example that agile teams are self-organizing: &lt;a href="http://www.agileadvice.com/2011/02/01/theoryofagile/the-big-difference-between-agile-teams-and-project-teamd/" title="The BIG Difference Between Agile Teams and Project Teamd"&gt;&lt;cite&gt;The BIG Difference Between Agile Teams and Project Teamd&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3527977414340101487?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3527977414340101487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3527977414340101487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3527977414340101487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3527977414340101487'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/02/agile-teams-are-self-organizing.html' title='Agile teams are self-organizing'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3517176822296585198</id><published>2011-01-14T13:02:00.000-06:00</published><updated>2011-01-14T13:02:39.238-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jms'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Teach Spring to use per-listener JMS destination queue names, not hard-coded ones</title><content type='html'>&lt;p&gt;This took some experimenting.&lt;/p&gt; &lt;p&gt;My problem: I am using Spring Framework 3.0 JMS support to wire up a JMS listener container to listener beans.  The XML syntax looks like:&lt;/p&gt; &lt;pre class="code"&gt;&amp;lt;jms:listener-container&amp;gt;
    &amp;lt;jms:listener
            destination="hard-coded-queue-name"
            ref="listener"/&amp;gt;
&amp;lt;/jms:listener-container&amp;gt;&lt;/pre&gt; &lt;p&gt;This XML is distributed with each program instance.  Not a single single server or client instance but a server cluster or client farm: each one of these needs a unique destination so JMS routes correctly.&lt;/p&gt; &lt;p&gt;My first try fixed the uniqueness problem but was less than fully usable:&lt;/p&gt; &lt;pre class="code"&gt;&amp;lt;jms:listener-container&amp;gt;
    &amp;lt;jms:listener
            destination="#{T(java.util.UUID).randomUUID().toString()}"
            ref="listener"/&amp;gt;
&amp;lt;/jms:listener-container&amp;gt;&lt;/pre&gt; &lt;p&gt;This suffers excess cleverness.  Each listener gets a random UUID for its destination.  But, how does the listener refer to this queue name when filling in a JMS reply-to field, or logging or other purposes?&lt;/p&gt; &lt;p&gt;The real answer is to ask the listener for a destination, no produce one externally:&lt;/p&gt; &lt;pre class="code"&gt;&amp;lt;jms:listener-container&amp;gt;
    &amp;lt;jms:listener
            destination="#{listener.inbox}"
            ref="listener"/&amp;gt;
&amp;lt;/jms:listener-container&amp;gt;&lt;/pre&gt; &lt;p&gt;And in the listener:&lt;/p&gt; &lt;pre class="code"&gt;private final String inbox = UUID.randomUUID().toString();

public String getInbox() {
    return inbox;
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3517176822296585198?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3517176822296585198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3517176822296585198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3517176822296585198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3517176822296585198'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/01/teach-spring-to-use-per-listener-jms.html' title='Teach Spring to use per-listener JMS destination queue names, not hard-coded ones'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-9020997377760775477</id><published>2011-01-12T16:02:00.000-06:00</published><updated>2011-01-12T16:02:51.202-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='corba'/><title type='text'>JacORB in Jetty</title><content type='html'>&lt;p&gt;There is a nasty JVM bug with class verification when you use JacORB in a webapp in Jetty.  The issue only occurs when you use a custom classloader (as Jetty does) and load the CORBA in JacORB which replace the default implementation in the JDK.  The characteristic message is:&lt;/p&gt; &lt;blockquote&gt;java.lang.VerifyError: (class: org/jacorb/orb/Delegate, method: getReference signature: (Lorg/jacorb/poa/POA;)Lorg/omg/CORBA/portable/ObjectImpl;) Incompatible object argument for function call&lt;/blockquote&gt; &lt;p&gt;The problem has been ongoing since at least 2004 that I can tell from googling without much progress.  It happens to other containers than Jetty.&lt;/p&gt; &lt;p&gt;The solution is to ensure the JacORB classes are loaded with the system classloader, not the custom classloader in the webapp container.  The only way this can happen is&lt;/p&gt; &lt;ol&gt; &lt;li&gt;The jacorb jar and its dependencies are not in &lt;code&gt;WEB-INF/lib&lt;/code&gt; so Jetty cannot find them there with its classloader, forcing delegation to the system classloader.&lt;/li&gt; &lt;li&gt;The system classloader has the jacorb jar and its dependencies prepended to the boot classpath so they can take precedence over the default CORBA implementation in the JDK.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;As I use maven, this means my POM for building the war includes:&lt;/p&gt; &lt;pre class="code"&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;jacorb&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jacorb&amp;lt;/artifactId&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;logback-classic&amp;lt;/artifactId&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;ch.qos.logback&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;logback-core&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${ch.qos.logback.version}&amp;lt;/version&amp;gt;
    &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt; &lt;p&gt;(I am relying on a parent pom to define versions for these)&lt;/p&gt; &lt;p&gt;And my command line to run Jetty from maven with &lt;a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin" title="Jetty/Feature/Jetty Maven Plugin - Eclipsepedia"&gt;the excellent jetty-maven-plugin&lt;/a&gt; (I am on Windows for this project):&lt;/p&gt; &lt;pre class="code"&gt;$ MAVEN_OPTS='-Xbootclasspath/p:jacorb-2.3.1jboss.patch01-brew.jar\;slf4j-api-1.6.1.jar\;logback-classic-0.9.26.jar\;logback-core-0.9.26.jar -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton' mvn jetty:run-war&lt;/pre&gt; &lt;p&gt;I am glad this is finally behind me; a day and a half I could have better spent playing elsewhere.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-9020997377760775477?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/9020997377760775477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=9020997377760775477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/9020997377760775477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/9020997377760775477'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2011/01/jacorb-in-jetty.html' title='JacORB in Jetty'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4067437667952795454</id><published>2010-12-14T09:04:00.000-06:00</published><updated>2010-12-14T09:04:15.805-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cygwin'/><title type='text'>Does Windows really need to be this hard?</title><content type='html'>&lt;p&gt;While setting up a new Cygwin installation I ran &lt;code&gt;cron-config&lt;/code&gt; and found this nugget: &lt;a href="http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1" title="Using Windows security in Cygwin"&gt;&lt;cite&gt;Switching the user context without password, Method 1: Create a token from scratch&lt;/cite&gt;&lt;/a&gt;, &lt;a href="http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd2" title="Using Windows security in Cygwin"&gt;&lt;cite&gt;Switching the user context without password, Method 2: LSA authentication package&lt;/cite&gt;&lt;/a&gt;, and &lt;a href="http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd3" title="Using Windows security in Cygwin"&gt;&lt;cite&gt;Switching the user context without password, Method 3: With password&lt;/cite&gt;&lt;/a&gt;.  Does Windows really need to be this hard?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4067437667952795454?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4067437667952795454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4067437667952795454' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4067437667952795454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4067437667952795454'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/12/does-windows-really-need-to-be-this.html' title='Does Windows really need to be this hard?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6190645880879051548</id><published>2010-12-13T13:12:00.000-06:00</published><updated>2010-12-13T13:12:05.025-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Correct SLF4J logger wrapping</title><content type='html'>&lt;h3&gt;The problem&lt;/h3&gt; &lt;p&gt;As much as the idea pains me, I find it necessary to wrap the well-known logger wrapping framework SLF4J.  Why?&lt;/p&gt; &lt;p&gt;The framework author goes to lengths to support JDK1.4 in the API, a reasonable goal for a broadly used API.  The result is &lt;a href="http://www.slf4j.org/api/org/slf4j/Logger.html" title="Logger (SLF4J 1.6.0 API)"&gt;signatures such as this&lt;/a&gt;:&lt;/p&gt; &lt;pre class="code"&gt;public interface Logger {
    /* ... */

    void info(String msg);

    void info(String format, Object arg);

    void info(String format, Object arg1, Object arg2);

    void info(String format, Object[] args);

    void info(String format, Throwable t);

    /* ... */
}&lt;/pre&gt; &lt;p&gt;That's it.  You get 0-2 parameters to put into your formatted mesage.  If you have more than two parameters you are out of luck.  An no mixing exceptions with formatted messages.  However, were SLF4J coded against JDK5 the API might become:&lt;/p&gt; &lt;pre class="code"&gt;public interface Logger {
    /* ... */

    void info(String msg, Object... args);

    /* NB - ellipsis parameter must be last. */
    void info(Throwable t, String msg, Object... args);

    /* ... */
}&lt;/pre&gt; &lt;p&gt;Yes, both simpler and more functional.  But not a an option without maintaining two versions of the code base or losing backwards compatibility.&lt;/p&gt; &lt;h3&gt;A solution&lt;/h3&gt; &lt;p&gt;In the past I worked around this with some pretty wild solutions, but today I ran across &lt;a href="http://stackoverflow.com/questions/3491744/wrapping-the-slf4j-api" title="java - Wrapping the slf4j API - Stack Overflow"&gt;&lt;cite&gt;Wrapping the slf4j API&lt;/cite&gt;&lt;/a&gt;, posted in August.&lt;/p&gt; &lt;p&gt;I can fix SLF4J for JDK5 myself:&lt;/p&gt; &lt;pre class="code"&gt;public class LoggerBase {
    private static final String FQCN = LoggerBase.class.getName();

    private final Logger logger;

    public LoggerBase(Class&lt;?&gt; thisClass) {
        this.logger = getLogger(thisClass);
    }

    public LoggerBase(String loggerName) {
        this.logger = getLogger(loggerName);
    }

    /* ... */

    public void info(String format, Object... args) {
        info(null, format, args);
    }

    public void info(Throwable thrown, String format, Object... args) {
        if (!logger.isInfoEnabled())
            return;

        if (logger instanceof LocationAwareLogger)
            ((LocationAwareLogger) logger)
                    .log(null, FQCN, INFO_INT, format, args, thrown);
        else
            logger.info(arrayFormat(format, args).getMessage(), thrown);
    }

    /* ... */
}&lt;/pre&gt; &lt;p&gt;Hopefully SLF4J presents a solution for this (perhaps a separate JDK5 jar) so I can drop my warped logger wrapper wrapping class.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6190645880879051548?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6190645880879051548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6190645880879051548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6190645880879051548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6190645880879051548'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/12/correct-slf4j-logger-wrapping.html' title='Correct SLF4J logger wrapping'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-835108043762378726</id><published>2010-12-13T08:37:00.000-06:00</published><updated>2010-12-13T08:37:27.016-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala for the Java programmer</title><content type='html'>&lt;p&gt;Dave Copeland wrote &lt;a href="http://www.naildrivin5.com/scalatour/wiki_pages/MainPage"&gt;a wonderful wiki, &lt;cite&gt;Another Tour of Scala&lt;/cite&gt;&lt;/a&gt;, around the official &lt;a href="http://www.scala-lang.org/node/104"&gt;&lt;cite&gt;A Tour of Scala&lt;/cite&gt;&lt;/a&gt;.  In Dave's version he presents Scala topics from the perspective of the Java programmer, explaining how Scala features looks coded in Java and commenting on usefulness and scrutability.&lt;/p&gt; &lt;p&gt;This is the best bootstrap into Scala resource for Java programmers (like me) I have seen.  Thanks, Dave.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-835108043762378726?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/835108043762378726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=835108043762378726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/835108043762378726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/835108043762378726'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/12/scala-for-java-programmer.html' title='Scala for the Java programmer'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4703534847051716128</id><published>2010-12-07T10:50:00.000-06:00</published><updated>2010-12-07T10:50:28.389-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Jumping off into Spring with Maven</title><content type='html'>&lt;p&gt;I keep wasting time rediscovering the right Maven dependencies for Spring Framework.  I could have just &lt;a href="http://blog.springsource.com/2009/12/02/obtaining-spring-3-artifacts-with-maven/" title="Obtaining Spring 3 Artifacts with Maven"&gt;read Keith Donald's blog post&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4703534847051716128?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4703534847051716128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4703534847051716128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4703534847051716128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4703534847051716128'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/12/jumping-off-into-spring-with-maven.html' title='Jumping off into Spring with Maven'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-7809047369572054697</id><published>2010-12-01T13:45:00.000-06:00</published><updated>2010-12-01T13:45:17.845-06:00</updated><title type='text'>A new leaf</title><content type='html'>&lt;p&gt;Today was my last day at JPMorgan Investment Bank where I worked with a great group of people in equities trading.  I will miss them.&lt;/p&gt; &lt;p&gt;In a week or two I start my first day at Macquarie Group here in Houston at the energy/gas trading desks and turn over a new leaf.  Leaf here means a page of a book.  So I am beginning a new part in the diary of my life, a book I hope &lt;a href="http://nextbigfuture.com/search/label/longevity"&gt;never closes&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-7809047369572054697?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/7809047369572054697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=7809047369572054697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7809047369572054697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7809047369572054697'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/12/new-leaf.html' title='A new leaf'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8243357866483049217</id><published>2010-11-30T16:39:00.001-06:00</published><updated>2010-11-30T17:00:19.261-06:00</updated><title type='text'>Programming when speed counts</title><content type='html'>&lt;p&gt;A clever fellow at my work posted a link to &lt;a href="http://julianhyde.blogspot.com/2010/11/numbers-everyone-should-know.html" title="Numbers everyone should know"&gt;&lt;cite&gt;Numbers everyone should know&lt;/cite&gt;&lt;/a&gt;.  When speed matters, you need to know what is cheap and what is dear.&lt;/p&gt; &lt;p&gt;Dear &lt;a href="http://en.wikiquote.org/wiki/Oscar_Wilde"&gt;Oscar Wilde&lt;/a&gt; said "What is a cynic? A man who knows the price of everything and the value of nothing."  But &lt;a href="http://en.wikiquote.org/wiki/Alan_Perlis"&gt;Alan Perlis&lt;/a&gt; countered, "LISP programmers know the value of everything and the cost of nothing."&lt;/p&gt; &lt;p&gt;Learn your costs, the value you get for them, and the price you pay.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8243357866483049217?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8243357866483049217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8243357866483049217' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8243357866483049217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8243357866483049217'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/programming-when-speed-counts.html' title='Programming when speed counts'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-4813435539352910980</id><published>2010-11-27T08:31:00.001-06:00</published><updated>2010-11-27T10:56:49.785-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Getting started with Ruby on Windows from Felix Raab</title><content type='html'>&lt;p&gt;Felix Raab posts &lt;a href="http://www.betriebsraum.de/blog/2010/11/24/ruby-development-on-windows/" title="Ruby Development on Windows"&gt;&lt;cite&gt;Ruby Development on Windows&lt;/cite&gt;&lt;/a&gt;, a practical getting started guide.  I've seen similar instructions elsewhere.  This one is a little different in that he walks you through setting up Microsoft &lt;s&gt;Console&lt;/s&gt;PowerShell instead of Cygwin.  I want to give this a try.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-4813435539352910980?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/4813435539352910980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=4813435539352910980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4813435539352910980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/4813435539352910980'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/getting-started-with-ruby-on-windows.html' title='Getting started with Ruby on Windows from Felix Raab'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-2799266162872533442</id><published>2010-11-27T07:59:00.002-06:00</published><updated>2010-11-27T10:29:00.900-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Take that, Mike</title><content type='html'>&lt;p&gt;This post is gentle ribbing at the best developer I work with at JPMorgan: Mike Doberenz.  He is a big Eclipse fan, I am an IntelliJ fan.  It's a little like the Emacs-v-vi flame war except that there is an actual argument in favor of Eclipse.&lt;/p&gt; &lt;p&gt;Martin Mikkelborg writes a helpful post on &lt;a href="http://stuffandtech.blogspot.com/2010/11/android-development-eclipse-vs-intellij.html" title="Android Development: Eclipse vs. IntelliJ IDEA"&gt;preferring IntelliJ to Eclipse for Android development&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;As Mike and I often observe, folks like me feel IntelliJ is better than Eclipse.  But I also believe the development model of Eclipse is likely to win out in the long run (units arbitrary):&lt;/p&gt; &lt;script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"&gt; {"chartType":"LineChart","chartName":"Chart 1","dataSourceUrl":"//spreadsheets0.google.com/tq?key=0AjWglz_eU6cHdGEtdV9JWVhSOF9waVZxQ1J0RlJKV3c&amp;range=A1%3AT97&amp;gid=0&amp;transpose=0&amp;headers=1&amp;pub=1","options":{"displayAnnotations":true,"showTip":true,"nonGeoMapColors":["#ff0000","#0000ff","#FF9900","#109618","#990099","#0099C6","#DD4477","#66AA00","#B82E2E","#316395"],"reverseCategories":false,"dataMode":"markers","maxAlternation":1,"pointSize":"0","colors":["#ff0000","#0000ff","#FF9900","#109618","#990099","#0099C6","#DD4477","#66AA00","#B82E2E","#316395"],"smoothLine":false,"lineWidth":"2","labelPosition":"right","is3D":false,"logScale":false,"wmode":"opaque","hasLabelsColumn":false,"title":"","legend":"top","allowCollapse":true,"reverseAxis":false,"mapType":"hybrid","isStacked":false,"width":600,"height":371},"packages":"corechart","refreshInterval":5} &lt;/script&gt; &lt;p&gt;However, JetBrains has done brilliant work lately in bringing out a free, community edition and keeping their API accessible to plugin authors.  It will be interesting to watch the contest of editors over the next few years.&lt;/p&gt; &lt;p&gt;Here is &lt;a href="http://www.infoq.com/articles/jetbrains-developer-tools" title="JetBrains Developer Tools"&gt;JetBrains explaining how they succeed&lt;/a&gt; in an interview with Michael Hunger.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-2799266162872533442?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/2799266162872533442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=2799266162872533442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2799266162872533442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/2799266162872533442'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/take-that-mike.html' title='Take that, Mike'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-713745667508987882</id><published>2010-11-20T07:37:00.000-06:00</published><updated>2010-11-20T07:37:52.270-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><title type='text'>Looking forward to IntelliJ IDEA X</title><content type='html'>&lt;p&gt;I'm looking forward to IntelliJ IDEA X (10), &lt;a href="http://www.jetbrains.com/idea/nextversion/" title="IntelliJ IDEA 10 Public Preview"&gt;due real soon now&lt;/a&gt;.  Typical of the incremental improvements every release has is &lt;a href="http://blogs.jetbrains.com/idea/2010/11/how-to-run-a-single-inspection-in-idea-x/" title="How to Run a Single Inspection in IDEA X?"&gt;&lt;cite&gt;How to Run a Single Inspection in IDEA X?&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I've been running &lt;a href="http://confluence.jetbrains.net/display/IDEADEV/IDEA+X+EAP"&gt;the preview releases&lt;/a&gt; for a while now, and have noticed to my delight that version X is generally faster and lighter-weight than 9 or 8.  &lt;em&gt;Faster, better&lt;/em&gt; &amp;mdash; what's not to like?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-713745667508987882?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/713745667508987882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=713745667508987882' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/713745667508987882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/713745667508987882'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/looking-forward-to-intellij-idea-x.html' title='Looking forward to IntelliJ IDEA X'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-7037781170517909793</id><published>2010-11-20T07:32:00.000-06:00</published><updated>2010-11-20T07:32:07.043-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>Find broken symlinks</title><content type='html'>&lt;p&gt;Helpful sysadmin tip from &lt;a href="http://jasonjgw.net/" title="Jason's Strand of the Web"&gt;Jason White (jasonjgw)&lt;/a&gt;, philosopher &lt;i&gt;cum&lt;/i&gt; Linux expert, &lt;a href="http://www.commandlinefu.com/commands/view/7120/find-broken-symlinks-in-the-current-directory-and-its-subdirectories." title="Find broken symlinks in the current directory and its subdirectories."&gt;on finding broken symlinks&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-7037781170517909793?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/7037781170517909793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=7037781170517909793' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7037781170517909793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7037781170517909793'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/find-broken-symlinks.html' title='Find broken symlinks'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3918691819566186883</id><published>2010-11-18T13:11:00.000-06:00</published><updated>2010-11-18T13:11:58.196-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Great agile advice from Improving Enterprises</title><content type='html'>&lt;p&gt;Devlin Liles of Improving Enterprises writes of his type at Tyson: &lt;a href="http://www.devlinliles.com/post/Lessons-Learned-A-Developer-Retrospective.aspx" title="Lessons Learned: A Developer Retrospective"&gt;&lt;cite&gt;Lessons Learned: A Developer Retrospective&lt;/cite&gt;&lt;/a&gt;.  My favorite piece of advice is the first one: &lt;em&gt;Always Say Yes&lt;/em&gt;:&lt;/p&gt; &lt;blockquote&gt;If the user wants you to write a program that will send unmanned spaceships to hundreds of planets and safely get them back. Say yes. The time, money, effort, and return on investment should be the determining factors for a request, not the developers opinion.&lt;/blockquote&gt; &lt;p&gt;I'd love to build that project.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3918691819566186883?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3918691819566186883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3918691819566186883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3918691819566186883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3918691819566186883'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/great-agile-advice-from-improving.html' title='Great agile advice from Improving Enterprises'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8701020107874088202</id><published>2010-11-11T14:06:00.000-06:00</published><updated>2010-11-11T14:06:12.367-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Ceci n'est pas une liste</title><content type='html'>&lt;p&gt;Like a programming René Magritte, Robert Smith tells us that &lt;a href="http://symbo1ics.com/blog/?p=275" title="Lisp has too many parentheses…"&gt;LISP does not have lists and it does not have parentheses&lt;/a&gt;.  To be fair, he is right.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8701020107874088202?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8701020107874088202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8701020107874088202' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8701020107874088202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8701020107874088202'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/ceci-nest-pas-une-liste.html' title='Ceci n&apos;est pas une liste'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-6250160092343547255</id><published>2010-11-09T14:29:00.000-06:00</published><updated>2010-11-09T14:29:26.966-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java 6 GC algorithms and tuning</title><content type='html'>&lt;p&gt;Sri Lankan Hiranya Jayathilaka posts on &lt;a href="http://techfeast-hiranya.blogspot.com/2010/11/taming-java-garbage-collector.html" title="Taming the Java Garbage Collector"&gt;Java 6 GC algorithms and tuning&lt;/a&gt;.  This goes in my bookmarks.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-6250160092343547255?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/6250160092343547255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=6250160092343547255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6250160092343547255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/6250160092343547255'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/java-6-gc-algorithms-and-tuning.html' title='Java 6 GC algorithms and tuning'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-1696728484609514389</id><published>2010-11-08T09:37:00.001-06:00</published><updated>2010-11-08T09:39:39.107-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Great management example: origins of Java</title><content type='html'>&lt;p&gt;I found a real gem in &lt;a href="http://cs.gmu.edu/~sean/stuff/java-objc.html" title="Java Was Strongly Influenced by Objective-C"&gt;this e-mail exchange&lt;/a&gt; featuring Patrick Naughton.  This part jumped out at me (written by Sean Luke):&lt;/p&gt; &lt;blockquote&gt;As I remember my Java history Patrick Naughton the gentleman who got the ball rolling was about to quit Sun and join up with NeXT. He happened to be on the same intermural hockey team as Scott McNealy. Scott told him to hold off, write what he thought was wrong with Sun before he left. Patrick didn't leave and was one of the original Oak people.&lt;/blockquote&gt; &lt;p&gt;This is amazing! McNealy was the right kind of manager.  Naughton discussed his interests in leaving Sun with McNealy, McNealy asked for feedback and helped Naughton start a new project.&lt;/p&gt; &lt;p&gt;The Internet is filled with &lt;a href="http://www.workingamerica.org/badboss/" title="Workingamerica.org: BadBoss - My Bad Boss Contest, Tell Your Bad Boss"&gt;tales of the other kind of boss&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Also, I should join my boss' team.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-1696728484609514389?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/1696728484609514389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=1696728484609514389' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1696728484609514389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/1696728484609514389'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/great-management-example-origins-of.html' title='Great management example: origins of Java'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3826040632475843968</id><published>2010-11-06T10:07:00.000-05:00</published><updated>2010-11-06T10:07:05.053-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Project inception</title><content type='html'>&lt;p&gt;&lt;a href="http://agilewarrior.wordpress.com/2010/11/06/the-agile-inception-deck" title="The Agile Inception Deck &amp;laquo; The Agile Warrior"&gt;A great post&lt;/a&gt; from Jonathan Rasmusson (author of &lt;a href="http://www.pragprog.com/titles/jtrap/the-agile-samurai"&gt;&lt;cite&gt;The Agile Samurai&lt;/cite&gt;&lt;/a&gt;) on successful project inception.  I wish I had his slide deck.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3826040632475843968?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3826040632475843968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3826040632475843968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3826040632475843968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3826040632475843968'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/11/project-inception.html' title='Project inception'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3971147500767191933</id><published>2010-10-28T21:00:00.000-05:00</published><updated>2010-10-28T21:00:28.610-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>What a find! Land of Lisp!</title><content type='html'>&lt;p&gt;What a find!&lt;a href="http://landoflisp.com"&gt;&lt;cite&gt;Land of Lisp&lt;/cite&gt;&lt;/a&gt;!  Don't forget to scroll down. ٩(•̮̮̃•̃)۶&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3971147500767191933?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3971147500767191933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3971147500767191933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3971147500767191933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3971147500767191933'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/10/what-find-land-of-lisp.html' title='What a find! Land of Lisp!'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-233402153772223804</id><published>2010-10-17T06:33:00.000-05:00</published><updated>2010-10-17T06:33:37.741-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>More on more uses for Iterables</title><content type='html'>&lt;p&gt;Rúnar Bjarnason writes &lt;a href="http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees/"&gt;&lt;cite&gt;Scalaz Tutorial: Enumeration-Based I/O with Iteratees&lt;/cite&gt;&lt;/a&gt;, an all-singing, all-dancing approach to composable iterators for I/O in Scala.  This is a much fuller treatment of I/O iterators than my post, &lt;a href="http://binkley.blogspot.com/2010/08/more-uses-for-iterables.html"&gt;&lt;cite&gt;More uses for Iterables&lt;/cite&gt;&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-233402153772223804?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/233402153772223804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=233402153772223804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/233402153772223804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/233402153772223804'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/10/more-on-more-uses-for-iterables.html' title='More on more uses for Iterables'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8843832927760271601</id><published>2010-10-16T05:59:00.000-05:00</published><updated>2010-10-16T05:59:10.250-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>How to tempt good programmers to work for you</title><content type='html'>&lt;p&gt;Danilo Campos shows by examples &lt;a href="http://blog.danilocampos.com/2010/10/13/stop-speaking-in-bullshit/"&gt;how to tempt good programmers to work for you&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8843832927760271601?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8843832927760271601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8843832927760271601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8843832927760271601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8843832927760271601'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/10/how-to-tempt-good-programmers-to-work.html' title='How to tempt good programmers to work for you'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-3686050982721798639</id><published>2010-10-13T08:43:00.000-05:00</published><updated>2010-10-13T08:43:25.293-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java ain't got no rhythm, but can it keep time?</title><content type='html'>&lt;p&gt;I need sub-millisecond timing in Java; I want to measure events in the low microsecond range.  What to do?  My options seem to be:&lt;/p&gt; &lt;ol type="a"&gt; &lt;li&gt;Use &lt;code&gt;System.currentTimeMillis()&lt;/code&gt; and average over long numbers of runs; many problems here.&lt;/li&gt; &lt;li&gt;Use &lt;code&gt;System.nanoTime()&lt;/code&gt; and time individual events.  Great, but &lt;a href="http://download.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime%28%29"&gt;the Javadoc is very scary&lt;/a&gt; for multi-threaded code.&lt;/li&gt; &lt;li&gt;Try out &lt;code&gt;sun.misc.Perf.highResCounter()&lt;/code&gt; (&lt;a href="http://www.jsresources.org/faq_performance.html#sun_misc_perf"&gt;many non-official references for this&lt;/a&gt;.)&lt;/li&gt; &lt;li&gt;Write our own JNI call for &lt;code&gt;gettimeofday()&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt; &lt;p&gt;After months of hitting my head I wised up and looked into the JDK6 C++ source code.  Surprise!&lt;/p&gt; &lt;h3&gt;The C++ source&lt;/h3&gt; &lt;p&gt;Drilling down points me to &lt;code&gt;os::javaTimeNanos()&lt;/code&gt; (nanoTime), &lt;code&gt;os::elapsed_counter()&lt;/code&gt; (highResCounter), and &lt;code&gt;os::javaTimeMillis()&lt;/code&gt; (currentTimeMillis).  On Linux these are:&lt;/p&gt; &lt;h4&gt;&lt;code&gt;System.currentTimeMillis()&lt;/code&gt;&lt;/h4&gt; &lt;pre&gt;jlong os::javaTimeMillis() {
  timeval time;
  &lt;b&gt;int status = gettimeofday(&amp;time, NULL);&lt;/b&gt;
  assert(status != -1, "linux error");
  return jlong(time.tv_sec) * 1000  +  jlong(time.tv_usec / 1000);
}&lt;/pre&gt; &lt;h4&gt;&lt;code&gt;System.nanoTime()&lt;/code&gt;&lt;/h4&gt; &lt;pre class="code"&gt;jlong os::javaTimeNanos() {
  if (Linux::supports_monotonic_clock()) {
    struct timespec tp;
    int status = Linux::clock_gettime(CLOCK_MONOTONIC, &amp;tp);
    assert(status == 0, "gettime error");
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
    return result;
  } else {
    timeval time;
    &lt;b&gt;int status = gettimeofday(&amp;time, NULL);&lt;/b&gt;
    assert(status != -1, "linux error");
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
    return 1000 * usecs;
  }
}&lt;/pre&gt; &lt;h4&gt;&lt;code&gt;sun.misc.Perf.highResCounter()&lt;/code&gt;&lt;/h4&gt; &lt;pre class="code"&gt;jlong os::elapsed_counter() {
  timeval time;
  &lt;b&gt;int status = gettimeofday(&amp;time, NULL);&lt;/b&gt;
  return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count;
}&lt;/pre&gt; &lt;p&gt;And:&lt;/p&gt; &lt;pre class="code"&gt;void os::init(void) {
  char dummy;   /* used to get a guess on initial stack address */
//  first_hrtime = gethrtime();

  // With LinuxThreads the JavaMain thread pid (primordial thread)
  // is different than the pid of the java launcher thread.
  // So, on Linux, the launcher thread pid is passed to the VM
  // via the sun.java.launcher.pid property.
  // Use this property instead of getpid() if it was correctly passed.
  // See bug 6351349.
  pid_t java_launcher_pid = (pid_t) Arguments::sun_java_launcher_pid();

  _initial_pid = (java_launcher_pid &gt; 0) ? java_launcher_pid : getpid();

  clock_tics_per_sec = sysconf(_SC_CLK_TCK);

  init_random(1234567);

  ThreadCritical::initialize();

  Linux::set_page_size(sysconf(_SC_PAGESIZE));
  if (Linux::page_size() == -1) {
    fatal1("os_linux.cpp: os::init: sysconf failed (%s)", strerror(errno));
  }
  init_page_sizes((size_t) Linux::page_size());

  Linux::initialize_system_info();

  // main_thread points to the aboriginal thread
  Linux::_main_thread = pthread_self();

  Linux::clock_init();
  &lt;b&gt;initial_time_count = os::elapsed_counter();&lt;/b&gt;
  pthread_mutex_init(&amp;dl_mutex, NULL);
}&lt;/pre&gt; &lt;p&gt;(The net effect is to normalize to 0-time at JVM boot rather than the epoch.)&lt;/p&gt; &lt;h3&gt;The solution&lt;/h3&gt; &lt;p&gt;Just use &lt;code&gt;System.nanoTime()&lt;/code&gt; and stop worrying so much.  It is fine for microsecond timing&amp;mdash;even across threads&amp;mdash;&lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/gettimeofday.2.html"&gt;just RTFM&lt;/a&gt; and ignore javadoc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-3686050982721798639?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/3686050982721798639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=3686050982721798639' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3686050982721798639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/3686050982721798639'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/10/java-aint-got-no-rhythm-but-can-it-keep.html' title='Java ain&apos;t got no rhythm, but can it keep time?'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-8643817087503395874</id><published>2010-10-10T14:12:00.000-05:00</published><updated>2010-10-10T14:12:07.078-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Elena Yatzeck promotes the agile Army Leadership Field Manual</title><content type='html'>&lt;p&gt;A positive, fascinating post from Elena Yatzeck &lt;a href="http://pagilista.blogspot.com/2010/10/agile-lessons-from-army-leadership.html"&gt;on agile leadership&lt;/a&gt; as taught in the &lt;a href="http://www.amazon.com/U-S-Army-Leadership-Field-Manual/dp/0071436995"&gt;&lt;cite&gt;U.S. Army Leadership Field Manual&lt;/cite&gt;&lt;/a&gt;.  The only military members of teams immediate to me are presently serving overseas.  Looks like I missed out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-8643817087503395874?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/8643817087503395874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=8643817087503395874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8643817087503395874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/8643817087503395874'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/10/elena-yatzeck-promotes-agile-army.html' title='Elena Yatzeck promotes the agile Army Leadership Field Manual'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5638372.post-7589428969399854176</id><published>2010-10-09T18:30:00.000-05:00</published><updated>2010-10-09T18:30:27.968-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Larval Java</title><content type='html'>&lt;p&gt;Very cool post from John Rose on &lt;a href="http://blogs.sun.com/jrose/entry/larval_objects_in_the_vm"&gt;&lt;cite&gt;larval objects in the VM&lt;/cite&gt;&lt;/a&gt;.  How are immutable objects really made in the JVM?  How could it be improved?  Read and find out.&lt;p/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5638372-7589428969399854176?l=binkley.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://binkley.blogspot.com/feeds/7589428969399854176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5638372&amp;postID=7589428969399854176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7589428969399854176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5638372/posts/default/7589428969399854176'/><link rel='alternate' type='text/html' href='http://binkley.blogspot.com/2010/10/larval-java.html' title='Larval Java'/><author><name>Brian Oxley</name><uri>https://profiles.google.com/118426136972205251581</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IJ5hLhUm5Oc/AAAAAAAAAAI/AAAAAAAAAAA/zPu3N2nCyJI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
