<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Java on traviscj/blog</title>
    <link>https://traviscj.com/blog/tags/java/</link>
    <description>Recent content in Java on traviscj/blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 15 Jun 2022 08:07:47 -0500</lastBuildDate>
    <atom:link href="https://traviscj.com/blog/tags/java/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Transacter and Intent/Result</title>
      <link>https://traviscj.com/blog/post/2022-06-15-transacter-and-intent-result/</link>
      <pubDate>Wed, 15 Jun 2022 08:07:47 -0500</pubDate>
      <guid>https://traviscj.com/blog/post/2022-06-15-transacter-and-intent-result/</guid>
      <description>&lt;p&gt;At SQ, we had a family of &lt;code&gt;Transacter&lt;/code&gt; interfaces:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Transacter&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;transaction&lt;/span&gt;(Function&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Session, Void&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; session);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Session&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    DSLContext &lt;span style=&#34;color:#a6e22e&#34;&gt;dsl&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where &lt;code&gt;DSLContext&lt;/code&gt; is a &lt;a href=&#34;https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/DSLContext.html&#34;&gt;jOOQ concept&lt;/a&gt; &amp;amp; is the handle for doing work against the database.&#xA;Then this would be used in some class like&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;KvDao&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;@Inject&lt;/span&gt; Transacter transacter;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(String ns, String k, String v) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    transacter.&lt;span style=&#34;color:#a6e22e&#34;&gt;transaction&lt;/span&gt;(session &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        KvRecord record &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; KvRecord(ns, k, v);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        session.&lt;span style=&#34;color:#a6e22e&#34;&gt;dsl&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;insertInto&lt;/span&gt;(KV).&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt;(record).&lt;span style=&#34;color:#a6e22e&#34;&gt;execute&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    });&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The parameters &lt;code&gt;ns&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;, and &lt;code&gt;v&lt;/code&gt; are shorthand for &lt;code&gt;namespace&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt;, and &lt;code&gt;value&lt;/code&gt;, respectively.&#xA;We&amp;rsquo;ll show how these might be used together shortly!&lt;/p&gt;</description>
    </item>
    <item>
      <title>interceptors</title>
      <link>https://traviscj.com/blog/post/2020-05-18-interceptors/</link>
      <pubDate>Mon, 18 May 2020 15:13:00 -0700</pubDate>
      <guid>https://traviscj.com/blog/post/2020-05-18-interceptors/</guid>
      <description>&lt;p&gt;INTERCEPTORS ARE SO COOL!&lt;/p&gt;&#xA;&lt;p&gt;Sometimes you need some &amp;ldquo;generic rails&amp;rdquo; that are still highly adaptable to other uses.&#xA;This is the basic problem solved by the &lt;a href=&#34;https://en.wikipedia.org/wiki/Interceptor_pattern&#34;&gt;Interceptor pattern&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I really love the way &lt;a href=&#34;https://square.github.io/okhttp/&#34;&gt;OkHttp&lt;/a&gt; does &lt;a href=&#34;https://square.github.io/okhttp/interceptors/&#34;&gt;interceptors&lt;/a&gt; for the generic rails of making HTTP calls, so I wanted to walk through a case study of why an interceptor might be useful and then try to synthesize some lessons &amp;amp; a minimal example of the pattern.&lt;/p&gt;</description>
    </item>
    <item>
      <title>pattern: extract mutating variables to State class</title>
      <link>https://traviscj.com/blog/post/2019-01-07-pattern_extract_mutating_variables_to_state_class/</link>
      <pubDate>Mon, 07 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-07-pattern_extract_mutating_variables_to_state_class/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve come to really like the pattern of extracting local or instance variables into their own &lt;code&gt;State&lt;/code&gt; class, and writing an algorithm in terms of that &lt;code&gt;State&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A really trivial (if contrived) example of this would be a &amp;ldquo;sum cubes&amp;rdquo; algorithm; something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CubeSummer&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; PrintStream printStream;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; sum;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CubeSummer&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStream&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reset();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumCubes&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; limit) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (; i&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;limit; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      sum &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      display();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; sum;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;reset&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;display&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printStream.&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;i = &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printStream.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; sum = &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; sum);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What&amp;rsquo;s happened here is we&amp;rsquo;ve essentially promoted some variables that should arguably be &lt;em&gt;local&lt;/em&gt; variables into &lt;em&gt;instance&lt;/em&gt; variables, to avoid needing to pass them around explicitly.&#xA;But in the process, we&amp;rsquo;ve also mixed long-lived state with short-lived state, broken thread safety, and forced clients of this class into a particular calling convention (either instantiate an instance per &lt;code&gt;sumCubes&lt;/code&gt; call or carefully respect thread safety and call &lt;code&gt;#reset()&lt;/code&gt;.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>robustness principle and mocks</title>
      <link>https://traviscj.com/blog/post/2018-07-11-robustness-principle-and-mocks/</link>
      <pubDate>Wed, 11 Jul 2018 11:53:54 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-07-11-robustness-principle-and-mocks/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Robustness_principle&#34;&gt;Robustness Principle&lt;/a&gt; (or Postel&amp;rsquo;s Law) states&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Be conservative in what you do, be liberal in what you accept from others (often reworded as &amp;ldquo;Be conservative in what you send, be liberal in what you accept&amp;rdquo;).&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This principle &lt;a href=&#34;https://softwareengineering.stackexchange.com/questions/12401/be-liberal-in-what-you-accept-or-not&#34;&gt;has&lt;/a&gt; &lt;a href=&#34;http://trevorjim.com/postels-law-is-not-for-you/&#34;&gt;some&lt;/a&gt; &lt;a href=&#34;https://programmingisterrible.com/post/42215715657/postels-principle-is-a-bad-idea&#34;&gt;criticisms&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I realized this has interesting implications for &lt;a href=&#34;https://en.wikipedia.org/wiki/Mock_object&#34;&gt;mocks&lt;/a&gt;.&#xA;Suppose you have&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;public class MyObj {&#xA;  private final Integer x;&#xA;  &#xA;  public MyObj(Integer x) {&#xA;    if (x &amp;lt; 0) {&#xA;      throw new IllegalArgumentException(&amp;quot;negative x!&amp;quot;);&#xA;    }&#xA;    this.x = x;&#xA;  }&#xA;  &#xA;  public int getX() {&#xA;    return x;&#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;In a unit test, we can have&lt;/p&gt;</description>
    </item>
    <item>
      <title>constraint violations in tests</title>
      <link>https://traviscj.com/blog/post/2018-05-31-constraint_violations_in_tests/</link>
      <pubDate>Thu, 31 May 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-05-31-constraint_violations_in_tests/</guid>
      <description>&lt;p&gt;I had some test code that looked something like&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;@Test public void a() {&#xA;  db.insert(0, &amp;quot;a&amp;quot;);&#xA;  assertThat(db.query(1).getKey()).isEqualTo(&amp;quot;a&amp;quot;);&#xA;}&#xA;&#xA;@Test public void b() {&#xA;  db.insert(0, &amp;quot;a&amp;quot;);&#xA;  db.insert(1, &amp;quot;b&amp;quot;);&#xA;  assertThat(db.query(2).getKey()).isEqualTo(&amp;quot;b&amp;quot;);&#xA;}&#xA;&#xA;@Test public void c() {&#xA;  assertThat(db.query(3)).isNull();&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;There&amp;rsquo;s some stuff to like about this:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;pretty straightforward which test is touching which records&lt;/li&gt;&#xA;&lt;li&gt;pretty clear what you expect to see in the database.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a bunch of coincidences here that make this work, though:&lt;/p&gt;</description>
    </item>
    <item>
      <title>multiple thread test cases in java</title>
      <link>https://traviscj.com/blog/post/2018-05-15-multiple_thread_test_cases_in_java/</link>
      <pubDate>Tue, 15 May 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-05-15-multiple_thread_test_cases_in_java/</guid>
      <description>&lt;p&gt;Some of my day job lately has been trying to get a better handle on threads in Java.&#xA;In particular, we had a really weird race condition resulting from multiple threads processing an input data stream and causing some unexpected conflicts in our data access layer.&lt;/p&gt;&#xA;&lt;p&gt;To try to replicate the problem in tests, I started with something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; Runnable &lt;span style=&#34;color:#a6e22e&#34;&gt;runWithDelay&lt;/span&gt;(String name, &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; millis) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; () &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Thread.&lt;span style=&#34;color:#a6e22e&#34;&gt;sleep&lt;/span&gt;(millis);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (InterruptedException e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; RuntimeException(e);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(name &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; finished&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;This is just a &lt;code&gt;Runnable&lt;/code&gt; that waits a while, and then prints that it finished.&#xA;Then we can test with something like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>regex in java</title>
      <link>https://traviscj.com/blog/post/2018-02-23-regex-in-java/</link>
      <pubDate>Fri, 23 Feb 2018 13:41:22 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-02-23-regex-in-java/</guid>
      <description>&lt;p&gt;I can never remember how to do java regexes with Pattern.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Pattern pattern &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Pattern.&lt;span style=&#34;color:#a6e22e&#34;&gt;compile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x_(yy|zz)&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String input &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x_yy&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; m &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pattern.&lt;span style=&#34;color:#a6e22e&#34;&gt;asPredicate&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;test&lt;/span&gt;(input);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matches: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; m);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Matcher matcher &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pattern.&lt;span style=&#34;color:#a6e22e&#34;&gt;matcher&lt;/span&gt;(input);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (matcher.&lt;span style=&#34;color:#a6e22e&#34;&gt;find&lt;/span&gt;()) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;whole matched string: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; matcher.&lt;span style=&#34;color:#a6e22e&#34;&gt;group&lt;/span&gt;(0));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;matched group: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; matcher.&lt;span style=&#34;color:#a6e22e&#34;&gt;group&lt;/span&gt;(1));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also learned a really cool thing IntelliJ can do with pattern matches!&lt;/p&gt;&#xA;&lt;p&gt;![java regex]({{ site.baseurl }}/assets/java-regex.png)&lt;/p&gt;</description>
    </item>
    <item>
      <title>guava RangeMap</title>
      <link>https://traviscj.com/blog/post/2018-01-26-guava-rangemap/</link>
      <pubDate>Fri, 26 Jan 2018 09:52:41 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-26-guava-rangemap/</guid>
      <description>&lt;p&gt;We had some code like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NavigableMap&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Double, Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; PRIORITY_MULTIPLIERS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TreeMap&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Double, Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;() {{ &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{{ &amp;#34;&lt;/span&gt; }}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  put(LOW_THRESHOLD, 1);    &lt;span style=&#34;color:#75715e&#34;&gt;// (20k..40k)  =&amp;gt; 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  put(MEDIUM_THRESHOLD, 2); &lt;span style=&#34;color:#75715e&#34;&gt;// [40k..100k) =&amp;gt; 2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  put(HIGH_THRESHOLD, 3);   &lt;span style=&#34;color:#75715e&#34;&gt;// [100k..+∞)  =&amp;gt; 3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Integer &lt;span style=&#34;color:#a6e22e&#34;&gt;getPriorityMultiplier&lt;/span&gt;(Double v) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (v &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; LOW_THRESHOLD) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; PRIORITY_MULTIPLIERS.&lt;span style=&#34;color:#a6e22e&#34;&gt;floorEntry&lt;/span&gt;(v).&lt;span style=&#34;color:#a6e22e&#34;&gt;getValue&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I replaced with a [&lt;code&gt;RangeMap&lt;/code&gt;][RangeMap] that uses [&lt;code&gt;Range&lt;/code&gt;][Range] instances as keys:&#xA;[RangeMap]: &lt;a href=&#34;https://google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/RangeMap.html&#34;&gt;https://google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/RangeMap.html&lt;/a&gt;&#xA;[Range]: &lt;a href=&#34;https://google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/Range.html&#34;&gt;https://google.github.io/guava/releases/16.0/api/docs/com/google/common/collect/Range.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RangeMap&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Double, Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; PRIORITY_MULTIPLIERS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ImmutableRangeMap.&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Double, Long&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;builder()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(Range.&lt;span style=&#34;color:#a6e22e&#34;&gt;lessThan&lt;/span&gt;(LOW_THRESHOLD), 0)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(Range.&lt;span style=&#34;color:#a6e22e&#34;&gt;closedOpen&lt;/span&gt;(LOW_THRESHOLD, MEDIUM_THRESHOLD), 1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(Range.&lt;span style=&#34;color:#a6e22e&#34;&gt;closedOpen&lt;/span&gt;(MEDIUM_THRESHOLD, HIGH_THRESHOLD), 2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(Range.&lt;span style=&#34;color:#a6e22e&#34;&gt;atLeast&lt;/span&gt;(HIGH_THRESHOLD), 3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      .&lt;span style=&#34;color:#a6e22e&#34;&gt;build&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Integer &lt;span style=&#34;color:#a6e22e&#34;&gt;getPriorityMultiplier&lt;/span&gt;(Double v) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; rangePriorityMultipliers.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(v);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Advantages here being:&lt;/p&gt;</description>
    </item>
    <item>
      <title>relational java explorations with sqlite3 vtab</title>
      <link>https://traviscj.com/blog/post/2017-05-05-relational-java-explorations-with-sqlite3-vtab/</link>
      <pubDate>Fri, 05 May 2017 20:10:28 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-05-05-relational-java-explorations-with-sqlite3-vtab/</guid>
      <description>&lt;p&gt;One idea i have been mulling over lately is exposing a java codebase relationally, with queries like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; classes &lt;span style=&#34;color:#66d9ef&#34;&gt;c&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; annotations a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; a.class_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;c&lt;/span&gt;.id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WHERE&lt;/span&gt; a.name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;MyAnnotationClass&amp;#39;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;The idea here is that you could search a codebase by pretending that you had tables for a whole bunch of things like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;classes&lt;/li&gt;&#xA;&lt;li&gt;annotations&lt;/li&gt;&#xA;&lt;li&gt;variables&lt;/li&gt;&#xA;&lt;li&gt;literals&lt;/li&gt;&#xA;&lt;li&gt;methods&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This would be a useful thing because instead of relying on an IDE like IntelliJ to do &amp;ldquo;find usages&amp;rdquo; operations, you could actually script those interactions.&#xA;Admittedly, of course, Java has some pretty sophisticated reflection APIs to find this sort of stuff too, but it seems like exploring the structure could be much easier writing Java code to traverse those trees.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu Hacks -- Flash, Java, e17</title>
      <link>https://traviscj.com/blog/post/2008-10-20-ubuntu_hacks_flash_java_e17/</link>
      <pubDate>Mon, 20 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-20-ubuntu_hacks_flash_java_e17/</guid>
      <description>&lt;p&gt;This must be about the 1 millionth time someone&amp;rsquo;s written a blog post about this, because I waded through a ton of them to get ones that worked. Which means someday, someone will be wading through 10 million websites trying to get their Flash, Java, and e17 working.&lt;/p&gt;&#xA;&lt;p&gt;For the browser issues, I found &lt;a href=&#34;http://ubuntuforums.org/showthread.php?p=1174435&#34;&gt;this thread&lt;/a&gt; on the Ubuntu forums. In short, you download the first file listed(the Browser Install Script), untar it, and run it. It will download and install the 32-bit libraries, 32-bit browser, and plugins from the set of {Flash, Java, VLC}. The only trick then is rewriting your scripts to use firefox32 instead of just firefox.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
