<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on traviscj/blog</title>
    <link>https://traviscj.com/blog/post/</link>
    <description>Recent content in Posts on traviscj/blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 24 Jun 2025 19:47:52 -0500</lastBuildDate>
    <atom:link href="https://traviscj.com/blog/post/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Evolution of a Get Endpoint</title>
      <link>https://traviscj.com/blog/post/2025-06-24-evolution-of-a-get-endpoint/</link>
      <pubDate>Tue, 24 Jun 2025 19:47:52 -0500</pubDate>
      <guid>https://traviscj.com/blog/post/2025-06-24-evolution-of-a-get-endpoint/</guid>
      <description>&lt;p&gt;My work project started pretty simple: there was a simple &lt;code&gt;GetXyz&lt;/code&gt; endpoint that just looked up the &lt;code&gt;xyz&lt;/code&gt; record in the database by a unique key &amp;amp; returned it.&#xA;How complicated could it be?&lt;/p&gt;&#xA;&lt;p&gt;It was a straightforward generalization of an old &lt;code&gt;GetAbc&lt;/code&gt; functionality, it was really only used by oncall engineers through an admin console, it shouldn&amp;rsquo;t have been too big of a deal.&lt;/p&gt;&#xA;&lt;p&gt;Ok, but then it outgrew its original datastore, so a separate service had to be created.&#xA;We thought about migrating clients, but at the time it seemed faster to just implement once on our side &amp;amp; have clients continue calling us; essentially encapsulating the separate service as an implementation detail.&#xA;But as part of the traffic swing, we figured it should support either the &lt;code&gt;local&lt;/code&gt; or the &lt;code&gt;remote&lt;/code&gt; read path.&lt;/p&gt;</description>
    </item>
    <item>
      <title>loan trickery</title>
      <link>https://traviscj.com/blog/post/2025-03-27-loan-trickery/</link>
      <pubDate>Thu, 27 Mar 2025 10:36:04 -0500</pubDate>
      <guid>https://traviscj.com/blog/post/2025-03-27-loan-trickery/</guid>
      <description>&lt;p&gt;I have this &amp;ldquo;American Express Blueprint Business Loan&amp;rdquo; product to have a line of credit for the rentals if I&amp;rsquo;m ever in a pinch.&lt;/p&gt;&#xA;&lt;p&gt;They allow up to $21,700 with this very easy application process, you basically just slide a slider to the amount needed &amp;amp; select between 6, 12, 18, 24 months:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://traviscj.com/blog/assets/amex-slider.png&#34; alt=&#34;amex-slider&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This shows a schedule like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://traviscj.com/blog/assets/amex-6mo-schedule.png&#34; alt=&#34;amex-6mo-schedule&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Looking at this, there&amp;rsquo;s a lot of temptation to think&lt;/p&gt;</description>
    </item>
    <item>
      <title>38 and Grateful</title>
      <link>https://traviscj.com/blog/post/2024-12-03-38-and-grateful/</link>
      <pubDate>Tue, 03 Dec 2024 13:03:37 -0600</pubDate>
      <guid>https://traviscj.com/blog/post/2024-12-03-38-and-grateful/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since I&amp;rsquo;ve written an update &amp;ndash; 2.5y! &amp;ndash; and a long time since I wrote very frequently.&#xA;On top of all the crazy ways the world has changed in the last five years, a bunch has changed for me personally in the last five years as well, along a bunch of different axes.&lt;/p&gt;&#xA;&lt;p&gt;I think part of the reason it’s been hard to post is wanting to avoid coming across as bragging about the high points of this journey and also not really wanting to admit some of the low points, but I feel I’ve had a lot on my mind that doesn’t really make sense in blog form without the greater context; I’ve decided that I’d rather just share a lot of what’s been going on in the hopes that some part of it is relevant to someone out there or gives them some fortitude for whatever low spot they’re going through or can learn something from it.&lt;/p&gt;</description>
    </item>
    <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>hype channels</title>
      <link>https://traviscj.com/blog/post/2021-08-23-hype-channels/</link>
      <pubDate>Mon, 23 Aug 2021 21:20:31 -0500</pubDate>
      <guid>https://traviscj.com/blog/post/2021-08-23-hype-channels/</guid>
      <description>&lt;p&gt;When I was managing a small team, one of the coolest protips I came across was the idea of a &amp;ldquo;hype channel&amp;rdquo;.&#xA;This builds on the idea of a &lt;a href=&#34;https://developer.squareup.com/blog/you-are-your-own-best-hype-person/&#34;&gt;&amp;ldquo;hype doc&amp;rdquo;&lt;/a&gt; by changing the medium: instead of writing into a document, you write blurbs on your own private Slack channel.&lt;/p&gt;&#xA;&lt;p&gt;I’m not sure whether this would help anyone but me, but maybe it’ll help someone else drowning in Chrome tabs?&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>Hugo</title>
      <link>https://traviscj.com/blog/post/2020-04-01-hugo/</link>
      <pubDate>Wed, 01 Apr 2020 22:09:04 -0700</pubDate>
      <guid>https://traviscj.com/blog/post/2020-04-01-hugo/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve decided to migrate the blog to &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;, as you might have noticed from the new look.&lt;/p&gt;&#xA;&lt;p&gt;This is gonna be a pretty big project and I&amp;rsquo;m probably going to be at it a while.&#xA;I did keep a copy of the old blog at &lt;a href=&#34;https://traviscj.com/blog.jekyll&#34;&gt;blog.jekyll&lt;/a&gt; but it seems the formatting is already broken there :-(&lt;/p&gt;</description>
    </item>
    <item>
      <title>feeds justification</title>
      <link>https://traviscj.com/blog/post/2019-06-11-feeds_justification/</link>
      <pubDate>Tue, 11 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-06-11-feeds_justification/</guid>
      <description>&lt;p&gt;I realized I&amp;rsquo;ve left out a major part from my &lt;a href=&#34;https://traviscj.com/blog/post/2019-01-08-feed_sequences/&#34;&gt;sequence&lt;/a&gt; of &lt;a href=&#34;https://traviscj.com/blog/post/2018-10-03-feeds_as_cache_invalidation_mechanism/&#34;&gt;previous&lt;/a&gt; &lt;a href=&#34;https://traviscj.com/blog/post/2018-06-29-mysql_feeds/&#34;&gt;feed&lt;/a&gt;-&lt;a href=&#34;https://traviscj.com/blog/post/2018-07-10-cross-dc-sync-with-feed-published_kv/&#34;&gt;related&lt;/a&gt; &lt;a href=&#34;https://traviscj.com/blog/post/2018-10-29-sharded_feeds/&#34;&gt;posts&lt;/a&gt;: a justification for why we should bother with a separate &lt;code&gt;feed_sync_id&lt;/code&gt;.&#xA;So let&amp;rsquo;s give it a shot!&#xA;The fundamental problem is:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;AUTO_INCREMENT&lt;/code&gt; ids are &lt;em&gt;assigned&lt;/em&gt; in &lt;strong&gt;insertion&lt;/strong&gt; order, but become visible to other threads in &lt;strong&gt;commit&lt;/strong&gt; order.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;To see how this causes a problem, consider the interactions and visibilities between three transactions to the same database:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;t0: TRX0: BEGIN; INSERT INTO kv (ns, k, v) VALUES (&amp;quot;-&amp;quot;, &amp;quot;k0&amp;quot;, &amp;quot;v0&amp;quot;); COMMIT;&#xA;t1: TRX1: BEGIN; INSERT INTO kv (ns, k, v) VALUES (&amp;quot;-&amp;quot;, &amp;quot;k1&amp;quot;, &amp;quot;v1&amp;quot;);&#xA;t2: TRX2: BEGIN; INSERT INTO kv (ns, k, v) VALUES (&amp;quot;-&amp;quot;, &amp;quot;k2&amp;quot;, &amp;quot;v2&amp;quot;);&#xA;t3: TRX0: SELECT MAX(id) FROM kv;&#xA;t4: TRX2: COMMIT;&#xA;t5: TRX0: SELECT MAX(id) FROM kv;&#xA;t6: TRX1: COMMIT;&#xA;t7: TRX0: SELECT MAX(id) FROM kv;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Here, we have two transactions that both insert a new &lt;code&gt;kv&lt;/code&gt; record.&#xA;The database &lt;em&gt;has&lt;/em&gt; to assign an &lt;code&gt;id&lt;/code&gt; value to each of those records, because we might be creating other associations to those records in our application code.&#xA;But other threads &amp;ndash; &lt;code&gt;TRX0&lt;/code&gt; in this case &amp;ndash; shouldn&amp;rsquo;t be able to see those records until we &lt;code&gt;COMMIT&lt;/code&gt;, and so indeed the &lt;code&gt;SELECT&lt;/code&gt; at &lt;code&gt;t=t3&lt;/code&gt; might return &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>macos log command</title>
      <link>https://traviscj.com/blog/post/2019-05-23-macos_log_command/</link>
      <pubDate>Thu, 23 May 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-05-23-macos_log_command/</guid>
      <description>&lt;p&gt;My work laptop has been randomly shutting itself off.&#xA;I came across &lt;a href=&#34;TODO&#34;&gt;this&lt;/a&gt; stackoverflow post, it said to run&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;log show &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --predicate &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eventMessage contains &amp;#34;Previous shutdown cause&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --last 24h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which, for me, returns&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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;risksys  ➜ log show --predicate &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;eventMessage contains &amp;#34;Previous shutdown cause&amp;#34;&amp;#39;&lt;/span&gt; --last 24h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Filtering the log data using &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;composedMessage CONTAINS &amp;#34;&lt;/span&gt;Previous shutdown cause&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;Skipping info and debug messages, pass --info and/or --debug to include.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Timestamp                       Thread     Type        Activity             PID    TTL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-05-23 11:29:01.874486-0700 0xaf       Default     0x0                  &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;    kernel: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;AppleSMC&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Previous shutdown cause: -128&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2019-05-23 11:44:49.786722-0700 0xaf       Default     0x0                  &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;      &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;    kernel: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;AppleSMC&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Previous shutdown cause: -128&#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;Log      - Default:          2, Info:                0, Debug:             0, Error:          0, Fault:          &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Activity - Create:           0, Transition:          0, Actions:           &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This, combined with these &lt;a href=&#34;https://georgegarside.com/blog/macos/shutdown-causes/&#34;&gt;MacOS Shutdown Causes&lt;/a&gt; paints a pretty bleak picture: I&amp;rsquo;ve got RAM issues :-(&lt;/p&gt;</description>
    </item>
    <item>
      <title>absolutely minimal OLTP to OLAP pipeline</title>
      <link>https://traviscj.com/blog/post/2019-04-25-oltp_to_olap/</link>
      <pubDate>Thu, 25 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-04-25-oltp_to_olap/</guid>
      <description>&lt;p&gt;Suppose we have some data in a production OLTP database, and we need to send it to some OLAP database.&#xA;This post describes one of the simplest approaches, and how to make it productional enough to rely on.&lt;/p&gt;&#xA;&lt;p&gt;For every table &lt;code&gt;t&lt;/code&gt;, we need to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;introduce a new field, &lt;code&gt;updated_at&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;introduce a new index on that field, so we can get the records that changed after a certain &lt;code&gt;updated_at&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For example,&lt;/p&gt;</description>
    </item>
    <item>
      <title>smart arguments</title>
      <link>https://traviscj.com/blog/post/2019-02-21-smart-arguments/</link>
      <pubDate>Thu, 21 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-02-21-smart-arguments/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s easy to love the terseness one can get out of a command-line tool with a &amp;ldquo;pass by order&amp;rdquo; convention.&#xA;For example, maybe I run something like&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;deploy myapp sea2 production&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to deploy an application called &lt;code&gt;myapp&lt;/code&gt; to the second &lt;strong&gt;production&lt;/strong&gt; datacenter near Seattle.&#xA;This works great, except now I need to remember the order of arguments is: &lt;code&gt;deploy [app] [datacenter] [environment]&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The typical solve for this problem is introducing named arguments, so you&amp;rsquo;d end up with&lt;/p&gt;</description>
    </item>
    <item>
      <title>feed sequences</title>
      <link>https://traviscj.com/blog/post/2019-01-08-feed_sequences/</link>
      <pubDate>Tue, 08 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-08-feed_sequences/</guid>
      <description>&lt;p&gt;In the &lt;a href=&#34;https://traviscj.com/blog/post/2018-06-29-mysql_feeds/&#34;&gt;mysql feeds&lt;/a&gt; post, I mentioned that the publisher could do&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:#66d9ef&#34;&gt;MAX&lt;/span&gt;(feed_sync_id)&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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; kv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to find the next &lt;code&gt;feed_sync_id&lt;/code&gt; during the publishing process, but&#xA;&lt;strong&gt;this is actually a really bad idea.&lt;/strong&gt;&#xA;(And I knew it at the time, so forgive me for selling lies&amp;hellip;)&lt;/p&gt;&#xA;&lt;h2 id=&#34;republishing&#34;&gt;Republishing&lt;/h2&gt;&#xA;&lt;p&gt;Before we jump into the problematic scenario, I&amp;rsquo;d like to motivate it with a tiny bit of background.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;em&gt;republish&lt;/em&gt; operation is extremely useful when consumers need to receive updates.&#xA;It is also extremely simple!&#xA;A query like&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>unreasonable wish -- an sql interface to websites</title>
      <link>https://traviscj.com/blog/post/2019-01-06-sql_interface_to_websites/</link>
      <pubDate>Sun, 06 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-06-sql_interface_to_websites/</guid>
      <description>&lt;p&gt;I was searching Amazon Prime for some Earl Grey tea for my wife.&#xA;I got these results&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://traviscj.com/blog/assets/earl_grey_tea.png&#34; alt=&#34;earl grey tea&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This was just a basic search for &lt;a href=&#34;https://www.amazon.com/s?url=srs%3D7301146011%26search-alias%3Dpantry&amp;amp;field-keywords=earl+grey+tea&#34;&gt;earl grey tea&lt;/a&gt; in the Prime Pantry store.&lt;/p&gt;&#xA;&lt;p&gt;I would love to&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; products p&#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; p.prime_pantry &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;AND&lt;/span&gt; p.keywords &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;earl grey tea&amp;#39;&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;AND&lt;/span&gt; p.packaging &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;bulk&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I get that this&amp;rsquo;ll never happen, but man&amp;hellip; it&amp;rsquo;d be nice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>more light, better pictures</title>
      <link>https://traviscj.com/blog/post/2019-01-05-more_light_better_pictures/</link>
      <pubDate>Sat, 05 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-05-more_light_better_pictures/</guid>
      <description>&lt;p&gt;We were trying to take some Christmas pictures but feeling a bit unsatisfied with the way the pictures were coming out:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://traviscj.com/blog/assets/without_lamp_light_s.jpg&#34; alt=&#34;without_lamp_light_s&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I wanted some flash or something, but the batteries on all the &amp;ldquo;better&amp;rdquo; cameras were already dead, so I went looking for an alternative.&#xA;We tried to get the overhead light turned on, but couldn&amp;rsquo;t find the switch for that.&lt;/p&gt;&#xA;&lt;p&gt;The next-closest source of light was a sheet music lamp on my mom&amp;rsquo;s piano!&#xA;Borrowing that for the cause, I was able to get this one instead:&lt;/p&gt;</description>
    </item>
    <item>
      <title>watching progress in mysql</title>
      <link>https://traviscj.com/blog/post/2019-01-04-watching_progress_in_mysql/</link>
      <pubDate>Fri, 04 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-04-watching_progress_in_mysql/</guid>
      <description>&lt;p&gt;Pretty frequently at work, I end up &lt;a href=&#34;https://traviscj.com/blog/post/2014-10-15-dont_poll/&#34;&gt;polling&lt;/a&gt; a database with some command 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:#66d9ef&#34;&gt;MAX&lt;/span&gt;(id) &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; my_tbl;&#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;SELECT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;MAX&lt;/span&gt;(id) &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; my_tbl;&#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;SELECT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;MAX&lt;/span&gt;(id) &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; my_tbl;&#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;SELECT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;MAX&lt;/span&gt;(id) &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; my_tbl;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;-- .... ad nauseam ....&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve eventually noticed a few patterns I use pretty consistently:&lt;/p&gt;&#xA;&lt;h3 id=&#34;estimate-eta-by-including-nowunix_timestamp&#34;&gt;estimate ETA by including &lt;code&gt;NOW()&lt;/code&gt;/&lt;code&gt;UNIX_TIMESTAMP()&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Generally, the point of hovering over the table is to get an estimate of when it will finish/catch up/whatever.&#xA;For that, you generally want to include a timestamp in the query output, so when you come back a while later, you can know exactly how much time has elapsed.&#xA;I might transform the above query into&lt;/p&gt;</description>
    </item>
    <item>
      <title>personal finance resources</title>
      <link>https://traviscj.com/blog/post/2019-01-03-personal-finance-resources/</link>
      <pubDate>Thu, 03 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-03-personal-finance-resources/</guid>
      <description>&lt;p&gt;I wanted to say a tiny bit about personal finance stuff, as I feel like I have gotten a fairly good feel for it.&lt;/p&gt;&#xA;&lt;p&gt;Some great resources to start getting up to speed include:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/personalfinance/&#34;&gt;r/personalfinance&lt;/a&gt;, especially&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/personalfinance/wiki&#34;&gt;the common topics&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.reddit.com/r/personalfinance/wiki&#34;&gt;the wiki&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;index-investments&#34;&gt;index investments&lt;/h2&gt;&#xA;&lt;p&gt;Ideally you want to own a lot of different companies, so you&amp;rsquo;ve &lt;em&gt;diversified&lt;/em&gt; your asset ownership.&#xA;One of the easiest ways to do this is through &lt;strong&gt;index investing&lt;/strong&gt;, where the index &amp;ldquo;tracks&amp;rdquo; a broad swath of the market, like &amp;ldquo;All S&amp;amp;P 500 Companies&amp;rdquo; or &amp;ldquo;All stock market companies&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>espps are free money</title>
      <link>https://traviscj.com/blog/post/2019-01-02-espps_are_free_money/</link>
      <pubDate>Wed, 02 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-02-espps_are_free_money/</guid>
      <description>&lt;p&gt;ESPPs give employees an opportunity to buy the company stock at a discount. In both of the examples I&amp;rsquo;m aware of, the companies give a 15% discount on the LESSER of the price on the grant date and the price on the purchase date. The purchase dates are every six months, while the grants I&amp;rsquo;ve seen are either 12 or 24 months.&lt;/p&gt;&#xA;&lt;p&gt;We can analyze this mathematically by breaking it into three cases. For concreteness, let&amp;rsquo;s look at ADBE for a grant date of 2019-01-02. The stock is trading at $224.27/share currently:&lt;/p&gt;</description>
    </item>
    <item>
      <title>tradeoffs</title>
      <link>https://traviscj.com/blog/post/2019-01-01-tradeoffs/</link>
      <pubDate>Tue, 01 Jan 2019 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2019-01-01-tradeoffs/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Life is (just) a series of tradeoffs.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DawnAnn &amp;ldquo;Mom&amp;rdquo; Johnson&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I heard this so many times growing up that I think I actually &lt;em&gt;stopped&lt;/em&gt; hearing it.&#xA;But recently, I realized that it&amp;rsquo;s never been more pertinent than to my current day-to-day life as a software engineer.&lt;/p&gt;&#xA;&lt;p&gt;The fundamental tradeoff we make on the Risk Systems team is trading off between&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;how much fraud we catch (and symmetrically, miss!)&lt;/li&gt;&#xA;&lt;li&gt;how many false positives we incur to catch that much fraud&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Those false positives running rampant can inhibit growth (in terms of interested customers) of the product we&amp;rsquo;re trying to protect,&#xA;but letting too much fraud through can make a product too expensive (and even liable to be shut down!)&lt;/p&gt;</description>
    </item>
    <item>
      <title>sharded feeds</title>
      <link>https://traviscj.com/blog/post/2018-10-29-sharded_feeds/</link>
      <pubDate>Mon, 29 Oct 2018 18:30:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-29-sharded_feeds/</guid>
      <description>&lt;p&gt;Suppose that:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;our humble &lt;a href=&#34;https://traviscj.com/blog/post/2018-06-29-mysql_feeds/&#34;&gt;KV feed&lt;/a&gt; sees &lt;em&gt;a lot&lt;/em&gt; of traffic.&lt;/li&gt;&#xA;&lt;li&gt;someone needs to consume our &lt;a href=&#34;https://traviscj.com/blog/post/2018-06-29-mysql_feeds/&#34;&gt;KV feed&lt;/a&gt; with multiple threads.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;data&#34;&gt;data&lt;/h3&gt;&#xA;&lt;p&gt;The first step is to introduce a notion of &amp;ldquo;shards&amp;rdquo; into our data model:&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;ALTER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;kv&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;ADD&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;COLUMN&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;shard&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; INT(&lt;span style=&#34;color:#ae81ff&#34;&gt;11&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;0&amp;#39;&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;ADD&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;INDEX&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;k_fsi_s&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;feed_sync_id&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;shard&lt;span style=&#34;color:#f92672&#34;&gt;`&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;publishing&#34;&gt;publishing&lt;/h3&gt;&#xA;&lt;p&gt;We don&amp;rsquo;t need to alter the publishing until the publishing &lt;em&gt;itself&lt;/em&gt; is too slow to work with a single thread, but this introduces a &lt;em&gt;lot&lt;/em&gt; of complications, so let&amp;rsquo;s just hold off for now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>moar stupid jquery tricks</title>
      <link>https://traviscj.com/blog/post/2018-10-23-moar_stupid_jquery_tricks/</link>
      <pubDate>Tue, 23 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-23-moar_stupid_jquery_tricks/</guid>
      <description>&lt;p&gt;Sometimes it&amp;rsquo;s useful to use &lt;a href=&#34;https://tampermonkey.net/&#34;&gt;tampermonkey&lt;/a&gt; on a site without nice &lt;code&gt;id&lt;/code&gt;s for the elements you want to edit.&#xA;It turns out it&amp;rsquo;s still pretty easy!&lt;/p&gt;&#xA;&lt;p&gt;Take &lt;a href=&#34;https://traviscj.com/&#34;&gt;my own website&lt;/a&gt;; I have &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; elements for the headers, but none of them have any &lt;code&gt;id&lt;/code&gt;s associated.&#xA;But as discussed in the &lt;a href=&#34;https://traviscj.com/blog/post/2018-10-17-jquery_selectors/&#34;&gt;jquery selectors&lt;/a&gt; post, we can still select by just the tag, with a selector like&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$(&amp;quot;h2&amp;quot;)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This returns a &lt;code&gt;jQuery&lt;/code&gt; object, which behaves like an array.&#xA;If we want to select a particular one &amp;ndash; like &amp;ldquo;Research Interests&amp;rdquo; &amp;ndash; we can try accessing different elements until we get the one we want:&lt;/p&gt;</description>
    </item>
    <item>
      <title>skydive!</title>
      <link>https://traviscj.com/blog/post/2018-10-21-skydive/</link>
      <pubDate>Sun, 21 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-21-skydive/</guid>
      <description>&lt;p&gt;For my 32nd birthday, my wife took me skydiving!&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;</description>
    </item>
    <item>
      <title>killing all timeouts in js</title>
      <link>https://traviscj.com/blog/post/2018-10-17-killing_all_timeouts_in_js/</link>
      <pubDate>Wed, 17 Oct 2018 20:43:04 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-17-killing_all_timeouts_in_js/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://activelab.io/code-snippets/clearing-all-javascript-timeouts&#34;&gt;this article&lt;/a&gt; has a nice trick for killing all javascript timeouts:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;function stopAllTimeouts() {&#xA;    var id = window.setTimeout(null, 0);&#xA;    while (id--) {&#xA;        window.clearTimeout(id);&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;which can be entered on the javascript console and then run with&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;stopAllTimeouts()&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This is an effective way to prevent javascript timeouts from doing a whole variety of things, like&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;carousels&lt;/li&gt;&#xA;&lt;li&gt;endless scrolls&lt;/li&gt;&#xA;&lt;li&gt;any other kind of animations&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>jquery selectors</title>
      <link>https://traviscj.com/blog/post/2018-10-17-jquery_selectors/</link>
      <pubDate>Wed, 17 Oct 2018 03:51:27 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-17-jquery_selectors/</guid>
      <description>&lt;p&gt;This is silly, but I always forget this:&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;I also learned you can specify things like&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;// @require https://code.jquery.com/jquery-2.1.4.min.js&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;in a Tampermonkey script, even when a given site doesn&amp;rsquo;t already have jquery.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Naming is hard (so don&#39;t)</title>
      <link>https://traviscj.com/blog/post/2018-10-07-naming_is_hard_so_dont/</link>
      <pubDate>Sun, 07 Oct 2018 02:31:43 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-07-naming_is_hard_so_dont/</guid>
      <description>&lt;p&gt;A lot of times I just want to &lt;strong&gt;record&lt;/strong&gt; something.&#xA;This should be one of those things computers are good at.&#xA;Turns out this is a bit harder than it seems: many editors make you &lt;em&gt;name&lt;/em&gt; a file to save it.&lt;/p&gt;&#xA;&lt;p&gt;One easy-sounding way to record something is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;open up a text editor&lt;/li&gt;&#xA;&lt;li&gt;mash the keyboard until the thought is out of your head and into the text editor&lt;/li&gt;&#xA;&lt;li&gt;(hard part starts) what do we name that file?&lt;/li&gt;&#xA;&lt;li&gt;where do we put that file?&lt;/li&gt;&#xA;&lt;li&gt;do we remember to save that file, given the difficulty of (3) &amp;amp; (4)?&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I think picking names &lt;em&gt;too early&lt;/em&gt; is at best a minor annoyance, and at worst a pretty major distraction.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Feeds as cache invalidation mechanism</title>
      <link>https://traviscj.com/blog/post/2018-10-03-feeds_as_cache_invalidation_mechanism/</link>
      <pubDate>Wed, 03 Oct 2018 02:31:43 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-10-03-feeds_as_cache_invalidation_mechanism/</guid>
      <description>&lt;p&gt;One really cool use of &lt;a href=&#34;https://traviscj.com/blog/post/2018-06-29-mysql_feeds/&#34;&gt;feeds&lt;/a&gt; we&amp;rsquo;ve realized is that it gives a very efficient mechanism for application code to load the most recent versions of a table into memory.&#xA;The basic idea is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Set it up as a usual feed published table with an appropriate index on &lt;code&gt;feed_sync_id&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Either alongside or within the cache, represent the latest loaded &lt;code&gt;feed_sync_id&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Set up a cronjob/etc that reads the latest &lt;code&gt;feed_sync_id&lt;/code&gt; and compares it to the cache&amp;rsquo;s &lt;code&gt;feed_sync_id&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;If they differ, reload the cache.&lt;/li&gt;&#xA;&lt;li&gt;Ensure that all changes set &lt;code&gt;feed_sync_id&lt;/code&gt; to null!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This works really well because the &lt;code&gt;feed_sync_id&lt;/code&gt; in the database only gets updated on changes, so the reload cronjob mostly is a no-op.&#xA;This means we can reload very frequently!&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>cross-dc sync with feed published KV</title>
      <link>https://traviscj.com/blog/post/2018-07-10-cross-dc-sync-with-feed-published_kv/</link>
      <pubDate>Tue, 10 Jul 2018 11:34:39 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-07-10-cross-dc-sync-with-feed-published_kv/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been fun describing the &lt;a href=&#34;https://traviscj.com/blog/post/2018-06-29-mysql_feeds/&#34;&gt;feeds&lt;/a&gt; framework we use at Square.&#xA;Today we&amp;rsquo;ll dive into a concrete problem:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;We&amp;rsquo;ll stick with the feed-published &lt;code&gt;kv&lt;/code&gt; table again.&lt;/li&gt;&#xA;&lt;li&gt;We want two instances of some application code to bidirectionally synchronize the writes that happened on their instance to the other.&lt;/li&gt;&#xA;&lt;li&gt;Eventually consistent is ok.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;First, a bit of justification, though:&#xA;I use this KV table to remember things I might have to look up without usual context, like my motorcycle&amp;rsquo;s license plate number, or that one weird python snippet I can never remember.&#xA;I also have a whole slew of them at work &amp;ndash; a bunch of random representative IDs for a bunch of things in our systems that I use from time to time.&#xA;I &lt;em&gt;also&lt;/em&gt; use a bunch of these as todo items at work, but that happens to work differently and is a topic for a future blog post :-)&lt;/p&gt;</description>
    </item>
    <item>
      <title>history preserving data models</title>
      <link>https://traviscj.com/blog/post/2018-07-02-history-preserving-data-models/</link>
      <pubDate>Mon, 02 Jul 2018 11:34:39 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-07-02-history-preserving-data-models/</guid>
      <description>&lt;p&gt;Start with a super simple data model:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;CREATE TABLE kv (&#xA;  id BIGINT(22) NOT NULL AUTO_INCREMENT,&#xA;  k VARCHAR(255) NOT NULL,&#xA;  v LONGBLOB NOT NULL,&#xA;  PRIMARY KEY (`id`),&#xA;  UNIQUE KEY u_k (`k`)&#xA;) Engine=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Suppose we want to audit &amp;ldquo;changes&amp;rdquo; to this data model.&lt;/p&gt;&#xA;&lt;h2 id=&#34;approach-1-kv_log&#34;&gt;Approach 1: &lt;code&gt;kv_log&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;add data model like&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;CREATE TABLE `kv_log` (&#xA;  id BIGINT(22) NOT NULL AUTO_INCREMENT,&#xA;  changed_at TIMESTAMP NOT NULL,&#xA;  k VARCHAR(255) NOT NULL,&#xA;  old_v LONGBLOB NOT NULL,&#xA;  new_v LONGBLOB NOT NULL,&#xA;  &#xA;)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;current value query: unchanged&lt;/p&gt;</description>
    </item>
    <item>
      <title>mysql feeds</title>
      <link>https://traviscj.com/blog/post/2018-06-29-mysql_feeds/</link>
      <pubDate>Fri, 29 Jun 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-06-29-mysql_feeds/</guid>
      <description>&lt;p&gt;At work, we use a pattern called &lt;em&gt;feeds&lt;/em&gt; that gets an incredible amount of work done.&#xA;I&amp;rsquo;ve been wanting to describe it here for quite a while, and now seems as good of time as any.&lt;/p&gt;&#xA;&lt;p&gt;The basic premise is: You have a service A with some data that other &amp;ldquo;consuming&amp;rdquo; services B, C, and D want to find out about.&#xA;Maybe the data is payments, maybe it&amp;rsquo;s support cases, maybe it&amp;rsquo;s password changes&amp;hellip; whatever.&#xA;The other services might include your data warehouse, some event listeners, whatever.&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>big-ish personal storage</title>
      <link>https://traviscj.com/blog/post/2018-04-25-big-ish_personal_storage/</link>
      <pubDate>Wed, 25 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-04-25-big-ish_personal_storage/</guid>
      <description>&lt;p&gt;I was curious what it would cost to have something like 5-30TB of storage space on hand.&#xA;The obvious choices are between buying some hard drives and paying for an S3 bucket or something.&lt;/p&gt;&#xA;&lt;p&gt;The amazon costs are pretty straightforward: you pick a region, they tell you the cost.&#xA;Starting with their &lt;a href=&#34;https://aws.amazon.com/s3/pricing/&#34;&gt;pricing table&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;aws = [&#xA;    {&amp;quot;level&amp;quot;: &amp;quot;standard&amp;quot;, &amp;quot;c_millidollars&amp;quot;: 23},&#xA;    {&amp;quot;level&amp;quot;: &amp;quot;infrequent&amp;quot;, &amp;quot;c_millidollars&amp;quot;: 12.5},&#xA;    {&amp;quot;level&amp;quot;: &amp;quot;one_zone&amp;quot;, &amp;quot;c_millidollars&amp;quot;: 10},&#xA;    {&amp;quot;level&amp;quot;: &amp;quot;glacier&amp;quot;, &amp;quot;c_millidollars&amp;quot;: 4}&#xA;]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;we can say&lt;/p&gt;</description>
    </item>
    <item>
      <title>sfpark api</title>
      <link>https://traviscj.com/blog/post/2018-04-24-sfpark-api/</link>
      <pubDate>Tue, 24 Apr 2018 16:29:39 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-04-24-sfpark-api/</guid>
      <description>&lt;p&gt;I recently came to learn of the &lt;a href=&#34;http://sfpark.org/wp-content/uploads/2013/12/SFpark_API_Dec2013.pdf&#34;&gt;SFpark API&lt;/a&gt;, which lets one make queries like:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;LAT=37.787702&#xA;LONG=-122.407796&#xA;curl &amp;quot;http://api.sfpark.org/sfpark/rest/availabilityservice?lat=${LAT}&amp;amp;long=${LONG}&amp;amp;radius=0.25&amp;amp;uom=mile&amp;amp;response=json&amp;quot; | pbcopy&#xA;pbpaste | jq &#39;.AVL[] | select (.TYPE | contains(&amp;quot;OFF&amp;quot;))&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;and get a response including records like:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;{&#xA;  &amp;quot;TYPE&amp;quot;: &amp;quot;OFF&amp;quot;,&#xA;  &amp;quot;OSPID&amp;quot;: &amp;quot;950&amp;quot;,&#xA;  &amp;quot;NAME&amp;quot;: &amp;quot;Union Square Garage&amp;quot;,&#xA;  &amp;quot;DESC&amp;quot;: &amp;quot;333 Post Street&amp;quot;,&#xA;  &amp;quot;INTER&amp;quot;: &amp;quot;Geary between Stockton &amp;amp; Powell&amp;quot;,&#xA;  &amp;quot;TEL&amp;quot;: &amp;quot;(415) 397-0631&amp;quot;,&#xA;  &amp;quot;OPHRS&amp;quot;: {&#xA;    &amp;quot;OPS&amp;quot;: {&#xA;      &amp;quot;FROM&amp;quot;: &amp;quot;7 Days/Wk&amp;quot;,&#xA;      &amp;quot;BEG&amp;quot;: &amp;quot;24 Hrs/Day&amp;quot;&#xA;    }&#xA;  },&#xA;  &amp;quot;OCC&amp;quot;: &amp;quot;381&amp;quot;,&#xA;  &amp;quot;OPER&amp;quot;: &amp;quot;670&amp;quot;,&#xA;  &amp;quot;PTS&amp;quot;: &amp;quot;1&amp;quot;,&#xA;  &amp;quot;LOC&amp;quot;: &amp;quot;-122.407447946,37.7876789151&amp;quot;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Pretty cool!&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>osquery</title>
      <link>https://traviscj.com/blog/post/2018-01-12-osquery/</link>
      <pubDate>Fri, 12 Jan 2018 08:43:17 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-12-osquery/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve known about [osquery][] for a while, but recently spent some time digging around in it.&#xA;[osquery]: &lt;a href=&#34;https://osquery.io&#34;&gt;https://osquery.io&lt;/a&gt;&#xA;The basic idea is to provide a consistent SQL interface to a bunch of system data, instead of learning idiosyncrasies of individual commands (which themselves vary across operating systems).&#xA;My hacker buddy Sharvil has worked on osquery a fair bit and explained to me a couple years ago that it actually uses [sqlite][]&amp;rsquo;s [virtual table functionality][vtab] to provide the interface &amp;ndash; it&amp;rsquo;s a fascinating and brilliant project!&#xA;[sqlite]: &lt;a href=&#34;https://sqlite.org/&#34;&gt;https://sqlite.org/&lt;/a&gt;&#xA;[vtab]: &lt;a href=&#34;https://sqlite.org/vtab.html&#34;&gt;https://sqlite.org/vtab.html&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>profitably wrong</title>
      <link>https://traviscj.com/blog/post/2018-01-09-profitably_wrong/</link>
      <pubDate>Tue, 09 Jan 2018 08:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-09-profitably_wrong/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve come to realize that my career so far has been built on being &amp;ldquo;profitably wrong.&amp;rdquo;&#xA;I think this is interesting because the usual approaches are being &amp;ldquo;profitably fast&amp;rdquo; (optimizing)&#xA;or &amp;ldquo;profitably better&amp;rdquo; (improving),&#xA;and most people think of any kind of wrongness as being a terrible thing.&#xA;But sometimes the best way to optimize or improve is &lt;em&gt;approximating&lt;/em&gt;!&lt;/p&gt;&#xA;&lt;p&gt;The definitions of &amp;ldquo;profitably&amp;rdquo; has changed as I&amp;rsquo;ve worked on different things, as has the specific type of &amp;ldquo;wrongness&amp;rdquo;.&#xA;A couple specific ways accepting &amp;ldquo;wrongness&amp;rdquo; have been profitable for me include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>todobackend.com</title>
      <link>https://traviscj.com/blog/post/2018-01-05-todobackend.com/</link>
      <pubDate>Fri, 05 Jan 2018 00:01:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-05-todobackend.com/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.todobackend.com/&#34;&gt;TodoBackend.com&lt;/a&gt; defines &lt;a href=&#34;http://www.todobackend.com/contribute.html&#34;&gt;a simple API&lt;/a&gt; and has a frontend that works given any backend URL.&lt;/p&gt;&#xA;&lt;p&gt;Particularly interesting to me:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/jhedev/todobackend-haskell&#34;&gt;haskell&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;super concise!&lt;/li&gt;&#xA;&lt;li&gt;whoa, 6 different backends!&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/jhedev/todobackend-haskell/blob/master/todobackend-spock/src/Main.hs&#34;&gt;spock backend&lt;/a&gt; is crazy concise.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Faerbit/todo-backend-flask/blob/master/todo/views.py&#34;&gt;python + flask&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;seems like it would greatly benefit from a &lt;code&gt;Store&lt;/code&gt; object&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/raboof/todo-backend-akka/blob/master/src/main/scala/net/bzzt/todo/backend/akka/TodoStorage.scala&#34;&gt;scala + akka&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;crazy pattern matching in &lt;a href=&#34;https://github.com/raboof/todo-backend-akka/blob/master/src/main/scala/net/bzzt/todo/backend/akka/TodoRoutes.scala&#34;&gt;routes definition&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/ismagilov/todobackend-mangooio/tree/master/src/main/java&#34;&gt;java + mangooio + jOOQ&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;especially the distinction between &lt;code&gt;Todo&lt;/code&gt; and &lt;code&gt;TodoPatch&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;also really glad I don&amp;rsquo;t have to write &lt;a href=&#34;https://github.com/ismagilov/todobackend-mangooio/blob/master/src/main/resources/routes.yaml&#34;&gt;routes config&lt;/a&gt; separately from the code!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/akiellor/todo-backend-compojure/blob/master/src/todo_backend_compojure/&#34;&gt;clojure + jetty/compojure + postgresql&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/hammerdr/todo-backend-rails&#34;&gt;rails&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/meier-christoph/todo-backend-golang-goa/blob/master/app/controllers.go&#34;&gt;go + goa&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>dancing bull pricing structure</title>
      <link>https://traviscj.com/blog/post/2018-01-04-dancing-bull-pricing-structure/</link>
      <pubDate>Thu, 04 Jan 2018 00:10:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-04-dancing-bull-pricing-structure/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.yelp.com/biz/dancing-bull-san-francisco&#34;&gt;Dancing Bull&lt;/a&gt; is a great Korean BBQ restaurant that opened nearby recently.&#xA;They have this pricing scheme:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;assets/bulgogi.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Note that the &lt;em&gt;unlimited&lt;/em&gt; bulgogi is \$23/person, but the bulgogi &lt;em&gt;a la carte&lt;/em&gt; is \$25/grill (with each additional orders after that costing \$9).&#xA;This raises an obvious question: which is the better deal?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt;: it depends on both how many people you have &lt;em&gt;and&lt;/em&gt; how hungry they are.&lt;/p&gt;&#xA;&lt;p&gt;First, we had to clarify how it actually worked.&#xA;It&amp;rsquo;s not clear from the menu, but the &amp;ldquo;\$25/grill&amp;rdquo; includes the first order of bulgogi.&#xA;Introducing $P$ for the number of people, $G$ for the number of grills, and $O$ for the total number of orders, we would pay $$UL = 23\cdot P$$ for the unlimited price scheme vs $$ALC = 25\cdot G + 9\cdot ( O - G)$$ for the a la carte scheme.&lt;/p&gt;</description>
    </item>
    <item>
      <title>everything has a failure rate</title>
      <link>https://traviscj.com/blog/post/2018-01-03-everything-has-a-failure-rate2/</link>
      <pubDate>Wed, 03 Jan 2018 07:09:49 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-03-everything-has-a-failure-rate2/</guid>
      <description>&lt;p&gt;I was happily riding in to work this morning on my motorcycle.&#xA;Periodically while riding, a spark of terror that I&amp;rsquo;ve forgotten to buckle my backpack to the bike&amp;rsquo;s frame hits me.&#xA;So frequently, in fact, that I&amp;rsquo;ve grown used to reaching behind me to feel for the backpack in a spare second when I don&amp;rsquo;t need to clutch.&lt;/p&gt;&#xA;&lt;p&gt;Today was different:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;I reached for the backpack but felt nothing.&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>extracting the last few dollars from Visa/MC gift cards</title>
      <link>https://traviscj.com/blog/post/2018-01-02-protip_how_to_extract_the_last_few_dollars_from_visa_mc_gift_cards/</link>
      <pubDate>Tue, 02 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-02-protip_how_to_extract_the_last_few_dollars_from_visa_mc_gift_cards/</guid>
      <description>&lt;p&gt;Once in a while, I get a prepaid gift card like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://usa.visa.com/pay-with-visa/cards/prepaid-cards/_jcr_content/par/cardstack_1559787488/cardStackColumn1/image.img.jpg/1500674305893.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;They&amp;rsquo;re &amp;ndash; like money &amp;ndash; great!&#xA;But they do have one downside: it&amp;rsquo;s hard to spend the change once you&amp;rsquo;ve bought off most of the value.&lt;/p&gt;&#xA;&lt;p&gt;Originally this was going to be a quick &amp;ldquo;just redeem it with Amazon&amp;rsquo;s gift card&amp;rdquo; post, but &lt;a href=&#34;http://www.wisebread.com/how-to-use-up-remaining-balances-on-prepaid-gift-cards&#34;&gt;a bit of study&lt;/a&gt; revealed that it isn&amp;rsquo;t quiet that simple:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;the authorized amount can prevent the full transaction from going through, so if it&amp;rsquo;s the first transaction at Amazon, you might need to leave $1.00 to cover the reserve.&lt;/li&gt;&#xA;&lt;li&gt;the article mentions a $5 minimum, but the initial amount &amp;amp; card selection on Amazon doesn&amp;rsquo;t seem to have a problem with lower amounts, so YMMV I guess.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The article also mentions a different solution that I should have thought of: apparently some banks will redeem the value of the card into your account.&#xA;You just need to show up at a branch of your bank with proper identification.&lt;/p&gt;</description>
    </item>
    <item>
      <title>things you don&#39;t learn in grad school</title>
      <link>https://traviscj.com/blog/post/2018-01-01-things_you_dont_learn_in_grad_school/</link>
      <pubDate>Mon, 01 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2018-01-01-things_you_dont_learn_in_grad_school/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;oncall exists.&lt;/li&gt;&#xA;&lt;li&gt;the data is never available how you need it.&lt;/li&gt;&#xA;&lt;li&gt;unit tests matter.&lt;/li&gt;&#xA;&lt;li&gt;pushing code after 3pm is risky if you&amp;rsquo;re not willing to work all night. (courtesy &lt;a href=&#34;https://pauljoos.com&#34;&gt;Paul Joos&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>url encoding safe relational operators</title>
      <link>https://traviscj.com/blog/post/2017-11-29-url-encoding-safe-relational-operators/</link>
      <pubDate>Wed, 29 Nov 2017 07:55:04 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-11-29-url-encoding-safe-relational-operators/</guid>
      <description>&lt;p&gt;I was catching up on &lt;a href=&#34;https://publicobject.com/&#34;&gt;Jesse Wilson&amp;rsquo;s blog&lt;/a&gt; this morning, and in particular his post &lt;a href=&#34;https://publicobject.com/2017/08/01/url-encoding-is-material/&#34;&gt;URL Encoding Is Material&lt;/a&gt;.&#xA;In that article, he says&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;My advice&lt;/p&gt;&#xA;&lt;p&gt;If you’re defining your own URLs, you’ll save a lot of trouble by avoiding characters like &amp;lt;, &amp;gt;, {, }, +, ^, &amp;amp;, |, and ;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I came across this problem in one of my projects at work:&#xA;I wanted a page to display some recent records with 1) a &lt;code&gt;name&lt;/code&gt; field provided by the user and 2) a &lt;code&gt;value&lt;/code&gt; field that match $l \leq \text{value} \leq b$, where $l$ and $b$ are given by the user.&#xA;I also wanted that page to have a URL representing that condition, so that it could be easily shared with teammates and soforth.&#xA;When I started working on it, I didn&amp;rsquo;t have Jesse&amp;rsquo;s wisdom, and so I naively came up with a URL structure something like&lt;/p&gt;</description>
    </item>
    <item>
      <title>snack buying</title>
      <link>https://traviscj.com/blog/post/2017-11-13-snack-buying/</link>
      <pubDate>Mon, 13 Nov 2017 07:01:25 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-11-13-snack-buying/</guid>
      <description>&lt;p&gt;I got this text message from my father-in-law:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Ok. Soda 1.50&#xA;Chocolate bar 1.00&#xA;Gum 0.10&#xA;Jelly Bean .05&lt;/p&gt;&#xA;&lt;p&gt;Have to buy exactly 14 items and spend $10&lt;/p&gt;&#xA;&lt;p&gt;At least one of each.&lt;/p&gt;&#xA;&lt;p&gt;There are 4 diff combos. (Order: soda, chocolate, gum and jelly bean)&lt;/p&gt;&#xA;&lt;p&gt;Got 5-2-3-4&#xA;3-5-4-2&lt;/p&gt;&#xA;&lt;p&gt;Can’t get others. Any ideas?  :)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I whipped up this solution to check in python:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#!/usr/bin/python3&#xA;# created_at: 2017-11-13 13:53:19 -0800&#xA;&#xA;def main():&#xA;    solutions = 0&#xA;    for si in range(1,7):&#xA;        for ci in range(1,11):&#xA;            for gi in range(1,101):&#xA;                for ji in range(1,201):&#xA;                    total = si*150 + ci*100 + gi*10 + ji*5&#xA;                    items = si + ci + gi + ji&#xA;                    if total == 1000 and items == 14:&#xA;                        print(si,ci,gi,ji, total, items)&#xA;                        solutions += 1&#xA;    print(solutions)&#xA;&#xA;if __name__ == &amp;quot;__main__&amp;quot;:&#xA;    main()&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The core of this solution is the check&lt;/p&gt;</description>
    </item>
    <item>
      <title>even the ceo doesn&#39;t get an office</title>
      <link>https://traviscj.com/blog/post/2017-11-07-even-the-ceo-doesnt-have-an-office/</link>
      <pubDate>Tue, 07 Nov 2017 07:01:25 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-11-07-even-the-ceo-doesnt-have-an-office/</guid>
      <description>&lt;p&gt;Square is a fantastic place to work, and has been for my entire time here.&#xA;One thing I&amp;rsquo;m not such a fan of, though, is the open office layout we have &amp;ndash; and share with many other startups.&lt;/p&gt;&#xA;&lt;p&gt;Somehow I have the distinct memory of thinking, &amp;ldquo;Wow, even the CEO doesn&amp;rsquo;t get an office here! That&amp;rsquo;s really cool!&amp;rdquo;&#xA;I had an important realization today, though.&#xA;It&amp;rsquo;s not that the CEO of companies with open offices don&amp;rsquo;t &lt;em&gt;get&lt;/em&gt; an office &amp;ndash; it&amp;rsquo;s that they don&amp;rsquo;t &lt;strong&gt;want&lt;/strong&gt; one.&lt;/p&gt;</description>
    </item>
    <item>
      <title>500 Million Dollars!</title>
      <link>https://traviscj.com/blog/post/2017-10-27-500m_dollars/</link>
      <pubDate>Fri, 27 Oct 2017 12:19:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-10-27-500m_dollars/</guid>
      <description>&lt;p&gt;I watched Destin&amp;rsquo;s &lt;a href=&#34;https://www.youtube.com/watch?v=G6N5DZLDja8&#34;&gt;$500 Million Dollars&lt;/a&gt; video:&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;and had a few thoughts:&lt;/p&gt;&#xA;&lt;h3 id=&#34;my-highschool-cs-education&#34;&gt;my highschool CS education&lt;/h3&gt;&#xA;&lt;p&gt;My highschool had &lt;em&gt;computer&lt;/em&gt; teachers, but no &lt;em&gt;computer science&lt;/em&gt; teachers.&#xA;Luckily, we did have a teacher (Dick Van Kirk!) that was willing to sponsor an independent study of some computer science topics.&#xA;I read the AP Computer Science A study guides and a bunch of the &lt;a href=&#34;https://www.amazon.com/Java-How-Program-9th-Deitel/dp/0132575663&#34;&gt;Java: How to Program (Deitel &amp;amp; Deitel)&lt;/a&gt; book&#xA;and managed to get through the AP test with a top score.&#xA;This enabled me to skip over the intro &lt;a href=&#34;https://courses.cs.washington.edu/courses/cse142/&#34;&gt;CSE142&lt;/a&gt; at &lt;a href=&#34;https://www.washington.edu/&#34;&gt;University of Washington&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>confident women are getting bypassed by overconfident men</title>
      <link>https://traviscj.com/blog/post/2017-09-12-competent-women-are-getting-bypassed-by-overconfident-men/</link>
      <pubDate>Tue, 12 Sep 2017 04:44:13 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-09-12-competent-women-are-getting-bypassed-by-overconfident-men/</guid>
      <description>&lt;p&gt;Really interesting youtube talk: &lt;a href=&#34;https://www.youtube.com/watch?v=zGhu4iaBqtk&#34;&gt;confident women are getting bypassed by overconfident men&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;</description>
    </item>
    <item>
      <title>python attrs</title>
      <link>https://traviscj.com/blog/post/2017-08-31-python-attrs/</link>
      <pubDate>Thu, 31 Aug 2017 08:42:43 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-08-31-python-attrs/</guid>
      <description>&lt;p&gt;I came across a very interesting library in a &lt;a href=&#34;https://news.ycombinator.com/item?id=15131981&#34;&gt;HN thread&lt;/a&gt;: the python &lt;a href=&#34;http://www.attrs.org/en/stable/examples.html&#34;&gt;attrs&lt;/a&gt; library.&lt;/p&gt;&#xA;&lt;p&gt;In particular, this seems like a great way to do the &amp;ldquo;dumb data objects&amp;rdquo; they talk about in &lt;a href=&#34;https://www.youtube.com/watch?v=3MNVP9-hglc&#34;&gt;the end of object inheritance&lt;/a&gt;, and also related to (but maybe lighter weight than) &lt;a href=&#34;https://zopeinterface.readthedocs.io/en/latest/README.html&#34;&gt;zope.interface&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This also seems very similar to what I use &lt;a href=&#34;https://github.com/google/auto&#34;&gt;autovalue&lt;/a&gt; for at work.&lt;/p&gt;&#xA;&lt;p&gt;One particularly interesting application is a &amp;ldquo;code database&amp;rdquo; &amp;ndash; using static, checked-in-to-version-control definitions of some data model as a sort of very-fast-to-read, very-slow-to-update &amp;ldquo;Data Model&amp;rdquo;.&#xA;I find this fascinating:&#xA;Code shares a lot of properties with great data stores: ability to rollback (&lt;code&gt;git revert&lt;/code&gt;) and accountability/auditability (&lt;code&gt;git blame&lt;/code&gt;).&#xA;It also makes a lot of fairly hard problems much simpler: you don&amp;rsquo;t need to poll the database for changes.&#xA;You don&amp;rsquo;t need to invalidate any caches.&#xA;You don&amp;rsquo;t need to consider a &amp;ldquo;split brain&amp;rdquo; environment where half of the in-memory caches have updated but the other half haven&amp;rsquo;t.&#xA;You don&amp;rsquo;t need to consider failure cases of how long the in-memory cache is allowed to be invalid: you just fail to boot up on deploy.&#xA;(Admittedly, there&amp;rsquo;s still an opportunity window for split brain behavior for the duration of the deploy, but this is a lot easier to reason about than an essentially arbitrary.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>klr650 planned upgrades</title>
      <link>https://traviscj.com/blog/post/2017-07-17-klr650-planned-upgrades/</link>
      <pubDate>Mon, 17 Jul 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-07-17-klr650-planned-upgrades/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m planning on &amp;ldquo;civilizing&amp;rdquo; my KLR650 just a tiny bit, since it is coming up on 1500 miles and I haven&amp;rsquo;t made it offroad at all yet.&lt;/p&gt;&#xA;&lt;p&gt;There are two (fairly minor) issues with the stock setup, as far as I&amp;rsquo;m currently concerned:&lt;/p&gt;&#xA;&lt;p&gt;First, I&amp;rsquo;d prefer the gearing to be just a little bit taller so I don&amp;rsquo;t have to wind it up quite as much.&#xA;The engine just runs a little faster than I&amp;rsquo;d like at freeway speeds, and even driving around town it just feels slightly off.&#xA;So I&amp;rsquo;m thinking about swapping out the stock 15T countershaft sprocket for a 16T.&#xA;That changes the final drive from 2.87 to 2.69, and saves about 400 RPM at freeway speed, which doesn&amp;rsquo;t sound like much, but should quiet it up nicely.&#xA;I found a website called &lt;a href=&#34;http://www.gearingcommander.com/&#34;&gt;gearingcommander&lt;/a&gt; that allows all of these calculations pretty nicely.&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>toy/life data models</title>
      <link>https://traviscj.com/blog/post/2017-04-19-toy_life_data_models/</link>
      <pubDate>Wed, 19 Apr 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-04-19-toy_life_data_models/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been experimenting a lot with some kinda &amp;ldquo;toy&amp;rdquo; data models based on random things that I wish there was a database to query, but isn&amp;rsquo;t.&#xA;For example:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What was my average arrival time this week?&lt;/li&gt;&#xA;&lt;li&gt;How much of my equity has vested before a certain date?&lt;/li&gt;&#xA;&lt;li&gt;When was the last time we had spaghetti for dinner?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been doing this with flat JSON files.&#xA;This is a bit of an odd choice for me; I actually love schematizing data models in protobuf and MySQL and designing proper indices for the data models I work on during work hours.&lt;/p&gt;</description>
    </item>
    <item>
      <title>_useful</title>
      <link>https://traviscj.com/blog/post/2017-04-03-_useful/</link>
      <pubDate>Mon, 03 Apr 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-04-03-_useful/</guid>
      <description>&lt;p&gt;I often create a directory/file called &lt;code&gt;_useful&lt;/code&gt;/&lt;code&gt;_useful.org&lt;/code&gt;/&lt;code&gt;_useful.txt&lt;/code&gt;.&#xA;I have one in my Dropbox, for example, that contains:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;My apartment lease&lt;/li&gt;&#xA;&lt;li&gt;My car/motorcycle insurance details&lt;/li&gt;&#xA;&lt;li&gt;A textfile with my vehicle plate numbers/VINs/insurance policy numbers.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;At work, I have one with&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;the top visited links for logs/metrics/admin interfaces for the services I work with most&lt;/li&gt;&#xA;&lt;li&gt;a list of links of &amp;ldquo;typical&amp;rdquo; or &amp;ldquo;exemplar&amp;rdquo; things&#xA;&lt;ul&gt;&#xA;&lt;li&gt;links to our internal tool views for typical payments, merchants, etc&lt;/li&gt;&#xA;&lt;li&gt;typical size (in bytes) of various protobuf messages we use a lot, size of 1M messages, #messages in 1MB/GB&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;common coding idioms, like several variants of &lt;code&gt;@RunWith&lt;/code&gt; that we use in various cases in our test code.&lt;/li&gt;&#xA;&lt;li&gt;useful commands for doing stuff (curl/SQL/plain old shell)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Plain text is great for all the reasons it usually is.&#xA;But it&amp;rsquo;s especially useful here (see what I did there?) because the file loads much faster than Google Docs or wiki pages, it&amp;rsquo;s grep-able, it&amp;rsquo;s trivial to copy to a new machine, there&amp;rsquo;s no fuss about futzing with the document to get it to format properly, and soforth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>.sqliterc</title>
      <link>https://traviscj.com/blog/post/2017-03-31-sqliterc/</link>
      <pubDate>Fri, 31 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-03-31-sqliterc/</guid>
      <description>&lt;p&gt;I came across &lt;a href=&#34;https://blog.chmouel.com/2009/07/16/better-output-from-sqlite3-command-line/&#34;&gt;Better output from sqlite3 command line&lt;/a&gt;.&#xA;His &lt;code&gt;.sqliterc&lt;/code&gt; file did not work for me, but the simpler&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;.mode &amp;quot;column&amp;quot;&#xA;.headers on&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;did work nicely.&lt;/p&gt;&#xA;&lt;p&gt;I also found out that &lt;code&gt;brew install sqlite3&lt;/code&gt; does not install the &lt;code&gt;sqlite3&lt;/code&gt; binary to &lt;code&gt;$PATH&lt;/code&gt;, which stinks.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;sqlite3&lt;/code&gt; environment is still much less pleasant than the &lt;code&gt;mysql&lt;/code&gt; cli.&#xA;A few things on my wishlist:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;tab completion of tables, fields, keywords, and functions.&lt;/li&gt;&#xA;&lt;li&gt;nicer &lt;code&gt;.schema&lt;/code&gt; output &amp;ndash; I&amp;rsquo;ve just gotten really used to reading them in mysql output&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It sounds like maybe &lt;a href=&#34;https://github.com/rogerbinns/apsw&#34;&gt;apsw&lt;/a&gt; can be something useful?&#xA;Or maybe Navicat? (but that&amp;rsquo;s expensive)&lt;/p&gt;</description>
    </item>
    <item>
      <title>sprat: multiplayer solitaire</title>
      <link>https://traviscj.com/blog/post/2017-03-29-sprat-multiplayer-solitaire/</link>
      <pubDate>Wed, 29 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-03-29-sprat-multiplayer-solitaire/</guid>
      <description>&lt;p&gt;I took a quick pass at describing the rules of a card game I grew up playing, Sprat:&lt;/p&gt;&#xA;&lt;p&gt;Each player(or team) has 1 deck of cards. initial setup is 4 cards face up (the &amp;ldquo;personal piles&amp;rdquo;), 13 cards (top card face up, others face down) in the &amp;ldquo;sprat deck&amp;rdquo;, and the remaining cards in the &amp;ldquo;flip deck&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;The center of the table is the space for the &amp;ldquo;ace piles&amp;rdquo;. A new ace pile can be started by any player with any ace; any player can play the next card of the same suit on any ace pile.&lt;/p&gt;</description>
    </item>
    <item>
      <title>idea: transaction ordering in ledger-cli</title>
      <link>https://traviscj.com/blog/post/2017-03-27-idea_transaction_ordering_in_ledgercli/</link>
      <pubDate>Mon, 27 Mar 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-03-27-idea_transaction_ordering_in_ledgercli/</guid>
      <description>&lt;p&gt;I love &lt;a href=&#34;http://ledger-cli.org/&#34;&gt;ledger-cli&lt;/a&gt; but keeping it in sync with my bank statements drives me crazy.&#xA;The problem is that the transactions can end up with an essentially arbitrary ordering, and the order they clear (and even the &lt;em&gt;date&lt;/em&gt; they clear) is not necessarily under my direct control.&lt;/p&gt;&#xA;&lt;p&gt;One answer to this is: stop caring about the ordering of your transactions!&#xA;That&amp;rsquo;s a decent answer, except that not addressing the ordering issue means that you can only ever have &amp;ldquo;end-of-day&amp;rdquo; consistency.&#xA;This means you need a different report to reconcile the transactions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>basic http requests and server handlers in clojure</title>
      <link>https://traviscj.com/blog/post/2017-02-01-basic_http_requests_and_server_handlers_in_clojure/</link>
      <pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-02-01-basic_http_requests_and_server_handlers_in_clojure/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been playing around a tiny bit with &lt;a href=&#34;https://clojure.org/&#34;&gt;clojure&lt;/a&gt;, and wanted to document the process of doing something pretty basic: make a project that can request my website over HTTPs.&lt;/p&gt;&#xA;&lt;p&gt;The first step is pretty easy:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;brew install leiningen&#xA;lein new random-experimentation&#xA;cd random-experimentation&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;and add &lt;code&gt;[clj-http &amp;quot;3.4.1&amp;quot;]&lt;/code&gt; to &lt;code&gt;project.clj&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The HTTPS part is a bit trickier.&#xA;The JDK doesn&amp;rsquo;t include the &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Letsencrypt&lt;/a&gt; certificates.&#xA;But I found a simple script &lt;a href=&#34;https://gist.github.com/Firefishy/109b0f1a90156f6c933a50fe40aa777e&#34;&gt;install-letsencrypt-in-jdk.sh&lt;/a&gt; that can set it up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>use the `locale.currency` library function</title>
      <link>https://traviscj.com/blog/post/2017-01-20-use_the_locale.currency_library_function/</link>
      <pubDate>Fri, 20 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-01-20-use_the_locale.currency_library_function/</guid>
      <description>&lt;p&gt;I had stupidly written a pair of functions like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;def comma_sep(amount):&#xA;    thousands = int(amount/1000)&#xA;    remainder = int(amount%1000)&#xA;    if thousands &amp;gt; 0:&#xA;        return comma_sep(thousands)+&amp;quot;,&amp;quot;+&amp;quot;%.3d&amp;quot;%(remainder)&#xA;    else:&#xA;        return str(remainder)&#xA;def friendly_from_cents(total_cents):&#xA;    pos = total_cents &amp;gt;= 0&#xA;    total_cents = abs(total_cents)&#xA;    cents = int(total_cents%100)&#xA;    dollars = int(total_cents/100)&#xA;    friendly = &amp;quot;$&amp;quot;+comma_sep(dollars)+&amp;quot;.&amp;quot;+str(cents)&#xA;    if pos:&#xA;        return friendly&#xA;    else:&#xA;        return &amp;quot;-&amp;quot; + friendly&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This is stupid, because python has builtin support to localize currency:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;import locale&#xA;locale.setlocale(locale.LC_ALL, &#39;en_US&#39;)&#xA;locale.currency(-1800, grouping=True)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;I think it&amp;rsquo;s tempting to fall into these traps, because it always starts simpler:&#xA;I had some &lt;code&gt;total_cents&lt;/code&gt; variable and just wanted to display quick and dirty.&#xA;The complexity built up gradually, until I had something pretty complicated.&#xA;Oops.&lt;/p&gt;</description>
    </item>
    <item>
      <title>filter vs spec (draft)</title>
      <link>https://traviscj.com/blog/post/2017-01-18-filter_vs_spec/</link>
      <pubDate>Wed, 18 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2017-01-18-filter_vs_spec/</guid>
      <description>&lt;p&gt;Consider a silly data model to store data about cities like&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;message City {&#xA;  optional string city_name = 1;&#xA;  optional string state = 2;&#xA;  optional int32 population = 3;&#xA;  optional int32 year_founded = 4;&#xA;  // ... presumably others :-)&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;and some sample data like:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;[&#xA;  {&amp;quot;city_name&amp;quot;: &amp;quot;Portland&amp;quot;, &amp;quot;state&amp;quot;: &amp;quot;OR&amp;quot;, &amp;quot;population&amp;quot;: ...},&#xA;  {&amp;quot;city_name&amp;quot;: &amp;quot;Portland&amp;quot;, &amp;quot;state&amp;quot;: &amp;quot;ME&amp;quot;, &amp;quot;population&amp;quot;: ...},&#xA;  {&amp;quot;city_name&amp;quot;: &amp;quot;Springfield&amp;quot;, &amp;quot;state&amp;quot;: &amp;quot;FL&amp;quot;, &amp;quot;population&amp;quot;: ...},&#xA;  {&amp;quot;city_name&amp;quot;: &amp;quot;Springfield&amp;quot;, &amp;quot;state&amp;quot;: &amp;quot;IL&amp;quot;, &amp;quot;population&amp;quot;: ...},&#xA;  {&amp;quot;city_name&amp;quot;: &amp;quot;Springfield&amp;quot;, &amp;quot;state&amp;quot;: &amp;quot;CO&amp;quot;, &amp;quot;population&amp;quot;: ...}&#xA;]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;There are some useful entities we can define: (DRAFT NB: don&amp;rsquo;t read too much into the matcher vs filter lingo.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>korean beef recipe</title>
      <link>https://traviscj.com/blog/post/2016-12-31-korean_beef_recipe/</link>
      <pubDate>Sat, 31 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-12-31-korean_beef_recipe/</guid>
      <description>&lt;p&gt;Ingredients:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1/4 cup brown sugar, packed&lt;/li&gt;&#xA;&lt;li&gt;1/4 cup reduced sodium soy sauce&lt;/li&gt;&#xA;&lt;li&gt;2 tsp sesame oil&lt;/li&gt;&#xA;&lt;li&gt;1/2 tsp crushed red-pepper flakes&lt;/li&gt;&#xA;&lt;li&gt;1/4 tsp ground ginger&lt;/li&gt;&#xA;&lt;li&gt;1 tbsp vegetable oil&lt;/li&gt;&#xA;&lt;li&gt;3 cloves garlic, minced&lt;/li&gt;&#xA;&lt;li&gt;1 pound ground beef&lt;/li&gt;&#xA;&lt;li&gt;2 green onions, thinly sliced.&lt;/li&gt;&#xA;&lt;li&gt;1/4 tsp sesame seeds&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Directions&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Mix brown sugar, soy sauce, sesame oil, red pepper flakes, ginger.&lt;/li&gt;&#xA;&lt;li&gt;Sizzle garlic in the vegetable oil, then add beef and cook until brown.&lt;/li&gt;&#xA;&lt;li&gt;Stir in soy sauce mixture.&lt;/li&gt;&#xA;&lt;li&gt;Serve immediately.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Summarized from &lt;a href=&#34;http://damndelicious.net/2013/07/07/korean-beef-bowl/&#34;&gt;Korean Beef Bowl on Damn Delicious&lt;/a&gt;, itself summarized from &lt;a href=&#34;http://www.sixsistersstuff.com/2013/02/korean-beef-and-rice.html&#34;&gt;Korean Beef and Rice&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>christmas commute</title>
      <link>https://traviscj.com/blog/post/2016-12-29-christmas_commute/</link>
      <pubDate>Thu, 29 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-12-29-christmas_commute/</guid>
      <description>&lt;p&gt;I did a 725-mile drive yesterday from Prosser, WA to San Francisco, CA.&#xA;I captured the daylight hours with a GoPro timelapse and turned it into a video!&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;This was the actual loop we took, including the trip up to Washington.&#xA;We spent two nights in Oregon &amp;ndash; one in Grants Pass and one in Portland.&lt;/p&gt;&#xA;&lt;p&gt;![]({{ site.baseurl }}/assets/christmas_commute_s.png)&lt;/p&gt;&#xA;&lt;p&gt;My GoPro mount held the pictures upside down, so I transformed all of them with a quick&lt;/p&gt;</description>
    </item>
    <item>
      <title>CBCL: The Common Business Communication Language</title>
      <link>https://traviscj.com/blog/post/2016-12-12-cbcl/</link>
      <pubDate>Mon, 12 Dec 2016 23:05:28 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-12-12-cbcl/</guid>
      <description>&lt;p&gt;I recently came across McCarthy&amp;rsquo;s &lt;a href=&#34;http://www-formal.stanford.edu/jmc/cbcl2.pdf&#34;&gt;CBCL&lt;/a&gt; paper on Hacker News.&#xA;He presents a Lisp notation as a format for sharing requests between different software on different computers.&#xA;He calls out&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;(PLEASE-RESERVE (EPSILON (x) &#xA;  (AND&#xA;    (IS-FLIGHT x) &#xA;    (DEPARTS MONDAY) &#xA;    (ARRIVES (BEFORE WEDNESDAY)))))&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;where $\epsilon x$ is an operator maps a predicate to &lt;em&gt;a value&lt;/em&gt; matching the predicate, and considers it an improvement on the &amp;ldquo;iota&amp;rdquo; &lt;a href=&#34;https://en.wikipedia.org/wiki/Definite_description#Mathematical_logic&#34;&gt;definite description&lt;/a&gt; operator, which seems to be an operator that returns &lt;em&gt;the unique value&lt;/em&gt; matching the predicate.&#xA;It seems interesting to me that the unique match operator is not considered as useful as the arbitrary match operator &amp;ndash; unique keys actually seem critical to a lot of my work with data models.&#xA;Even more fascinating, though, is that this &lt;em&gt;looks&lt;/em&gt; like an anonymous function!&lt;/p&gt;</description>
    </item>
    <item>
      <title>oblique programming strategies</title>
      <link>https://traviscj.com/blog/post/2016-12-07-oblique_programming_strategies/</link>
      <pubDate>Wed, 07 Dec 2016 23:05:28 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-12-07-oblique_programming_strategies/</guid>
      <description>&lt;p&gt;Ever since I found out about it (probably on Hacker News), the idea of &lt;a href=&#34;https://en.wikipedia.org/wiki/Oblique_Strategies&#34;&gt;Oblique Strategies&lt;/a&gt; has fascinated me.&#xA;The first editions are going on ebay for $2500-$3300 bucks, which I think is incredible.&#xA;If you&amp;rsquo;re curious &lt;em&gt;and&lt;/em&gt; impatient, you can check out &lt;a href=&#34;https://github.com/ceejbot/oblique-strategies/blob/master/index.js&#34;&gt;this list&lt;/a&gt; on github.&lt;/p&gt;&#xA;&lt;p&gt;One recent sleepness night, I made a list of &amp;ldquo;oblique programming strategies&amp;rdquo; on my phone, transcribed here.&#xA;They are not as starkly polished as Eno&amp;rsquo;s version (unsurprisingly), but might be useful to you!&lt;/p&gt;</description>
    </item>
    <item>
      <title>motorcycle learnings at 250 miles</title>
      <link>https://traviscj.com/blog/post/2016-12-02-motorcycle_learnings_at_250_miles/</link>
      <pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-12-02-motorcycle_learnings_at_250_miles/</guid>
      <description>&lt;p&gt;Two new learnings at the 250mi point:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The backpack straps down to the back!&lt;/p&gt;&#xA;&lt;p&gt;![]({{ site.baseurl }}/assets/backpack_straps_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;The balance of the bike feels so much better with the backpack low and riding without weight on my shoulders is so much more comfortable.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ear Plugs are amazing! I noticed earplugs being worn on &lt;a href=&#34;http://www.longwayround.com/&#34;&gt;The Long Way Round&lt;/a&gt; and decided to try it out. It is really surprising how relevant noises (other cars, etc) make it through fine, but how much nicer it is to not have the wind noise!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Useful homebrew formula</title>
      <link>https://traviscj.com/blog/post/2016-12-01-useful-brew-installs/</link>
      <pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-12-01-useful-brew-installs/</guid>
      <description>&lt;p&gt;Last week I was telling &lt;a href=&#34;https://pauljoos.com/&#34;&gt;Paul&lt;/a&gt; about things I have &lt;code&gt;brew install&lt;/code&gt;ed on my work laptop.&#xA;I pulled a &lt;a href=&#34;https://traviscj.com/ZeroBin/?4aad6b057954d42e#8VJqyn80/+WkRlFiwY3KGfQAYxKB+CKs6FhbdyZOP+s=&#34;&gt;full list&lt;/a&gt; as I was doing some upgrades and stuff this morning.&lt;/p&gt;&#xA;&lt;p&gt;Glancing over it a bit, here are some of my favorites/most usefuls:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;autojump&lt;/code&gt; for a usage-adjusting &lt;code&gt;cd&lt;/code&gt; &amp;ndash; given a partial string it just goes to the most-used directory with that prefix. I have &lt;code&gt;autojump&lt;/code&gt; aliased to &lt;code&gt;j&lt;/code&gt; to shorten it up even more.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;colordiff&lt;/code&gt; to make diffs/grep/etc nicer to look at in the terminal.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;coreutils&lt;/code&gt;/&lt;code&gt;dateutils&lt;/code&gt; is nice because it installs the GNU versions of a lot of standard linux commands like &lt;code&gt;du&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; that work a bit strange/differently on OSX.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;jq&lt;/code&gt; is amazing — lets you query JSON objects.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ledger&lt;/code&gt; to manage bank balances in plain text.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;newsbeuter&lt;/code&gt; to subscribe to RSS feeds.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;osquery&lt;/code&gt; lets you do SQL-like queries to find out about the system it’s running on (sharvil did a bunch of work on it, actually…)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;terminal-notifier&lt;/code&gt; to pop up notifications from terminal/cron jobs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;tmux&lt;/code&gt; to have long-running terminal windows without having terminal windows open.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;watch&lt;/code&gt; instead of &amp;ldquo;some command&amp;rdquo;+uparrow+enter+uparrow+enter+&amp;hellip;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wget&lt;/code&gt; as shorthand for “curl http://xyz/tuv.json &amp;gt; tuv.json” (old habits…),&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;youtube-dl&lt;/code&gt; for downloading youtube videos.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>KLR-650 first month &amp; american gumball</title>
      <link>https://traviscj.com/blog/post/2016-11-30-klr-650_first_month/</link>
      <pubDate>Wed, 30 Nov 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-11-30-klr-650_first_month/</guid>
      <description>&lt;p&gt;Yesterday I finally got the title for my motorcycle and realized that I&amp;rsquo;d owned it for exactly one month!&lt;/p&gt;&#xA;&lt;p&gt;![]({{ site.baseurl }}/assets/klr650_first_ride_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;So far, I haven&amp;rsquo;t done anything very adventureous &amp;ndash; still getting used to riding again.&#xA;I had a couple things that were making me nervous about it:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;The bike gets warm (&amp;gt;1/2 way on the heat gauge, but still significantly below the red) tooling around, usually on my commute home in the evening.&lt;/p&gt;</description>
    </item>
    <item>
      <title>stocks and options from 30k feet</title>
      <link>https://traviscj.com/blog/post/2016-10-14-stocks_and_options_from_30k_feet/</link>
      <pubDate>Fri, 14 Oct 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-10-14-stocks_and_options_from_30k_feet/</guid>
      <description>&lt;p&gt;One of my friends at work asked me if I had any book recommendations for learning about stocks and options.&#xA;Mentally, I break trading down into two general classes of trading: index-type and &amp;ldquo;exotic&amp;rdquo; trading.&#xA;By exotic trading, I mean picking individual stocks/options and actively trading.&#xA;This runs counter to the more conservative buy-and-hold, index-based, hands-off approach.&lt;/p&gt;&#xA;&lt;p&gt;For the exotic trading, I learned most of what I know from a class with &lt;a href=&#34;http://www.mccormick.northwestern.edu/research-faculty/directory/profiles/olmstead-edward.html&#34;&gt;Professor W.E. Olmstead&lt;/a&gt; and his book, &lt;a href=&#34;https://www.amazon.com/Options-Beginner-Beyond-Opportunities-Minimize/dp/0131721283&#34;&gt;Options for the Beginner and Beyond: Unlock the Opportunities and Minimize the Risks&lt;/a&gt;.&#xA;For the option-uninitiated, the basic idea is that instead of buying or selling  stocks directly, you buy and sell &lt;em&gt;contracts&lt;/em&gt; that give you the &lt;em&gt;right&lt;/em&gt; (but not obligation) to buy or sell the stock at a particular price by a particular date.&#xA;That&amp;rsquo;s a mouthful and options are indeed subtle beasts, but they allow the flexibility to either &lt;em&gt;hedge&lt;/em&gt; risks you want less exposure to, or increase/leverage exposure to risks you do want to take.&lt;/p&gt;</description>
    </item>
    <item>
      <title>streaks vs statistical streaks</title>
      <link>https://traviscj.com/blog/post/2016-09-26-streaks_vs_statistical_streaks/</link>
      <pubDate>Mon, 26 Sep 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-09-26-streaks_vs_statistical_streaks/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://hn.algolia.com/?query=streaks&amp;amp;sort=byPopularity&amp;amp;prefix&amp;amp;page=0&amp;amp;dateRange=all&amp;amp;type=story&#34;&gt;Hacker News et al are obsessed with streaks&lt;/a&gt;, but I think they have some problems:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;A single regression resets to zero.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;There&amp;rsquo;s not an easy way to gradually ramp up your streak-commitment over time.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I prefer a different approach: statistical streaks.&lt;/p&gt;&#xA;&lt;p&gt;Suppose I made a commitment to do something differently on 2016-08-26, and did it for the next 5 days; then my 30-day statistical streak avg = 0.166, but my 5-day statistical streak avg = 1.0.&lt;/p&gt;</description>
    </item>
    <item>
      <title>i fucking love mangoes</title>
      <link>https://traviscj.com/blog/post/2016-04-24-i_fucking_love_mangoes/</link>
      <pubDate>Sun, 24 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-04-24-i_fucking_love_mangoes/</guid>
      <description>&lt;p&gt;Specifically, the &lt;a href=&#34;http://www.costcobusinessdelivery.com/Philippine-Brand-Dried-Mangoes,-30-oz.product.11071053.html&#34;&gt;Philippine Brand Dried Mangoes&lt;/a&gt;.&#xA;They are amazingly good.&lt;/p&gt;&#xA;&lt;p&gt;But there is a slight problem.&#xA;Costco sells them in 30 oz bulk packs, which is 20 servings at 160 calories/serving or 3200 calories total.&#xA;Left to my own devices and lack of self discipline, I could probably eat (and subsequently regret eating) the entire bag of mangoes.&lt;/p&gt;&#xA;&lt;p&gt;I need a self-check to disgust myself and impose a bit more of a speedbump than an already-opened bag provides.&#xA;So I fired up the FoodSaver and made individual serving sized-bags:&lt;/p&gt;</description>
    </item>
    <item>
      <title>switching over to https</title>
      <link>https://traviscj.com/blog/post/2016-04-15-switching_over_to_https/</link>
      <pubDate>Fri, 15 Apr 2016 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-04-15-switching_over_to_https/</guid>
      <description>&lt;p&gt;One of the things I&amp;rsquo;ve been meaning to do forever is switch things over to https.&#xA;By &amp;ldquo;things&amp;rdquo;, I mean the set of websites I run for some family and friends.&#xA;I tried it out with my personal website first, then flipped over the rest.&lt;/p&gt;&#xA;&lt;h2 id=&#34;implementation-notes&#34;&gt;implementation notes&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;I used the &lt;a href=&#34;https://letsencrypt.org/getting-started/&#34;&gt;letsencrypt start guide&lt;/a&gt; to generate the certificates.&lt;/li&gt;&#xA;&lt;li&gt;Modified the nginx config to:&#xA;a. serve ssl/https traffic on port 443 for the given domain with the proper https certificates/etc.&#xA;b. forward non-ssl/http traffic on port 80 to port 443 for the given domain&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;verification&#34;&gt;verification&lt;/h2&gt;&#xA;&lt;p&gt;It turns out that the nginx configuration files are a little bit error prone.&#xA;This probably means that I am doing something wrong, like not using some configuration management tool like puppet or ansible or whatever.&#xA;But for something as small scale as my site, it doesn&amp;rsquo;t really meet the cost-benefit threshold for learning a new tool/language.&#xA;I also even considered spinning up a simple one-off configuration generator that I&amp;rsquo;d need to figure out how to override and extend as needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>inspired by magicmirror</title>
      <link>https://traviscj.com/blog/post/2016-01-02-inspired_by_magicmirror/</link>
      <pubDate>Sat, 02 Jan 2016 18:45:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2016-01-02-inspired_by_magicmirror/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been really inspired by the &lt;a href=&#34;https://github.com/MichMich/MagicMirror&#34;&gt;MagicMirror&lt;/a&gt; project.&#xA;The basic idea is getting a piece of mirror glass and putting a monitor and computer behind it, then having a status page show some pertinent information about the day (like weather, calendar, news, etc).&#xA;So it looks like a regular mirror, but when you look closely, it shows the extra information.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d like to put one in the bedroom to replace our tall mirror.&#xA;That&amp;rsquo;ll be pretty cool, but it requires a bit of extra thought because&#xA;our magicmirror setup would replace a tall and skinny mirror, so we&amp;rsquo;ll probably just want a monitor behind the &lt;em&gt;top&lt;/em&gt; part of the mirror.&#xA;That will require some extra bracing to hold the monitor up in the frame.&#xA;I&amp;rsquo;ll need to think about that a while.&lt;/p&gt;</description>
    </item>
    <item>
      <title>individual sealed ibuprofen &amp; zyrtec</title>
      <link>https://traviscj.com/blog/post/2015-12-30-individual_sealed_ibuprofen_and_zyrtec/</link>
      <pubDate>Wed, 30 Dec 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-12-30-individual_sealed_ibuprofen_and_zyrtec/</guid>
      <description>&lt;p&gt;Today I made some individually sealed ibuprofen (Advil) and cetirizine (Zyrtec) packets:&lt;/p&gt;&#xA;&lt;p&gt;![ibuprofen]({{ site.baseurl }}/assets/ibuprofen_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;I did it by cutting about a two inch strip of vacuum sealing bag, then doing several perpendicular seals far enough apart that I could pop a couple of pills in it.&lt;/p&gt;&#xA;&lt;p&gt;![ibuprofen strip]({{ site.baseurl }}/assets/ibuprofen_strip_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;Why bother?&#xA;Mostly, I want to keep a few doses in my backpack / car, but don&amp;rsquo;t want them turning into dust. (The softer coat on&#xA;Kirkland seems especially problematic.)&#xA;The next best idea is of course just buying the &lt;a href=&#34;http://www.amazon.com/Advil-Tablets-Reliever-Refill-Two-Packs/dp/B0006SW71G&#34;&gt;commercial version&lt;/a&gt;, but I don&amp;rsquo;t really need 50 packets at a time.&#xA;I&amp;rsquo;d prefer to keep more stock in the &amp;ldquo;more liquid&amp;rdquo; bottle form.&#xA;Finally, waterproof can&amp;rsquo;t hurt!&lt;/p&gt;</description>
    </item>
    <item>
      <title>first canning adventure: brandied pears</title>
      <link>https://traviscj.com/blog/post/2015-12-29-first_canning_adventure_brandied_pears/</link>
      <pubDate>Tue, 29 Dec 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-12-29-first_canning_adventure_brandied_pears/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been wanting to get into canning for a while.&#xA;It was finally time to take the plunge.&#xA;I made brandied pears.&#xA;One of the really striking things is how simple the ingredients list is:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;pears&lt;/li&gt;&#xA;&lt;li&gt;lemon juice&lt;/li&gt;&#xA;&lt;li&gt;sugar&lt;/li&gt;&#xA;&lt;li&gt;water&lt;/li&gt;&#xA;&lt;li&gt;brandy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the setup just before I started:&lt;/p&gt;&#xA;&lt;p&gt;![canning prep]({{ site.baseurl }}/assets/canning_prep_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;Allison got me a pressure canner/cooker for Christmas:&lt;/p&gt;&#xA;&lt;p&gt;![pressure canner]({{ site.baseurl }}/assets/pressure_canner_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s huge! After I cooked the pears I packed them&lt;/p&gt;</description>
    </item>
    <item>
      <title>pragmatic edc</title>
      <link>https://traviscj.com/blog/post/2015-12-27-pragmatic_edc/</link>
      <pubDate>Sun, 27 Dec 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-12-27-pragmatic_edc/</guid>
      <description>&lt;p&gt;Lots of folks wax poetic about their every day carry kit, and then include things like fishing hooks.&#xA;That might make a &amp;ldquo;pragmatic hiking edc&amp;rdquo; kit, but I&amp;rsquo;m interested in some of the more realistic things that might happen:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Phone is dead and need to call someone (wife, parent, car insurance company, whatever) but don&amp;rsquo;t have the relevant phone number / insurance number / etc.&lt;/li&gt;&#xA;&lt;li&gt;Minor illness like headache, indigestion, things like that.&lt;/li&gt;&#xA;&lt;li&gt;Forgot my wallet at home and need lunch or cab fare.&lt;/li&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/Purell-9022-10-Sanitizing-Individually-Wrapped/dp/B000FZ23FA&#34;&gt;purell sanitizing hand wipes&lt;/a&gt;&#xA;&lt;a href=&#34;http://www.amazon.com/Pac-Kit-18-012-Hydrocortisone-Anti-Itch-Packet/dp/B00CEK3D8U&#34;&gt;pac-kit hydrocortisone&lt;/a&gt;&#xA;&lt;a href=&#34;http://www.amazon.com/gp/product/B00E8JRBX8&#34;&gt;pac-kit medication triage pack&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>recent projects - sous vide, hydroponic pump, and another table</title>
      <link>https://traviscj.com/blog/post/2015-11-17-recent_projects_sous_vide_hydroponic_pump_and_another_table/</link>
      <pubDate>Tue, 17 Nov 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-11-17-recent_projects_sous_vide_hydroponic_pump_and_another_table/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on a few fun projects recently.&lt;/p&gt;&#xA;&lt;p&gt;First: I built a &lt;a href=&#34;http://www.instructables.com/id/Sous-vide-cooker-for-less-than-40/&#34;&gt;temperature controller&lt;/a&gt; out of a crock pot and a cheap import temperature controller. It looks like this:&lt;/p&gt;&#xA;&lt;p&gt;![temperature controller top]({{ site.baseurl }}/assets/temperature_controller_top_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;![temperature controller bottom]({{ site.baseurl }}/assets/temperature_controller_bottom_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve used it to cook eggs and steak. Both turned out great! Here&amp;rsquo;s the only shots I got of the steak:&lt;/p&gt;&#xA;&lt;p&gt;![steak vacuum sealed]({{ site.baseurl }}/assets/steak_vacuum_sealed_s.jpg)&#xA;![steak cooking]({{ site.baseurl }}/assets/steak_cooking_s.jpg)&lt;/p&gt;&#xA;&lt;p&gt;Next, I&amp;rsquo;ve put together another refinement of the hydroponic tomato setup we have in our living room. Also, just realized I haven&amp;rsquo;t added the backposts about it yet. Allison and I started three tomato plants back in May:&lt;/p&gt;</description>
    </item>
    <item>
      <title>life pro tip curb rampant consumerism by identifying actual needs</title>
      <link>https://traviscj.com/blog/post/2015-08-23-life_pro_tip_curb_rampant_consumerism_by_identifying_actual_needs/</link>
      <pubDate>Sun, 23 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-08-23-life_pro_tip_curb_rampant_consumerism_by_identifying_actual_needs/</guid>
      <description>&lt;p&gt;A while back, I realized that I wanted a nice digital SLR camera.&#xA;Before I bought it, I made a list of all the things that I wanted to do with it.&#xA;Ultimately, this ended up being a sort of self-justification for buying it, but it did serve one deeper purpose:&#xA;I now had a list of about 20 things that I had committed to doing with my new camera.&#xA;So while it didn&amp;rsquo;t actually prevent me from being rampantly consumerist, I did have a whole set of worthwhile things to do with my new camera!&lt;/p&gt;</description>
    </item>
    <item>
      <title>build_json.sh</title>
      <link>https://traviscj.com/blog/post/2015-08-19-build_json.sh/</link>
      <pubDate>Wed, 19 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-08-19-build_json.sh/</guid>
      <description>&lt;p&gt;This might seem silly, but I&amp;rsquo;ve beeing playing with some&#xA;&lt;a href=&#34;http://traviscj.com/ZeroBin/?1d4c5e66662c6306#V91+G7w0NYxN4ui/sDPBivPA8Fo5PzB7mZHAPboau7U=&#34;&gt;json.sh&lt;/a&gt; scripts&#xA;that build legitimate json bodies and are easily filled into a shell script variable as needed.&lt;/p&gt;&#xA;&lt;p&gt;The basic driving idea was that there are lots of slick ways to pull data &lt;em&gt;out&lt;/em&gt; of JSON(either by programming something with python&amp;rsquo;s json or running a command line tool like jq or whatever), but not as many friendly ways to build some JSON out of a given token or whatever.&#xA;Often, you have a list of identifiers and you need to build a bunch of JSON blobs from that list.&lt;/p&gt;</description>
    </item>
    <item>
      <title>carputer brainstorming ideas</title>
      <link>https://traviscj.com/blog/post/2015-06-07-carputer_brainstorming_ideas/</link>
      <pubDate>Sun, 07 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-06-07-carputer_brainstorming_ideas/</guid>
      <description>&lt;p&gt;As much as I enjoy driving, radio almost always annoys me.&#xA;There&amp;rsquo;s a couple of particularly terrible stations and commercials around, but even the least objectionable of the&#xA;pack really bother me.&#xA;The focus did come with an auxiliary stereo input plug, which we have used extensively, but even that seems to have some shortcomings.&#xA;In particular, one of the things I really miss about the radio approach is just that I don&amp;rsquo;t really need to think that much about it &amp;ndash; it is just there while I&amp;rsquo;m driving around.&#xA;Starting up spotify after I&amp;rsquo;ve started off isn&amp;rsquo;t safe or prudent.&lt;/p&gt;</description>
    </item>
    <item>
      <title>car is paid off!</title>
      <link>https://traviscj.com/blog/post/2015-05-16-car_is_paid_off/</link>
      <pubDate>Sat, 16 May 2015 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2015-05-16-car_is_paid_off/</guid>
      <description>&lt;p&gt;I finally sent the last check for my 2013 Ford Focus a couple of weeks ago, and finally got the title in the mail&#xA;today.&#xA;It also came with a &amp;ldquo;congratulations for paying off your car!&amp;rdquo; letter, which was a nice touch.&lt;/p&gt;&#xA;&lt;p&gt;I opted to pay it off early, despite the (moderate) financial disadvantage it put me at.&#xA;The loan was only 2.4%, so the cost of carrying the loan actually wasn&amp;rsquo;t super significant.&#xA;I had started paying the loan ahead of schedule during graduate school because I was worried about whether I would&#xA;have the cashflow available to keep making payments during the time between graduate school and real paid work.&#xA;Then when I did get a job, I just kept making the higher-than-required payments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>slide rules</title>
      <link>https://traviscj.com/blog/post/2014-11-19-slide_rules/</link>
      <pubDate>Wed, 19 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-11-19-slide_rules/</guid>
      <description>&lt;p&gt;Suppose you want to evaluate the multiplication problem $C = A\cdot B$.&#xA;But you forgot your times tables, so you are stuck using your &lt;a href=&#34;http://www.amazon.com/Timex-T49825DH-Expedition-Stainless-Steel/dp/B003Y3B1NA&#34;&gt;expedition watch&lt;/a&gt; or something.&#xA;In fact, you can even make your own out of a couple of slips of paper, if you really need to.&lt;/p&gt;&#xA;&lt;p&gt;First bit of background:&#xA;One of the rules you probably learned and I definitely forgot was the rule of logs:&#xA;$$ C = A\cdot B \equiv \log C = \log(A\cdot B) = \log A + \log B$$&#xA;This ends up being useful for slide rules, because you can easily add distances together&#xA;by putting two things next to eachother!&#xA;So that is exactly what we do.&#xA;We add the logarithms by putting things next to eachother.&lt;/p&gt;</description>
    </item>
    <item>
      <title>debugging internet</title>
      <link>https://traviscj.com/blog/post/2014-10-28-debugging_internet/</link>
      <pubDate>Tue, 28 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-10-28-debugging_internet/</guid>
      <description>&lt;p&gt;My standard plan for debugging internet connections:&lt;/p&gt;&#xA;&lt;ol start=&#34;0&#34;&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Can we reach stuff from some other device?&lt;/p&gt;&#xA;&lt;p&gt;Usually, connection problems are something like &amp;ldquo;My iPad isn&amp;rsquo;t working,&amp;rdquo; which is caused  by a flash of light in the sky, like when Swamp gas from a weather balloon gets trapped in a thermal pocket and reflects the light from Venus.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;So try something other than your iPad on your WiFi to isolate whether it is a WiFi network problem or a &amp;ldquo;iPad&amp;quot;problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>don&#39;t poll</title>
      <link>https://traviscj.com/blog/post/2014-10-15-dont_poll/</link>
      <pubDate>Wed, 15 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-10-15-dont_poll/</guid>
      <description>&lt;p&gt;A while ago, I wrote down a list of clever life rules in my day-to-day notebook.&#xA;One of them was &amp;ldquo;don&amp;rsquo;t poll&amp;rdquo;.&#xA;To say a bit more about it, don&amp;rsquo;t spent time waiting for things to finish and checking them constantly.&lt;/p&gt;&#xA;&lt;p&gt;A more concrete example:&#xA;I find myself running terminal commands that take ~5 minutes, and then wasting ~5 minutes watching them.&#xA;This is pretty stupid.&#xA;So what I have started doing instead is run something like&#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-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ some_long_command&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; ... scroll scroll scroll ... &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:#f92672&#34;&gt;[&lt;/span&gt; ... waiting &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; it to finish ... &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:#f92672&#34;&gt;[&lt;/span&gt; ... give up ... &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;terminal-notifier -message &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;some_long_command done&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:#f92672&#34;&gt;[&lt;/span&gt; ... go &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; something &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; ... &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;Then, later I see a notification:&#xA;&lt;img src=&#34;notification_finally_done.png&#34; alt=&#34;notification for finally done&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>logging</title>
      <link>https://traviscj.com/blog/post/2014-09-26-logging/</link>
      <pubDate>Fri, 26 Sep 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-09-26-logging/</guid>
      <description>&lt;p&gt;In grad school, I spent a lot of time writing code that read output from nonlinear optimization solvers, and tried&#xA;to do useful things with it.&#xA;A much better way to do that is called &amp;ldquo;structured logging&amp;rdquo;, an idea I experimented with a bit during grad school.&#xA;It has also been coming up in my working life, so I wanted to delve into it a bit deeper.&#xA;For a quick introduction, check out &lt;a href=&#34;http://gregoryszorc.com/blog/category/logging/&#34;&gt;Thoughts on Logging&lt;/a&gt;.&#xA;For a lot longer introduction, see &lt;a href=&#34;http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying&#34;&gt;The Log: What every software engineer should know about real-time data unifying&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Switching to jekyll</title>
      <link>https://traviscj.com/blog/post/2014-09-01-switching_to_jekyll/</link>
      <pubDate>Mon, 01 Sep 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-09-01-switching_to_jekyll/</guid>
      <description>&lt;p&gt;I spent a few hours this evening switching everything over from &lt;a href=&#34;https://github.com/traviscj/tcjblog&#34;&gt;tcjblog&lt;/a&gt; to &lt;a href=&#34;http://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;.&#xA;I really do miss a few parts of the old blog setup, but one of the main reasons I switched several years ago was LaTeX support.&#xA;Back then, we didn&amp;rsquo;t have really sweet options like &lt;a href=&#34;http://www.mathjax.org/&#34;&gt;MathJax&lt;/a&gt;.&#xA;And it just takes too long.&lt;/p&gt;&#xA;&lt;p&gt;One of the other big things that was keeping me from updating the blog the last couple of months was&amp;hellip; the stolen laptop.&#xA;It turns out that I didn&amp;rsquo;t have very good backups for the last few website updates, which meant that I needed to manually restore blog posts from the website.&lt;/p&gt;</description>
    </item>
    <item>
      <title>14 vs 1499 vs 15</title>
      <link>https://traviscj.com/blog/post/2014-08-22-14_vs_1499_vs_15/</link>
      <pubDate>Fri, 22 Aug 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-08-22-14_vs_1499_vs_15/</guid>
      <description>&lt;p&gt;Sometimes, it is tempting to see 14.99 and say &amp;ldquo;about 14,&amp;rdquo; even though we all know better.&#xA;The problem with this is that by giving a 0.07% discount&#xA;(14.99 vs 15),&#xA;they have made you estimate a 7% discount (14 vs 15).&lt;/p&gt;&#xA;&lt;p&gt;Nice trick!&lt;/p&gt;</description>
    </item>
    <item>
      <title>launchd as cron crash course</title>
      <link>https://traviscj.com/blog/post/2014-08-08-launchd_as_cron_crash_course/</link>
      <pubDate>Fri, 08 Aug 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-08-08-launchd_as_cron_crash_course/</guid>
      <description>&lt;p&gt;insert&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&#xA;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&#xA;&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;&#xA;&amp;lt;dict&amp;gt;&#xA;        &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;&#xA;        &amp;lt;string&amp;gt;com.whatever.five_after&amp;lt;/string&amp;gt;&#xA;        &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;&#xA;        &amp;lt;array&amp;gt;&#xA;                &amp;lt;string&amp;gt;echo just ran &amp;gt; /tmp/whatever_five_after&amp;lt;/string&amp;gt;&#xA;        &amp;lt;/array&amp;gt;&#xA;        &amp;lt;key&amp;gt;StartCalendarInterval&amp;lt;/key&amp;gt;&#xA;        &amp;lt;dict&amp;gt;&#xA;                &amp;lt;key&amp;gt;Minute&amp;lt;/key&amp;gt;&amp;lt;integer&amp;gt;5&amp;lt;/integer&amp;gt;&#xA;        &amp;lt;/dict&amp;gt;&#xA;&amp;lt;/dict&amp;gt;&#xA;&amp;lt;/plist&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;into &lt;code&gt;$HOME/Library/LaunchAgents/com.whatever.five_after.plist&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you call a script in the ProgramArguments section, remember to make it executable and define the script properly.&lt;/p&gt;&#xA;&lt;p&gt;Run&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;launchctl load $HOME/Library/LaunchAgents/com.whatever.five_after.plist&#xA;launchctl start com.whatever.five_after&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Can also run every N seconds with&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;lt;key&amp;gt;StartInterval&amp;lt;/key&amp;gt;&amp;lt;integer&amp;gt;N&amp;lt;/integer&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Can also check the status with&lt;/p&gt;</description>
    </item>
    <item>
      <title>black box machine learning</title>
      <link>https://traviscj.com/blog/post/2014-07-15-black_box_machine_learning/</link>
      <pubDate>Tue, 15 Jul 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-07-15-black_box_machine_learning/</guid>
      <description>&lt;p&gt;During my Ph.D. I studied optimization algorithms.&#xA;Optimization algorithms are typically an integral part of machine learning algorithms, and we discussed many machine&#xA;learning algorithms, but somehow I made it through without doing very much actual machine learning training or&#xA;prediction tasks.&lt;/p&gt;&#xA;&lt;p&gt;It turns out that it isn&amp;rsquo;t very hard to do some very basic machine learning:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;pip install -U numpy scipy scikit-learn&#xA;ipython&#xA;from sklearn.ensemble import RandomForestClassifier&#xA;from sklearn import datasets&#xA;iris_data = datasets.load_iris()&#xA;rfc = RandomForestClassifier()&#xA;rfc.fit(iris_data[&#39;data&#39;], iris_data[&#39;target&#39;])&#xA;rfc.predict([6.1,2.6,5.6,1.4])    # yields array([2])&#xA;rfc.predict([5.7,4.4,1.5,0.4])    # yields array([0])&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>mnemonicode-0.73</title>
      <link>https://traviscj.com/blog/post/2014-07-10-mnemonicode-0.73/</link>
      <pubDate>Thu, 10 Jul 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-07-10-mnemonicode-0.73/</guid>
      <description>&lt;p&gt;I found&#x9;a really cool tool called &lt;a href=&#34;https://github.com/singpolyma/mnemonicode&#34;&gt;mnemonicode&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It basically encodes an&#x9;arbitrary string into some easily-sayable and understandble phrases:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Traviss-MacBook-Pro% echo &amp;quot;hello world&amp;quot; | ./mnencode&#xA; Wordlist ver 0.7&#xA;square angel stone. blitz pacific tango. zebra shave basic&#xA;Traviss-MacBook-Pro% echo square angel stone. blitz pacific tango. zebra shave basic | ./mndecode&#xA;hello world&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>piping for fun and profit</title>
      <link>https://traviscj.com/blog/post/2014-05-29-piping_for_fun_and_profit/</link>
      <pubDate>Thu, 29 May 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-05-29-piping_for_fun_and_profit/</guid>
      <description>&lt;p&gt;I recently discovered something pretty cool: groovy, and in particular groovysh. It lets you do cool stuff like run&#xA;JVM functions:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;➜  ~  groovysh&#xA;Groovy Shell (2.3.3, JVM: 1.8.0)&#xA;Type &#39;:help&#39; or &#39;:h&#39; for help.&#xA;-------------------------------------------------------------------------------&#xA;groovy:000&amp;gt; new Random().nextInt()&#xA;===&amp;gt; 909782845&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;But the sad part is that it seems pretty slow on my machine:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;➜  ~  time (echo :q | groovysh)&#xA;Groovy Shell (2.3.3, JVM: 1.8.0)&#xA;Type &#39;:help&#39; or &#39;:h&#39; for help.&#xA;-------------------------------------------------------------------------------&#xA;groovy:000&amp;gt; :q&#xA;( echo :q | groovysh; )  16.56s user 0.31s system 201% cpu 8.384 total&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;That&amp;rsquo;s more than 8 seconds just to start up and shut down a prompt that I might just run one command in!&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSL Cert Reissue</title>
      <link>https://traviscj.com/blog/post/2014-04-09-ssl_cert_reissue/</link>
      <pubDate>Wed, 09 Apr 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-04-09-ssl_cert_reissue/</guid>
      <description>&lt;p&gt;Like many others, I have been hit by the &lt;a href=&#34;http://heartbleed.com/&#34;&gt;heartbleed bug&lt;/a&gt;, which kinda sucks.&#xA;I don&amp;rsquo;t use SSL for anything very critical, but I do use it at [tcj.io tcj.io], my &amp;ldquo;projects&amp;rdquo; website.&#xA;My host, &lt;a href=&#34;https://linode.com&#34;&gt;Linode&lt;/a&gt;, has done a great job of &lt;a href=&#34;https://library.linode.com/security/openssl-heartbleed&#34;&gt;providing tutorials&lt;/a&gt; on how to deal with the situation.&#xA;The obvious first step (a couple of days ago) was to upgrade openssl itself:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;apt-get update&#xA;apt-get upgrade&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;But this only prevents the server from leaking keys going forward.&#xA;Since the vulnerability was in the wild for quite some time, I thought it prudent to reissue the certificates as&#xA;well.&#xA;Now that I had a bit more time, I went ahead and did a reissue to make sure that nothing going forward gets leaked.&#xA;This is (as usual) a bit annoying, because of the verification procedure at [Gandi gandi.net].&#xA;Otherwise, they&amp;rsquo;re pretty solid though, so I guess I&amp;rsquo;ll give them a pass on this one.&#xA;And they did allow a reissue without revoking, so that&amp;rsquo;s a good step!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ditching the consumer grade wireless router</title>
      <link>https://traviscj.com/blog/post/2014-01-24-ditching_the_consumer_grade_wireless_router/</link>
      <pubDate>Fri, 24 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2014-01-24-ditching_the_consumer_grade_wireless_router/</guid>
      <description>&lt;p&gt;My fiancée and I both spend a fair bit of time working from home, so we notice downtime almost immediately. We had a &lt;a href=&#34;http://www.netgear.com/home/products/networking/wifi-routers/WNDR3400.aspx&#34;&gt;NETGEAR WNDR3400&lt;/a&gt; which periodically disconnected one or the other of us, or just didn&amp;rsquo;t seem very zippy anymore. I was originally considering a top-of-the-line router, such as an &lt;a href=&#34;https://www.apple.com/airport-extreme/&#34;&gt;Airport Extreme&lt;/a&gt;, a &lt;a href=&#34;http://www.amazon.com/NETGEAR-Nighthawk-AC1900-Gigabit-Router/dp/B00F0DD0I6&#34;&gt;NETGEAR Nighthawk AC1900&lt;/a&gt;, or an &lt;a href=&#34;http://www.amazon.com/RT-AC66U-Dual-Band-Wireless-AC1750-Gigabit-Router/dp/B008ABOJKS/ref=dp_ob_title_ce&#34;&gt;ASUS RT-AC66U&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I had been looking into alternatives for a while, and decided to pull the trigger on the following setup:&lt;/p&gt;</description>
    </item>
    <item>
      <title>language fluidity</title>
      <link>https://traviscj.com/blog/post/2013-12-29-language_fluidity/</link>
      <pubDate>Sun, 29 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-12-29-language_fluidity/</guid>
      <description>&lt;p&gt;I have learned a lot of programming languages over the course of my life. So I wanted to do two things:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Discuss a few effective ways to pick up a new language.&lt;/li&gt;&#xA;&lt;li&gt;Discuss a few references that I&amp;rsquo;ve found helpful for some languages.&#xA;I should start with a disclaimer: I do enjoy learning new languages, but mostly I enjoy creating things in those languages. I&amp;rsquo;m not sure all the effort I have spent learning many languages would not have been better spent learning many fewer languages to a deeper level, but I do feel like it is extremely important to learn principles, not languages, and to use the best tool for a particular job. Many times principles are most clearly illustrated with contrast between languages, and many more times a particular tool has been a patently poor choice for a particular job.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;That being said, it&amp;rsquo;s important to know your “first tongue” languages in significant depth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>square</title>
      <link>https://traviscj.com/blog/post/2013-11-16-square/</link>
      <pubDate>Sat, 16 Nov 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-11-16-square/</guid>
      <description>&lt;p&gt;I probably should have been working on my thesis, but I had a phone interview with Square. I wanted to write a bit of code to get myself “warmed up” but wanted it to be kinda fun. So I decided to write some code that drew a square.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;&#xA;using namespace std;&#xA;&#xA;int main() {&#xA;&#xA;    cout &amp;lt;&amp;lt; &amp;quot;+&amp;quot;;&#xA;    for (int i=0; i&amp;lt;8; i++) cout &amp;lt;&amp;lt; &amp;quot;-&amp;quot;;&#xA;    cout &amp;lt;&amp;lt; &amp;quot;+&amp;quot; &amp;lt;&amp;lt; endl;&#xA;&#xA;    for (int j=0; j&amp;lt;5; j++) {&#xA;        cout &amp;lt;&amp;lt; &amp;quot;|&amp;quot;;&#xA;        for (int i=0; i&amp;lt;8; i++)&#xA;            cout &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&#xA;        cout &amp;lt;&amp;lt; &amp;quot;|&amp;quot;;&#xA;        cout &amp;lt;&amp;lt; endl;&#xA;    }&#xA;&#xA;    cout &amp;lt;&amp;lt; &amp;quot;+&amp;quot;;&#xA;    for (int i=0; i&amp;lt;8; i++) cout &amp;lt;&amp;lt; &amp;quot;-&amp;quot;;&#xA;    cout &amp;lt;&amp;lt; &amp;quot;+&amp;quot; &amp;lt;&amp;lt; endl;&#xA;&#xA;    return 0;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;which yields a nice little square:&lt;/p&gt;</description>
    </item>
    <item>
      <title>some setup notes</title>
      <link>https://traviscj.com/blog/post/2013-10-27-some_setup_notes/</link>
      <pubDate>Sun, 27 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-10-27-some_setup_notes/</guid>
      <description>&lt;h2 id=&#34;zsh&#34;&gt;zsh&lt;/h2&gt;&#xA;&lt;p&gt;Zsh is an amazing (mostly) drop-in replacement for bash.&lt;/p&gt;&#xA;&lt;p&gt;On OSX, just run&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;gt; brew install zsh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You also want to install oh-my-zsh.&lt;/p&gt;&#xA;&lt;p&gt;I went a little crazy with plugins. My list is:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;plugins=(autojump brew git git-flow gnu-utils gpg2 osx textmate zsh-syntax-highlighting history-substring-search)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;ssh&#34;&gt;SSH&lt;/h2&gt;&#xA;&lt;p&gt;I ssh a lot. So I have a bunch of host entries in my .ssh/config file. Each looks like:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Host [shortname]&#xA;     Hostname [hostname]&#xA;     User     [username for hostname]&#xA;     IdentityFile [my home directory]/.ssh/[id_rsa file for this host]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You also need identity files for hosts you use. I tend to use a different one on each host I connect to; some might consider this overly paranoid. Probably it&amp;rsquo;d be better to use 1 key but only for a shorter period of time. In any case, you need to use&lt;/p&gt;</description>
    </item>
    <item>
      <title>overly-ambitious-isqo and the design of numerical codes</title>
      <link>https://traviscj.com/blog/post/2013-10-23-overly-ambitious-isqo_and_the_design_of_numerical_codes/</link>
      <pubDate>Wed, 23 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-10-23-overly-ambitious-isqo_and_the_design_of_numerical_codes/</guid>
      <description>&lt;p&gt;I have finally released the &lt;a href=&#34;https://github.com/traviscj/overly-ambitious-isqo&#34;&gt;overly-ambitious-isqo&lt;/a&gt; project on github!&lt;/p&gt;&#xA;&lt;p&gt;I wanted to call out two particular design concerns I had.&lt;/p&gt;&#xA;&lt;h2 id=&#34;rich-language&#34;&gt;rich language&lt;/h2&gt;&#xA;&lt;p&gt;My first goal was to try very hard to build up the C language to very succinctly express the main algorithm in &lt;code&gt;src/isqo_functor.cpp&lt;/code&gt; in extremely rich language. It seems like numerical code is typically implemented with loops like &lt;code&gt;for (int i=0; i&amp;lt;N; i)&lt;/code&gt; and method calls like &lt;code&gt;deltal(xhat, mu)&lt;/code&gt;. I have found it much easier to reason and think deeply about codes like &lt;code&gt;for (int primal_index=0; primal_index &amp;lt; num_primal; primal_index)&lt;/code&gt; and method calls like &lt;code&gt;linear_model_reduction(penalty_iterate, penalty_parameter)&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>a really simple iterative refinement example</title>
      <link>https://traviscj.com/blog/post/2013-10-17-a_really_simple_iterative_refinement_example/</link>
      <pubDate>Thu, 17 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-10-17-a_really_simple_iterative_refinement_example/</guid>
      <description>&lt;p&gt;I wanted to have a quick example of what iterative refinement is and looks like.&lt;/p&gt;&#xA;&lt;p&gt;Suppose you wanted to solve the (very simple!) problem of solving 5.1x=16, without dividing by decimal numbers. (Yes, this is a bit contrived–I&amp;rsquo;m not sure why you would be able to divide by an integer to get a decimal, but not divide by a decimal to get a decimal. Bear with me.)&lt;/p&gt;&#xA;&lt;p&gt;The standard way would be, of course, to simply evaluate x = (5.1)^{-1}16=3.137254. But this is not available–you can&amp;rsquo;t find an inverse of multiplying by 5.1!&lt;/p&gt;</description>
    </item>
    <item>
      <title>C/C&#43;&#43; Values, Pointers, and References</title>
      <link>https://traviscj.com/blog/post/2013-09-20-c_cpp_values_pointers_and_references/</link>
      <pubDate>Fri, 20 Sep 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-09-20-c_cpp_values_pointers_and_references/</guid>
      <description>&lt;p&gt;I had an embarrassing realization: While C does have an address-of operator, it does not include reference variable or pass-by-reference syntax. It&amp;rsquo;s embarrassing because I should have realized that it was a C++ invention; I guess some of my “C” code actually really has been C++ code.&lt;/p&gt;&#xA;&lt;p&gt;For future reference, here&amp;rsquo;s the current summary of my understanding:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;          &lt;th&gt;var&lt;/th&gt;&#xA;          &lt;th&gt;*var&lt;/th&gt;&#xA;          &lt;th&gt;&amp;amp;var&lt;/th&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;int xv=3;&lt;/td&gt;&#xA;          &lt;td&gt;value&lt;/td&gt;&#xA;          &lt;td&gt;invalid&lt;/td&gt;&#xA;          &lt;td&gt;memory location of value&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;int *xp=&amp;amp;xv;&lt;/td&gt;&#xA;          &lt;td&gt;memory location&lt;/td&gt;&#xA;          &lt;td&gt;value&lt;/td&gt;&#xA;          &lt;td&gt;memory location of pointer.&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;int &amp;amp;xr=xr;&lt;/td&gt;&#xA;          &lt;td&gt;value&lt;/td&gt;&#xA;          &lt;td&gt;invalid&lt;/td&gt;&#xA;          &lt;td&gt;memory location of value&lt;/td&gt;&#xA;          &lt;td&gt;(all invalid in C)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;As one other note, there are three ways you can pass things in C:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Numerical Development on OSX (in the Command Line)</title>
      <link>https://traviscj.com/blog/post/2013-08-19-numerical_development_on_osx_in_the_command_line/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-08-19-numerical_development_on_osx_in_the_command_line/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on C implementations of my research projects, which can of course be a perilous project. I&amp;rsquo;ve found some tools that make it hugely, hugely better.&lt;/p&gt;&#xA;&lt;h2 id=&#34;homebrew&#34;&gt;Homebrew&lt;/h2&gt;&#xA;&lt;p&gt;You can&amp;rsquo;t do a list like this without mentioning homebrew. You want homebrew instead of MacPorts or Fink or bailing twine and chewing gum or whatever else you were thinking about using. Just do it: You can find the homepage at brew.sh or just install with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>spring-mass visualization</title>
      <link>https://traviscj.com/blog/post/2013-07-31-spring-mass_visualization/</link>
      <pubDate>Wed, 31 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-07-31-spring-mass_visualization/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m working on a paper about an algorithm for hotstarting nonlinear program solves; one application of this might be in the realm of nonlinear model predictive control.&#xA;In these types of models, we first define the physical equations for the system under consideration.&#xA;They are subject to some control parameters, which are just a mathematical representation of the input we could give the system.&#xA;We also define an objective&amp;ndash;something that we would like to minimize(usually something like time or energy).&lt;/p&gt;</description>
    </item>
    <item>
      <title>python decorators</title>
      <link>https://traviscj.com/blog/post/2013-07-30-python_decorators/</link>
      <pubDate>Tue, 30 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-07-30-python_decorators/</guid>
      <description>&lt;p&gt;I came across something that I think is actually pretty neat. Python supports ``decorating&amp;rsquo;&amp;rsquo; functions, which lets you define behaviors that essentially wrap around a given function. The benefit is that you can write a simple function and decorate it to do something fancier.&lt;/p&gt;&#xA;&lt;p&gt;I realized I wanted to do this with a simple timing output. Say my function was just something really simple like&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;def f_plain(x,y):&#xA;    print(&amp;#34;x + y = {}&amp;#34;.format( x+y))&#xA;    return x+y&#xA;print (&amp;#34;---&amp;#34;)&#xA;print (f_plain(1,3))&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, to time it, I could define a function like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>better matlab email notifications</title>
      <link>https://traviscj.com/blog/post/2013-06-25-better_matlab_email_notifications/</link>
      <pubDate>Tue, 25 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-06-25-better_matlab_email_notifications/</guid>
      <description>&lt;p&gt;One of my officemates asked me how I did my MATLAB email notifications. I had&#xA;originally done it &lt;a href=&#34;http://traviscj.com/blog/post/2012-09-28-more_stupid_matlab_tricks/&#34;&gt;here&lt;/a&gt;.&#xA;Of course, the machine we work on most didn&amp;rsquo;t support a mail or msmtp command,&#xA;so I found&#xA;&lt;a href=&#34;http://stackoverflow.com/questions/64505/sending-mail-from-python-using-smtp&#34;&gt;an SMTP script&lt;/a&gt;,&#xA;which worked okay, but frustratingly also required Python. On a bit more sleep,&#xA;it finally occured to me that MATLAB might have an email script.&lt;/p&gt;&#xA;&lt;p&gt;Turns out, &lt;a href=&#34;http://www.mathworks.com/help/matlab/ref/sendmail.html&#34;&gt;it does&lt;/a&gt;.&#xA;I wrote a little wrapper script around this to abstract out some of the email&#xA;details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>org-mode emacs to track mileage</title>
      <link>https://traviscj.com/blog/post/2013-05-15-org-mode_emacs_to_track_mileage/</link>
      <pubDate>Wed, 15 May 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-05-15-org-mode_emacs_to_track_mileage/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been trying out emacs org-mode lately for keeping track of everything.&#xA;One thing that seemed worth tracking is the mileage the new Focus gets.&#xA;Turns out that org-mode supports a kind of spreadsheet, so I made a quick little video demo on how I use it:&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;</description>
    </item>
    <item>
      <title>Getting really fast at LaTeX</title>
      <link>https://traviscj.com/blog/post/2013-04-10-getting_really_fast_at_latex/</link>
      <pubDate>Wed, 10 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-04-10-getting_really_fast_at_latex/</guid>
      <description>&lt;p&gt;Taking LaTeX notes in real time is one of my favorite useless party tricks. I started developing my techniques during the last year or two of undergraduate work at University of Washington, and was extremely good at it by the end of coursework at Northwestern. There are several keys to taking LaTeX notes in real time:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Know LaTeX.&lt;/li&gt;&#xA;&lt;li&gt;Shortcut appropriately.&lt;/li&gt;&#xA;&lt;li&gt;Type keystrokes quickly.&lt;/li&gt;&#xA;&lt;li&gt;One keystroke re-renders.&lt;/li&gt;&#xA;&lt;li&gt;Type fewer keystrokes.&lt;/li&gt;&#xA;&lt;li&gt;Type fewer “strange” keystrokes (backslashes, curly braces, etc)&lt;/li&gt;&#xA;&lt;li&gt;Re-renders should scroll to your current location in the text.&lt;/li&gt;&#xA;&lt;li&gt;Extremely rapid debugging of LaTeX expressions.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Before I get started, one other note: I mention TextMate a few places, but in principle there is no reason you couldn&amp;rsquo;t configure all the same things in Vim, Emacs, or Sublime Text. If I was starting over, I might use Sublime Text instead.&lt;/p&gt;</description>
    </item>
    <item>
      <title>implementation of set operations</title>
      <link>https://traviscj.com/blog/post/2013-03-13-implementation_of_set_operations/</link>
      <pubDate>Wed, 13 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-03-13-implementation_of_set_operations/</guid>
      <description>&lt;p&gt;We got in a bit of a debate yesterday in the office over the implementation of associative containers, which I thought was pretty fun.&#xA;We made up the big chart of complexity results you see below.&lt;/p&gt;&#xA;&lt;h2 id=&#34;nomenclature&#34;&gt;nomenclature:&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$S$, $S_1$, and $S_2$ are subsets of $\Omega$.&lt;/li&gt;&#xA;&lt;li&gt;Denote an element by $e\in\Omega$.&lt;/li&gt;&#xA;&lt;li&gt;$n$,$n_1$,$n_2$,$N$ are the sizes of the set $S$, $S_1$, $S_2$, and $\Omega$, respectively, and $n_1 \geq n_2$.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;complexity&#34;&gt;Complexity&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Operation\Approach&lt;/th&gt;&#xA;          &lt;th&gt;Hash Table&lt;/th&gt;&#xA;          &lt;th&gt;Hash Tree&lt;/th&gt;&#xA;          &lt;th&gt;Binary List&lt;/th&gt;&#xA;          &lt;th&gt;Entry List (sorted)&lt;/th&gt;&#xA;          &lt;th&gt;Entry List (unsorted)&lt;/th&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$e \in S&#x9;&#x9;  $&lt;/td&gt;&#xA;          &lt;td&gt;$O(1)   &#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(log(n))&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(1)&#x9;&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(log(n))&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n)&#x9;&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$S_1 \cup S_2    $&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_1+n_2)&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_1+n_2)&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(N)&#x9;&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_1+n_2)&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_1n_2)&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;$S_1 \cap S_2    $&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_1)&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(log(n_1)n_2)$&lt;/td&gt;&#xA;          &lt;td&gt;$O(N)&#x9;&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_2)&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n_1n_2)&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;space complexity&lt;/td&gt;&#xA;          &lt;td&gt;$O(n)&#x9;&#x9;&#x9;$&lt;/td&gt;&#xA;          &lt;td&gt;$O(n)          $&lt;/td&gt;&#xA;          &lt;td&gt;$O(N)$ bits.&lt;/td&gt;&#xA;          &lt;td&gt;$O(n)          $&lt;/td&gt;&#xA;          &lt;td&gt;$O(n)          $&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;As I said&amp;ndash;this was just what came out of my memory of an informal discussion, so I make no guarantees that any of it is correct.&#xA;Let me know if you spot something wrong!&#xA;We used the examples  $S_1 = {1,2,3,4,5}$ and $S_2 = {500000}$ to think through some things.&lt;/p&gt;</description>
    </item>
    <item>
      <title>website basics</title>
      <link>https://traviscj.com/blog/post/2013-02-15-website_basics/</link>
      <pubDate>Fri, 15 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-02-15-website_basics/</guid>
      <description>&lt;p&gt;Several of my classmates in graduate school are considering making websites around now, and have asked me to explain it.&#xA;I figured I&amp;rsquo;d explain the stack as I have it set up, and where you could make tradeoffs.&#xA;For now, I&amp;rsquo;m not going to include too many detail here; I just want to outline the possibilities and lingo so that researching options is a bit easier for the uninitiated.&lt;/p&gt;&#xA;&lt;p&gt;First off, many people are perfectly happy to use the school&amp;rsquo;s email and department web space.&#xA;If you only want to have a list of relevant papers and soforth, then this is a fine approach.&#xA;See the very bottom of this post for a couple potential ideas for organizing it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>some tips for project euler problems</title>
      <link>https://traviscj.com/blog/post/2013-01-26-some_tips_for_project_euler_problems/</link>
      <pubDate>Sat, 26 Jan 2013 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2013-01-26-some_tips_for_project_euler_problems/</guid>
      <description>&lt;p&gt;I wanted to make a list of a few tips on solving &lt;a href=&#34;http://projecteuler.net&#34;&gt;Project Euler&lt;/a&gt; problems that have been helpful for me while I solve them.&#xA;These are general principles, even though I do most of my Project Euler coding in Python.&lt;/p&gt;&#xA;&lt;p&gt;Without further ado:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If the problem is asking for something concerning the number of digits, typically this indicates that the use of the $\log n$ function is warranted.&lt;/li&gt;&#xA;&lt;li&gt;If the problem is asking for the last few digits, modulo arithmetic might speed it up considerably.&lt;/li&gt;&#xA;&lt;li&gt;Some might consider this cheating, but looking up some small numbers in the &lt;a href=&#34;http://oeis.org/&#34;&gt;Online Encyclopedia of Integer Sequences&lt;/a&gt; is occasionally pretty helpful.&lt;/li&gt;&#xA;&lt;li&gt;Many problems boil down to: Find numbers with property $X$ and property $Y$. Two solutions are:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Brute force: Try all numbers with tests of property $X$ and $Y$.&lt;/li&gt;&#xA;&lt;li&gt;Find numbers with property $X$ and filter by a test of property $Y$.&lt;/li&gt;&#xA;&lt;li&gt;Find numbers with property $Y$ and filter by a test of property $X$.&lt;/li&gt;&#xA;&lt;li&gt;Find the set of numbers with property $X$ and the set of numbers with property $Y$. Compute their intersection.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve found that it&amp;rsquo;s sometimes hard to predict which one will end up being the fastest.&#xA;It depends on the relative speed of the tests and the generators, and the frequency of finding numbers which have that property.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some Recent Photography</title>
      <link>https://traviscj.com/blog/post/2012-12-16-some_recent_photography/</link>
      <pubDate>Sun, 16 Dec 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-12-16-some_recent_photography/</guid>
      <description>&lt;p&gt;My girlfriend and I were out by the lake taking pictures recently.&#xA;I was trying to get the Chicago skyline, but we really weren&amp;rsquo;t in the right place for it.&#xA;So instead I settled for taking some long exposure photos of stuff I found.&lt;/p&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;I think they came out pretty good, especially because it was all a ruse to get her to the lakefront so that I could ask if she would marry me.&#xA;She said yes!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Game of Life</title>
      <link>https://traviscj.com/blog/post/2012-11-20-game_of_life/</link>
      <pubDate>Tue, 20 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-11-20-game_of_life/</guid>
      <description>&lt;p&gt;When I was a sophomore in high school, I was fascinated with&#xA;[ Conway&amp;rsquo;s Game of Life].&#xA;I still am. I did a pretty rudamentary study of the kinds of patterns that could&#xA;form from the simple rules of the game.&lt;/p&gt;&#xA;&lt;p&gt;One thing that wasn&amp;rsquo;t available when I was a sophomore was Youtube.&#xA;Two of my favorite Game of Life videos:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.youtube.com/watch?v=xP5-iIeKXE8&#34;&gt;lifeception&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://www.youtube.com/watch?v=C2vgICfQawE&#34;&gt;epic life&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Another direction that Game of Life has gone recently is something that I really should have thought of, honestly.&#xA;Many times I&amp;rsquo;ve thought that there&amp;rsquo;s at least some superficial relationship between Game of Life and diffusion equations.&#xA;Turns out that S. Rafler has extended Game of Life to continuous domains through what he calls &lt;a href=&#34;http://arxiv.org/abs/1111.1567&#34;&gt;SmoothLife&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Perturbation Theory Problems with bvp4c</title>
      <link>https://traviscj.com/blog/post/2012-10-22-perturbation_theory_problems_with_bvp4c/</link>
      <pubDate>Mon, 22 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-10-22-perturbation_theory_problems_with_bvp4c/</guid>
      <description>&lt;p&gt;I have been watching Nathan Kutz&amp;rsquo; lectures on Coursera.&#xA;One change he made to the course since I took AMATH 581 at University of Washington was introducing the MATLAB function &lt;em&gt;bvp4c&lt;/em&gt;.&#xA;I immediately realized that this would be nice for solving boundary layer problems that arise in asymptotics.&lt;/p&gt;&#xA;&lt;p&gt;Following my life philosophy of doing the dumbest thing that could possibly work, I tried implementing Nathan&amp;rsquo;s code for a single-layer boundary layer problem from Holmes, Chapter 2:&lt;/p&gt;</description>
    </item>
    <item>
      <title>more stupid matlab tricks</title>
      <link>https://traviscj.com/blog/post/2012-09-28-more_stupid_matlab_tricks/</link>
      <pubDate>Fri, 28 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-09-28-more_stupid_matlab_tricks/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been setting up long-ish runs on my MATLAB instance lately, which is nice because I can wanter off to do something else. The trouble is that I occasionally forget to come back or refocus on work again.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve come up with two solutions to this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The first is to use growlnotify to pop up a persistant growl message. This works well enough as long as I&amp;rsquo;m at the computer:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;system(&amp;#39;growlnotify -s -m &amp;#34;somefile is done&amp;#34;&amp;#39;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;For more extended aways or if I&amp;rsquo;m going to take a nap while it runs, I might do something more like:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;system(&amp;#39;echo &amp;#34;matlab: uflX_aw_constr_log_5_15 done&amp;#34; | msmtp -a traviscj (mycell)@txt.att.net&amp;#39;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You need some setup before this works: I did a &lt;em&gt;brew install msmtp&lt;/em&gt; and set up a .msmtprc file. After that, it should work goldenly, at least for AT&amp;amp;T customers. Others might need to look up their email/sms gateway number.&lt;/p&gt;</description>
    </item>
    <item>
      <title>debugging matlab mex</title>
      <link>https://traviscj.com/blog/post/2012-08-16-debugging_matlab_mex/</link>
      <pubDate>Thu, 16 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-08-16-debugging_matlab_mex/</guid>
      <description>&lt;p&gt;One thing I&amp;rsquo;ve been doing a bit of lately is debugging MATLAB mex files; it seemed worth documenting.&#xA;The broad strokes:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;recompile all mex codes with &amp;lsquo;-g&amp;rsquo;&lt;/li&gt;&#xA;&lt;li&gt;quit MATLAB&lt;/li&gt;&#xA;&lt;li&gt;From a command prompt, run&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ /Applications/MATLAB_R2012a.app/bin/matlab -Dgdb&#xA;[snip]&#xA;(gdb) run -nojvm&#xA;&amp;gt;&amp;gt; run_your_mex_file&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This gives debugging output. If there is an error in the code, you&amp;rsquo;re dropped back to a gdb prompt, where you can continue debugging in a semi-normal fashion.&#xA;Typically, I end up doing a &amp;lsquo;where&amp;rsquo; to get a stack trace, and debug from there more-or-less like usual.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Meta post - How my blog works</title>
      <link>https://traviscj.com/blog/post/2012-07-27-meta_post_how_my_blog_works/</link>
      <pubDate>Fri, 27 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-07-27-meta_post_how_my_blog_works/</guid>
      <description>&lt;p&gt;A while back, Sharvil requested a quick overview of how I post stuff to my blog, so I thought I&amp;rsquo;d post a rundown of it.&lt;/p&gt;&#xA;&lt;p&gt;At the base, I use a git repository to store files named entryNNNN.txt. Each has the basic format:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;title: Meta post: How my blog works&#xA;date: 2012/07/27&#xA;category: software&#xA;---&#xA;A while back, Sharvil requested a quick overview of how I post stuff to my blog, so I thought I&amp;#39;d post a rundown of it.&#xA;At the base, I use a git repository to store files named entryNNNN.txt. Each has the basic format:&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To start a new post and fill in some of this, I have a script called &amp;rsquo;newentry.sh&amp;rsquo;, which determines the latest entry number and adds one to get a new filename (eg, entry0081.txt).&lt;/p&gt;</description>
    </item>
    <item>
      <title>More cracking D-Link Files</title>
      <link>https://traviscj.com/blog/post/2012-06-27-more_cracking_d-link_files/</link>
      <pubDate>Wed, 27 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-06-27-more_cracking_d-link_files/</guid>
      <description>&lt;p&gt;Somehow, in the process of a router reconfiguration, I reset the password without the new password getting saved into 1Password.&#xA;So I found myself locked out of my own router.&#xA;I was about to reset it, thinking, &amp;ldquo;Hey, at least I have a backup of the settings from 2 nights ago!&amp;rdquo; and then realized, &amp;ldquo;I bet that settings file has the password right in it.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Googling around a bit turned up &lt;a href=&#34;http://www.shulerent.com/2009/08/21/cracking-the-d-link-settings-file/&#34;&gt;this guy&lt;/a&gt;, but he only wrote VBA and a Windows binary.&#xA;His pseudo-code looked pretty easy to translate into Python, so I did just that. Here&amp;rsquo;s the result: &lt;a href=&#34;https://github.com/traviscj/decode_gws&#34;&gt;D-Link DIR615 B2 v2.25 Decoder&lt;/a&gt; (no encoder, yet&amp;hellip;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>McCormick Interview - Outreach 101 &#43; QUALS</title>
      <link>https://traviscj.com/blog/post/2012-06-13-mccormick_interview_outreach_101_quals/</link>
      <pubDate>Wed, 13 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-06-13-mccormick_interview_outreach_101_quals/</guid>
      <description>&lt;p&gt;I was interviewed and given a semi-prominent placement in &lt;a href=&#34;http://www.mccormick.northwestern.edu/magazine/&#34;&gt;Northwestern&amp;rsquo;s McCormick Magazine&lt;/a&gt; for the outreach work that 2011-2012 NU-IEEE President Curtis Wang and I have put together. &lt;a href=&#34;outreach-public-schools.pdf&#34;&gt;Permalink to article&lt;/a&gt;.&#xA;It was a really nice writeup and really great to get to throw out a mention of Joyce Stark!&lt;/p&gt;&#xA;&lt;p&gt;In other news&amp;ndash;I had a crazy couple of weeks due to preparing for (and eventually, taking!) my PhD qualifying examinations. They consist of a panel of three professors questioning me on intricacies of material that I&amp;rsquo;ve been learning over the last couple of years, namely: Numerical PDE methods, Analytic PDE methods, and optimization. Professor Kath had a particularly interesting question where I derived the heat equation from a minimum-energy problem. The exams went for 95 minutes, followed by a 5 minute deliberation, after which each professor came out with handshakes and congratulations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Numerical Recipes &amp; Scientific Libraries</title>
      <link>https://traviscj.com/blog/post/2012-05-26-numerical_recipes_scientific_libraries/</link>
      <pubDate>Sat, 26 May 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-05-26-numerical_recipes_scientific_libraries/</guid>
      <description>&lt;p&gt;I attended a talk on how to use &lt;a href=&#34;http://www.it.northwestern.edu/research/adv-research/hpc/quest/index.html&#34;&gt;Quest&lt;/a&gt;, Northwestern University&amp;rsquo;s TOP500 supercomputer(At least during June 2010). Most of it was a routine introduction to MPI, but one interesting question raised was what routines we should be using in our scientific computing codes. A lot of holdouts were still using [ Numerical Recipes] for their research-level codes, which strikes me as a backwards way about it. Numerical Recipes is a starting point, and probably &lt;a href=&#34;http://web.archive.org/web/20021015200910/http://math.jpl.nasa.gov/nr/nr-alt.html&#34;&gt;not the best&lt;/a&gt; thing to use: &lt;a href=&#34;http://mingus.as.arizona.edu/~bjw/software/boycottnr.html&#34;&gt;it has awful licensing&lt;/a&gt; and &lt;a href=&#34;http://www.uwyo.edu/buerkle/misc/wnotnr.html&#34;&gt;might not even be that reliable!&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrating Sparrow and Aperture/iPhoto</title>
      <link>https://traviscj.com/blog/post/2012-04-13-integrating_sparrow_and_apertureiphoto/</link>
      <pubDate>Fri, 13 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-04-13-integrating_sparrow_and_apertureiphoto/</guid>
      <description>&lt;p&gt;In my recent quest to take on digital photography, I&amp;rsquo;ve been using Apple&amp;rsquo;s Aperture to store download my pictures and do basic manipulation on them. It&amp;rsquo;s been working great, except that emailing is a pain because Apple hardcoded the email clients to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Apple Mail.app&lt;/li&gt;&#xA;&lt;li&gt;Eudora (really!?)&lt;/li&gt;&#xA;&lt;li&gt;America Online(!?!)&lt;/li&gt;&#xA;&lt;li&gt;Microsoft Entourage&lt;/li&gt;&#xA;&lt;li&gt;Microsoft Outlook&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;while I&amp;rsquo;d prefer to use Sparrow, a lightweight client that Sharvil got me hooked on a while back. Rather than continue to use Mail.app to send pictures via email, I found out that Aperture actually uses some AppleScripts to do the actual sending of the email. That got me thinking: I just need to change the script to mail using Sparrow, instead of Mail.&lt;/p&gt;</description>
    </item>
    <item>
      <title>chicago 2012 marathon</title>
      <link>https://traviscj.com/blog/post/2012-04-02-chicago_2012_marathon/</link>
      <pubDate>Mon, 02 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-04-02-chicago_2012_marathon/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve signed up for the &lt;a href=&#34;http://www.chicagomarathon.com/cms400min/chicago_marathon/&#34;&gt;Chicago 2012 Marathon&lt;/a&gt; with &lt;a href=&#34;https://afc.aidschicago.org/netcommunity/page.aspx?pid=1458&#34;&gt;Team To End AIDS&lt;/a&gt; or &lt;a href=&#34;https://afc.aidschicago.org/netcommunity/traviscj&#34;&gt;my donation page&lt;/a&gt;&amp;ndash;PLEASE! every bit helps!). It&amp;rsquo;s a bit of an unusual choice, probably, to not run for the American Lung Association(I have asthma) or the American Cancer Society(my dad is a survivor.) But it&amp;rsquo;s actually been a good opportunity to learn a bit more about the current state of AIDS, AIDS policy, and what it&amp;rsquo;s like to live with it. I&amp;rsquo;ve also had some really good discussions about it with people it would not have come up, so it has been nice all around.&lt;/p&gt;</description>
    </item>
    <item>
      <title>digital photography</title>
      <link>https://traviscj.com/blog/post/2012-03-29-digital_photography/</link>
      <pubDate>Thu, 29 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-03-29-digital_photography/</guid>
      <description>&lt;p&gt;Recently I&amp;rsquo;ve decided to dedicate a slight bit of time to get a bit better at taking pictures.&#xA;I&amp;rsquo;d always wanted to get a truly nice camera, and the opportunity presented itself, so I decided to go for it and bought a Nikon D5100 DSLR.&#xA;I also ended up getting a complete steal on the Nikon 55-200mm DX VR lens, which was pretty awesome.&#xA;&lt;a href=&#34;http://content.photojojo.com/tutorials/project-365-take-a-photo-a-day/&#34;&gt;Project 365&lt;/a&gt; would be a great move from here, since I&amp;rsquo;m certainly no photographer, but it&amp;rsquo;s been fun just learning about it all the ins and outs and how it all works together.&#xA;In any case, I did start a &lt;a href=&#34;http://www.flickr.com/photos/drtraviscj/&#34;&gt;Flickr: drtraviscj&lt;/a&gt; account which I&amp;rsquo;ll be posting stuff.&lt;/p&gt;</description>
    </item>
    <item>
      <title>fibonacci miles and kilometers</title>
      <link>https://traviscj.com/blog/post/2012-03-29-fibonacci_miles_and_kilometers/</link>
      <pubDate>Thu, 29 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-03-29-fibonacci_miles_and_kilometers/</guid>
      <description>&lt;p&gt;In my running, I have been trying to keep track in kilometers. This presents a couple problems: Somehow, my mind still thinks in miles, which is weird because I do not really have /that/ good of an idea exactly how far a mile is, either.&#xA;Or someone wants to know how far a 5k is. Or, when I was running the 2011 Chicago Marathon, there would be kilometer postings between the mile markers. Anyway, it is handy to convert between them, but a bit of a pain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>tjtestharness - a language-agnostic DVCS unit-test/continuous integration tool</title>
      <link>https://traviscj.com/blog/post/2012-03-26-tjtestharness_-_a_language-agnostic_dvcs_unit-testcontinuous_integration_tool/</link>
      <pubDate>Mon, 26 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-03-26-tjtestharness_-_a_language-agnostic_dvcs_unit-testcontinuous_integration_tool/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been wanting to have a way to visualize which unit tests(or sets of them) passed for a given commit, if for no other reason than the sense of accomplishment from watching boxes turn yellow, then green, as they pass tests.&#xA;The trouble is, I write code in a lot of different languages for a lot of different projects.&#xA;I also don&amp;rsquo;t want to bother with running unit tests individually&amp;ndash;I want them to run as I perform commits.&lt;/p&gt;</description>
    </item>
    <item>
      <title>a trig problem solved in MATLAB</title>
      <link>https://traviscj.com/blog/post/2012-02-01-a_trig_problem_solved_in_matlab/</link>
      <pubDate>Wed, 01 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-02-01-a_trig_problem_solved_in_matlab/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://i.imgur.com/yOswe.jpg&#34; alt=&#34;diagram&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I came across &lt;a href=&#34;http://www.reddit.com/r/matlab/comments/p4b4s/nothing_feels_as_good_as_getting_a_somewhat/&#34;&gt;this&lt;/a&gt; post. The basic idea is the guy wants to maximize $L_1+L_2$&#xA;constrained to this box, where $L_i$ is the length of beam $i$. It&amp;rsquo;s constrained&#xA;to be a 61 cmx61 cm box, but one beam must start from 10cm up from the bottom&#xA;right corner and the beams must meet at a point along the top of the box.&#xA;I added the further assumption that the other beam must end in the bottom left&#xA;corner.&lt;/p&gt;</description>
    </item>
    <item>
      <title>cplex matlab interface</title>
      <link>https://traviscj.com/blog/post/2012-02-01-cplex_matlab_interface/</link>
      <pubDate>Wed, 01 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-02-01-cplex_matlab_interface/</guid>
      <description>&lt;p&gt;Just for my own reference, I&amp;rsquo;m documenting the interface to CPLEX.&lt;/p&gt;&#xA;&lt;p&gt;CPLEX expects a problem in the form&#xA;(&#xA;\begin{split}&#xA;\min \qquad &amp;amp; g^Td + \frac12 d^TWd\&#xA;\text{subject to} \qquad &amp;amp; c_L \leq Ad \leq c_U\&#xA;&amp;amp; d_L \leq d \leq d_U&#xA;\end{split}&#xA;)&#xA;and is called by&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cplex = Cplex(&amp;#39;test&amp;#39;);&#xA;cplex.Param.feasopt.tolerance.Cur = 1e-8;&#xA;if params.printLevel &amp;lt; 8&#xA;    cplex.DisplayFunc = [];&#xA;end&#xA;cplex.Model.sense = &amp;#39;minimize&amp;#39;;&#xA;cplex.Param.qpmethod.Cur = 1;&#xA;cplex.addCols(gk,[],bl-xk,bu-xk);&#xA;cplex.addRows(-ck, A0, -ck);&#xA;cplex.Model.Q = W;&#xA;cplex.Model.obj = g;&#xA;cplex.Model.lb = d_L;&#xA;cplex.Model.ub = d_U;&#xA;cplex.Model.lhs= c_L;&#xA;cplex.Model.rhs= c_U;&#xA;cplex.solve();&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>spamfunc for optimization in matlab</title>
      <link>https://traviscj.com/blog/post/2012-01-30-spamfunc_for_optimization_in_matlab/</link>
      <pubDate>Mon, 30 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-01-30-spamfunc_for_optimization_in_matlab/</guid>
      <description>&lt;h1 id=&#34;what-spamfunc-is&#34;&gt;what spamfunc is&lt;/h1&gt;&#xA;&lt;p&gt;In developing optimization algorithms, one of the most tedious parts is trying different examples, each of which might have its own starting points or upper or lower bounds or other information.&#xA;The tedium really starts when your algorithm requires first or second order information, which might be tricky to calculate correctly.&#xA;These bugs can be pernicious, because it might be difficult to differentiate between a bug in your algorithm and a bug in your objective or constraint evaluation.&#xA;Handily, Northwestern Professor &lt;a href=&#34;http://users.iems.northwestern.edu/~4er/&#34;&gt;Robert Fourer&lt;/a&gt; wrote a language called &lt;a href=&#34;http://www.ampl.com/&#34;&gt;AMPL&lt;/a&gt;, which takes a programming-language specification of objective and constraints and calculates derivatives as needed.&#xA;The official amplfunc/spamfunc reference is contained in &lt;a href=&#34;http://ampl.com/REFS/HOOKING/#UsewithMATLAB&#34;&gt;Hooking Your Solver to AMPL&lt;/a&gt;, but I&amp;rsquo;m shooting for a more low-key introduction.&lt;/p&gt;</description>
    </item>
    <item>
      <title>VirtualBox and HRD/JT65</title>
      <link>https://traviscj.com/blog/post/2012-01-10-virtualbox_and_hrdjt65/</link>
      <pubDate>Tue, 10 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2012-01-10-virtualbox_and_hrdjt65/</guid>
      <description>&lt;p&gt;One of the semi-frustrating aspects of the state of computing and ham radio is the unavailability of some software packages on OSX.&#xA;In particular, I&amp;rsquo;ve been interested in experimenting with JT65 and also wanted to use my Yaesu FT-857d&amp;rsquo;s CAT cable to program memories and also try out HRD.&#xA;(I should add&amp;ndash;I&amp;rsquo;ve tried the JT65 stuff and some Yaesu memory programmers, but wasn&amp;rsquo;t satisfied with the Linux setup for those.&#xA;I&amp;rsquo;ll probably look into getting them working more later, but for now, this article.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>tcjblog.py</title>
      <link>https://traviscj.com/blog/post/2011-09-09-tcjblogpy/</link>
      <pubDate>Fri, 09 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2011-09-09-tcjblogpy/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve now (for the most part) finished a working version of some software I&amp;rsquo;ve&#xA;wanted to tackle for a while. I call it tcjblog.py. It&amp;rsquo;s a blog platform built&#xA;using &lt;a href=&#34;http://jemdoc.jaboc.net/&#34;&gt;jemdoc.py&lt;/a&gt; to format simple text files into&#xA;nice looking HTML. What&amp;rsquo;re the benefits of this, and features of tcjblog.py in&#xA;general?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Simple, text file management of blog posts. (I control these with git.)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ability to include LaTeX markup.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Static HTML for all blog-related pages&lt;/p&gt;</description>
    </item>
    <item>
      <title>Five Critical Textbooks for (Applied!) Math &amp; Physics Students</title>
      <link>https://traviscj.com/blog/post/2011-09-04-five_critical_textbooks_for_applied_math_physics_students/</link>
      <pubDate>Sun, 04 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2011-09-04-five_critical_textbooks_for_applied_math_physics_students/</guid>
      <description>&lt;p&gt;In the course of working through my first year at grad school, I&amp;rsquo;ve come up with five favorites for the basics of an undergrad understanding of the essential topics for applied math and physics. Without ado and in the order I&amp;rsquo;d take them off my shelf:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mathematical Methods in the Physical Sciences - ML Boas. This is my favorite, because it contains almost every technique you need, and it has a ton and a half of problems(over 3400). It contains a good review of complex analysis, linear algebra, differential equations, and calculus, but also chapters on special functions, partial differential equations, probability, tensors, and the calculus of variations.&#xA;&amp;ndash; Hidden Gem: Chapter 4, Section 12: Differentiation of Integrals, RP Feynman&amp;rsquo;s favorite trick.&lt;/li&gt;&#xA;&lt;li&gt;Calculus - Greenspan. A great reference on calculus.&lt;/li&gt;&#xA;&lt;li&gt;Complex Variables and Applications - Brown &amp;amp; Churchill: The most readable book on complex analysis I&amp;rsquo;ve read. Not so hidden gem: Most of the solutions are given right alongside the problem&amp;ndash;a great book for self-study. Also the material on conformal mapping and fluid flows.&lt;/li&gt;&#xA;&lt;li&gt;Linear Algebra And Its Applications - Strang. Nice book on linear algebra theory.&#xA;&amp;ndash; Hidden Gem: Chapter 7, Section 4: Iterative Methods for Ax=b and Gershgorin&amp;rsquo;s circle theorem.&lt;/li&gt;&#xA;&lt;li&gt;Elementary Differential Equations and Boundary Value Problems - Boyce &amp;amp; DiPrima. Powerhouse of differential equation knowledge. Strangely, it is the book ESAM recommended, but not the book they use for teaching their undergrads.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve spent probably the most time with Boas&amp;rsquo; Mathematical Methods in the Physical Sciences&amp;ndash;I&amp;rsquo;ve worked nearly 1000 problems out of the book to get ready for the preliminary exams my first year. It was completely worthwhile.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting GnuPlot to compile on OSX</title>
      <link>https://traviscj.com/blog/post/2010-05-27-getting_gnuplot_to_compile_on_osx/</link>
      <pubDate>Thu, 27 May 2010 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2010-05-27-getting_gnuplot_to_compile_on_osx/</guid>
      <description>&lt;p&gt;I misunderstood an officemate’s question yesterday and set out to compile gnuplot. Stock GNUPlot will fail to compile on OSX due to an incompatibility in the readline library. So when you compile, let GNUPlot know to use the one included:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt; tar xzvf gnuplot*&#xA;&amp;gt; cd gnuplot-4.2.39&#xA;&amp;gt; ./configure --prefix=/usr/local --with-readline=builtin&#xA;&amp;gt; make&#xA;&amp;gt; sudo make install&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Pylab PDF</title>
      <link>https://traviscj.com/blog/post/2010-05-25-pylab_pdf/</link>
      <pubDate>Tue, 25 May 2010 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2010-05-25-pylab_pdf/</guid>
      <description>&lt;p&gt;I’m in the process of kicking the MATLAB habit and replacing it with Python. Pylab is a reasonable approximation to the 2D plotting capabilities of MATLAB, but by default Pylab doesn’t run on headless(ie, non-GUI) boxes. So on my macbook, where I’m often running things interactively, I have&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;backend : macosx&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and on the faster core2quad machine I send off longer-running jobs to, I used&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;backend : PDF&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;in the .matplotlib/matplotrc file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spaces setup</title>
      <link>https://traviscj.com/blog/post/2010-05-25-spaces_setup/</link>
      <pubDate>Tue, 25 May 2010 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2010-05-25-spaces_setup/</guid>
      <description>&lt;p&gt;My workflow is probably pretty specific, but I figured I’d document it for people looking for ideas on how to set it up. This one seems to work pretty well for me.&lt;/p&gt;&#xA;&lt;p&gt;. Terminal: for running stuff on my and other computers.&#xA;. Textmate: writing mathematics, programming code, etc&#xA;. Mathematica, MATLAB, and Papers&#xA;. Mail and Adium&#xA;. Firefox, Chrome, Safari&#xA;. iTunes and VLC&lt;/p&gt;&#xA;&lt;p&gt;I have this arranged in a 3×2 grid, such that Textmate is top center. From there I can navigate to terminal, math programs, and Firefox directly(control-{left,right,down}). It takes two navigations to get to communication programs and entertainment, which is good for concentration while working.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ZSH and scp/rsync globbing</title>
      <link>https://traviscj.com/blog/post/2010-05-25-zsh_and_scprsync_globbing/</link>
      <pubDate>Tue, 25 May 2010 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2010-05-25-zsh_and_scprsync_globbing/</guid>
      <description>&lt;p&gt;I finally got annoyed at typing&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tjohnson&amp;gt; scp tcj:*txt .&#xA;zsh: no matches found: tcj:*txt&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I’d always fixed this by the up-CTRL-A-over-over-over-over-quote-CTRL-E-over-over-quote method, ie&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tjohnson&amp;gt; scp &amp;#34;tcj:*txt&amp;#34; .&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;but the more proper and less annoying version is&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tjohnson&amp;gt; scp tcj:\*txt .&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However, in the spirit of inspired overkill, there are a couple other options. You can define some new aliases with&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;alias scp=&amp;#39;noglob scp&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;but that hardly counts as overkill, so instead I edited my .zshrc to include&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why We Know Less About the World than Ever</title>
      <link>https://traviscj.com/blog/post/2010-01-11-why_we_know_less_about_the_world_than_ever/</link>
      <pubDate>Mon, 11 Jan 2010 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2010-01-11-why_we_know_less_about_the_world_than_ever/</guid>
      <description>&lt;p&gt;In a short break from studying for tomorrow&amp;rsquo;s preliminary exam, I came across a TED talk about &lt;a href=&#34;http://www.youtube.com/watch?v=6Ly7Btx0Stg&#34;&gt;Why We Know Less About the World Than Ever&lt;/a&gt;. I&amp;rsquo;ve spent quite a lot of energy thinking about the main question Alisa Miller brings up, which is: how did we get news get so focused on things like Anna Nichole Smith&amp;rsquo;s death while ignoring North Korean nuclear disarmament, the IPCC&amp;rsquo;s global warming report, and other arguably more important news stories?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tunes U and Essential Mathematica</title>
      <link>https://traviscj.com/blog/post/2009-12-13-itunes_u_and_essential_mathematica/</link>
      <pubDate>Sun, 13 Dec 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-12-13-itunes_u_and_essential_mathematica/</guid>
      <description>&lt;p&gt;In a similar vein to the TED talks in the previous post, I&amp;rsquo;ve also been watching a lot of lectures from iTunes U lately. Mostly to get ready for preliminary exams, but also for their sheer awesomeness of the teaching and material. I&amp;rsquo;ve been most surprised how many people haven&amp;rsquo;t heard of this yet: Nearly everyone seems surprised when they hear about it. Anyways, here&amp;rsquo;s my list of favorites so far:&lt;/p&gt;</description>
    </item>
    <item>
      <title>TED Talks</title>
      <link>https://traviscj.com/blog/post/2009-11-26-ted_talks/</link>
      <pubDate>Thu, 26 Nov 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-11-26-ted_talks/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been downloading a lot from iTunes recently, both in the form of TED talks and iTunes U videos. I&amp;rsquo;ll post about iTunes U later.&lt;/p&gt;&#xA;&lt;p&gt;TED talks, for the uninitiated, are 5-20 minute lectures on something that someone(usually a researcher or philanthropist) has been working on to make the world a better or cooler place. I&amp;rsquo;ve been watching them the last few days, and they&amp;rsquo;re really great for hearing an opinion you might not, otherwise. A few of my favorites, in no particular order:&lt;/p&gt;</description>
    </item>
    <item>
      <title>What could you possibly do with mathematics?</title>
      <link>https://traviscj.com/blog/post/2009-08-24-what_could_you_possibly_do_with_mathematics/</link>
      <pubDate>Mon, 24 Aug 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-08-24-what_could_you_possibly_do_with_mathematics/</guid>
      <description>&lt;p&gt;Recently, at a family gathering, I was confronted by the question many a college graduate is faced after telling someone I had majored in mathematics for my now-finished college degree: &amp;ldquo;But how are you going to make any money at that?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Now, certainly it&amp;rsquo;s true: Graduate students don&amp;rsquo;t make that much. The average stipend for a grad student is roughly on par with (but still less than) unemployment checks. But that&amp;rsquo;s okay&amp;ndash;in general, mathematicians know that they could make money other places, but they chose it anyways because of their love for the subject. Not that mathematicians make &lt;!-- raw HTML omitted --&gt;too&lt;!-- raw HTML omitted --&gt; bad of money anyway: The average in the US is about 50K, with associate professors making more than that. The particularly salary-inclined could pick up other credentials to become actuaries or work in hedge funds.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Goodbye, Walter Cronkite</title>
      <link>https://traviscj.com/blog/post/2009-07-24-goodbye_walter_cronkite/</link>
      <pubDate>Fri, 24 Jul 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-07-24-goodbye_walter_cronkite/</guid>
      <description>&lt;p&gt;I am in no way qualified to write a proper goodbye to the late Mr. Cronkite&amp;ndash;him having retired a half-decade before I was born&amp;ndash;but I have the greatest respect for the man, and wish in a lot of ways that I could have been around for it. On the other hand, reviewing videos of his newscasts, what strikes me is the massive impact and bleakness of many of these newscasts and how that contrasts with the emptiness of many more recent newscasts that I can recall. So most of my wistfulness revolves around our shared interest in spaceflight, his reporting obsession and a large source of my own scientific curiosity. I couldn&amp;rsquo;t say it better than Couric&amp;rsquo;s memorial commentary, which posited &amp;lsquo;It&amp;rsquo;s a measure of the man that he preferred the triumph of the space program to the despair in so much of the news,&amp;rsquo; and that is certainly the way it was.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blog Segregation</title>
      <link>https://traviscj.com/blog/post/2009-07-21-blog_segregation/</link>
      <pubDate>Tue, 21 Jul 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-07-21-blog_segregation/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m slowly feeling more and more that I want some more compartments in my blogging. I&amp;rsquo;ve been thinking about stuff I want to blog, and stuff I don&amp;rsquo;t want to blog, and invariably they tend to get filed in both places. For example, I&amp;rsquo;d like to move toward a  more professional blog that I could talk about my research, papers I&amp;rsquo;ve been reading, web sites I&amp;rsquo;ve found interesting, course projects, professional meetings, etc.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wiki Problems</title>
      <link>https://traviscj.com/blog/post/2009-07-21-wiki_problems/</link>
      <pubDate>Tue, 21 Jul 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-07-21-wiki_problems/</guid>
      <description>&lt;p&gt;I really like the idea of having a wiki website. It&amp;rsquo;s great to be able to share documents really easily, be able to edit stuff without logging in, track changes you&amp;rsquo;ve made, and so on.&lt;/p&gt;&#xA;&lt;p&gt;I have also tried quite a few wiki setups, including MediaWiki(mostly at a job a while back and a spectacular success), MoinMoin, and PmWiki. However, each of them fell flat in a certain annoying way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MySQLdb module in Python on Ubuntu</title>
      <link>https://traviscj.com/blog/post/2009-05-30-mysqldb_module_in_python_on_ubuntu/</link>
      <pubDate>Sat, 30 May 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-05-30-mysqldb_module_in_python_on_ubuntu/</guid>
      <description>&lt;p&gt;To install the mysqldb module in python on Ubuntu:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get install python-mysqldb&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>A Quick MySQL Reference</title>
      <link>https://traviscj.com/blog/post/2009-05-27-a_quick_mysql_reference/</link>
      <pubDate>Wed, 27 May 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-05-27-a_quick_mysql_reference/</guid>
      <description>&lt;p&gt;I got frustrated with not being able to write MySQL because I don&amp;rsquo;t do it often enough to be seeing it in my nightmares like MATLAB. But recently my datasets got annoyingly huge and it seemed like SQL might be a boon to me. So I set out to write a quick little program, and ended up writing this little reference along the way.&lt;/p&gt;&#xA;&lt;p&gt;Also, Sharvil Shah contributed some comments to it, so thanks to him for that!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Netlib</title>
      <link>https://traviscj.com/blog/post/2009-05-27-netlib/</link>
      <pubDate>Wed, 27 May 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-05-27-netlib/</guid>
      <description>&lt;p&gt;Wow. &lt;a href=&#34;http://www.netlib.org/&#34;&gt;Just wow.&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Northwestern University</title>
      <link>https://traviscj.com/blog/post/2009-04-19-northwestern_university/</link>
      <pubDate>Sun, 19 Apr 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-04-19-northwestern_university/</guid>
      <description>&lt;p&gt;I finally committed to graduate school a few weeks ago. I&amp;rsquo;ll be headed to &lt;a href=&#34;http://www.northwestern.edu/&#34;&gt;Northwestern University&lt;/a&gt; in Evanston, IL for the [Engineering Sciences and Applied Mathematics]](&lt;a href=&#34;http://esam.northwestern.edu&#34;&gt;http://esam.northwestern.edu&lt;/a&gt;) department.&lt;/p&gt;&#xA;&lt;p&gt;I really enjoyed both the visit at University of North Carolina and Northwestern the week before last. But I think I could like Chicagoland quite a lot, so I guess that&amp;rsquo;s where I&amp;rsquo;m headed!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Found - Wordpress Spam Virus in Theme files</title>
      <link>https://traviscj.com/blog/post/2009-04-01-found_wordpress_spam_virus_in_theme_files/</link>
      <pubDate>Wed, 01 Apr 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-04-01-found_wordpress_spam_virus_in_theme_files/</guid>
      <description>&lt;p&gt;Almost a month ago, I was helping &lt;a href=&#34;http://www.jdbeals.com/blog&#34;&gt;my good buddy Beals&lt;/a&gt; get his Wordpress website set up. On looking close, I noticed something a little weird in a theme he had found(NOT Wordpress proper, to be clear):&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;D-69-91-134-36:black-abstract-20 tjohnson$ ls -alh *&#xA;-rw-r--r--  1 tjohnson staff  528 2008-07-24 08:35 404.php&#xA;-rw-r--r--  1 tjohnson staff 3.9K 2008-07-24 08:35 comments.php&#xA;-rw-r--r--  1 tjohnson staff 8.0K 2008-10-22 20:44 footer.php&#xA;-rw-r--r--  1 tjohnson staff  871 2008-10-22 10:10 functions.php&#xA;[more removed here]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see, the footer and functions files are both modified much more recently than every other file, which seemed strange to me. So I took a look at the file:&lt;/p&gt;</description>
    </item>
    <item>
      <title>TiVo Router Project</title>
      <link>https://traviscj.com/blog/post/2009-03-01-tivo_router_project/</link>
      <pubDate>Sun, 01 Mar 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-03-01-tivo_router_project/</guid>
      <description>&lt;p&gt;My girlfriend&amp;rsquo;s TiVo only has an ethernet port. Well, technically, it only has a USB port. We went looking for a TiVo compatible Wifi adapter but were less than successful. We did manage to find a USB-ethernet converter at Fry&amp;rsquo;s Electronics, though. But this means it requires a machine there to bridge from Wireless to the wired port, which is a bit of a hassle on her Windows Vista laptop(though, honestly, what isn&amp;rsquo;t a pain in Vista? &amp;lt;/soapbox&amp;gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mission Graduate School -- Success</title>
      <link>https://traviscj.com/blog/post/2009-02-25-mission_graduate_school_success/</link>
      <pubDate>Wed, 25 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-02-25-mission_graduate_school_success/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve officially been accepted to two PhD applied math programs: Northwestern and University of North Carolina. I&amp;rsquo;ve also been accepted to the Masters of Science program at the University of Washington. Both of the PhD offers came with full fellowship offers(at least for the first year), which basically means that I just need to go and give them the best bang for their buck with my brainpower for five years, and then I&amp;rsquo;ll have my PhD. Awesome. All three schools are outstanding and have amazing faculty, as best as I can tell.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GenHosts</title>
      <link>https://traviscj.com/blog/post/2009-02-24-genhosts/</link>
      <pubDate>Tue, 24 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-02-24-genhosts/</guid>
      <description>&lt;p&gt;Winter quarter 08, the hosts.allow files used by tcpwrappers was getting unwieldy. For one thing, we had certain groups of hosts that were all allowed to connect to eachother anywhere, some groups that were only allowed one port on one computer, some that were allowed certain parts of machines. It was basically a mess to try and keep up with it. So I wrote a set of scripts to let us update one place and have it synchronize everywhere else, all in very simple XML files.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graduate School Applications and Microsoft</title>
      <link>https://traviscj.com/blog/post/2009-02-09-graduate_school_applications_and_microsoft/</link>
      <pubDate>Mon, 09 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-02-09-graduate_school_applications_and_microsoft/</guid>
      <description>&lt;p&gt;I finally finished graduate school applications last weekend. I applied to University of Washington, University of North Carolina, Northwestern, University of Colorado, and University of Nevada. It&amp;rsquo;s a lot of work getting a bunch of applications out like that: I definitely underestimated it. Hopefully my personal statement measured up to the letters of recommendation that people wrote for me.&lt;/p&gt;&#xA;&lt;p&gt;I also ended up having an interview with Microsoft that week, just to add a bit to the stress there. It actually went fairly well, though I haven&amp;rsquo;t heard back on the round-two interview yet. They said it would be a while though.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Hint for Foreign ATM Machines</title>
      <link>https://traviscj.com/blog/post/2009-02-09-my_hint_for_foreign_atm_machines/</link>
      <pubDate>Mon, 09 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-02-09-my_hint_for_foreign_atm_machines/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been meaning to write this tip up for quite a while, but now that I&amp;rsquo;ve finally gotten some closure on it, I guess now would be a decent time. While I was in Brazil, there were two ATM machine clusters across the street from eachother, both between the beach and the hostel we were staying at. The CITIbank ATMs were more reliable, but the HSBC ATMs were a bit cheaper. At first, it always seemed worth the small extra, but since I never wanted to get much out at a time, I was racking up the bank charges. Also, several people had been using the HSBC ATM without issue, so I figured I would start using that one instead as well. This worked well the first couple of times, but one of the days I went in to get some cash out, it didn&amp;rsquo;t dispense. Undeterred, I went to one of the ATM machines someone else had just (successfully) used and tried there, and withdrew the money. This time it worked.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HMCP Set, TextMate, and RoR 2.0</title>
      <link>https://traviscj.com/blog/post/2009-02-06-hmcp_set_textmate_and_ror_2.0/</link>
      <pubDate>Fri, 06 Feb 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-02-06-hmcp_set_textmate_and_ror_2.0/</guid>
      <description>&lt;p&gt;I found a great little LaTeX homework layout for typesetting math homeworks a while back, and I&amp;rsquo;ve meant to write it up for quite a while. It&amp;rsquo;s from Harvey Mudd College&amp;rsquo;s Mathematics Department, engineered to automatically satisfy the department guidelines on how homeworks should be laid out. They also have thesis and poster templates, but the homework installation proceedures and sty files are located on the &lt;a href=&#34;http://www.math.hmc.edu/computing/support/tex/classes/hmcpset/&#34;&gt;Homework Class&lt;/a&gt; page. Their website also has extensive information on their computer resources. While basically useless for anyone not at Harvey Mudd, it is a model for how this sort of website should look. Everything is clearly detailed at the perfect level, along with suggestions not just for how to do certain tasks, but also when you might want to do something.&lt;/p&gt;</description>
    </item>
    <item>
      <title>David Liff is a Master</title>
      <link>https://traviscj.com/blog/post/2009-01-30-david_liff_is_a_master/</link>
      <pubDate>Fri, 30 Jan 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-01-30-david_liff_is_a_master/</guid>
      <description>&lt;p&gt;Life is keeping me so crazy that I should not be taking the time to write this, but posting a link here was irresistable. David Liff is an amazing photographer. I think the best comment on that page(if you can make it to the bottom without running out and buying a plane ticket to one of these places) is &amp;ldquo;Your photos have more life than the subjects themselves!&amp;rdquo;. Wikipedia, you may be proud. David Liff, thank you.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Do Math and Izhikevich</title>
      <link>https://traviscj.com/blog/post/2009-01-06-why_do_math_and_izhikevich/</link>
      <pubDate>Tue, 06 Jan 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-01-06-why_do_math_and_izhikevich/</guid>
      <description>&lt;p&gt;Professor Eric Shea-Brown has written up a nice website explaining what we&amp;rsquo;re doing with the computational neuroscience modeling. It&amp;rsquo;s currently on the Why Do Math website at this link: &lt;a href=&#34;http://dev.whydomath.org/node/HHneuro/index.html&#34;&gt;Brain Dynamics: The Mathematics of the Spike&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For my project, we&amp;rsquo;re starting with a simpler model that is similar in behavior but quicker computationally and (somewhat) easier to analyze mathematically, known as the Izhikevich model(after its creator, Eugene Izhikevich). His website has some amazingly cool videos and a lot of papers on what he&amp;rsquo;s been doing.&#xA;&lt;a href=&#34;http://vesicle.nsi.edu/users/izhikevich/&#34;&gt;His Website&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graduate School Applications</title>
      <link>https://traviscj.com/blog/post/2009-01-02-graduate_school_applications/</link>
      <pubDate>Fri, 02 Jan 2009 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2009-01-02-graduate_school_applications/</guid>
      <description>&lt;p&gt;I am finally getting around to starting my graduate school applications.. and overall having a lot of fun with them. The places I&amp;rsquo;m applying to are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;University of Washington, Seattle&lt;/li&gt;&#xA;&lt;li&gt;Northwestern, Evanston&lt;/li&gt;&#xA;&lt;li&gt;University of North Carolina, Chapel Hill&lt;/li&gt;&#xA;&lt;li&gt;University of Colorado, Boulder&#xA;I&amp;rsquo;ve got my UW Seattle application about half done, and just starting the other ones.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The UW has apparently gotten my full GRE scores, because they are now reporting them through the unofficial transcript interface. I don&amp;rsquo;t quite recall where I sent them already.. I&amp;rsquo;ll probably get that going soon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Computer Ressurection and Elastic Cloud Experimentation</title>
      <link>https://traviscj.com/blog/post/2008-11-29-computer_ressurection_and_elastic_cloud_experimentation/</link>
      <pubDate>Sat, 29 Nov 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-11-29-computer_ressurection_and_elastic_cloud_experimentation/</guid>
      <description>&lt;p&gt;I was home on Thanksgiving Break with Sharvil, and we decided to revive some old computers. Partly I&amp;rsquo;d like to experiment with some clustering stuff without incurring CPU time at the AMATH department or Teragrid stuff I&amp;rsquo;m likely gonna be working on soon with Shea-Brown&amp;rsquo;s neuroscience research. So, it turns out I resurrected about 5-6 old computers(final tally is still waiting on the number of successful Xubuntu installs on them, among other practical issues(where the hell am I going to put six computers&amp;hellip;?): The very first computer I built(a P3 450), P3 700, Dual P2 266, a couple of AMD64 3200&amp;rsquo;s, and a Sony Vaio P3 733. The cool thing is that the neuron spiking models are basically embarassingly parallel(well, each run isn&amp;rsquo;t necesarily, but from what I&amp;rsquo;ve gathered so far, we&amp;rsquo;re looking for averages over a bunch of them. So, sweet! Again, this would be terrible for actual research, especially against something like TG or even Amazon&amp;rsquo;s EC2&amp;ndash;which is another thing I really need to check out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fame and FORTRAN</title>
      <link>https://traviscj.com/blog/post/2008-11-08-fame_and_fortran/</link>
      <pubDate>Sat, 08 Nov 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-11-08-fame_and_fortran/</guid>
      <description>&lt;p&gt;I must be getting more popular on some search engines somewhere. I just got six random comment-spam messages. Awesome. I guess that&amp;rsquo;s why the more important bloggers have come to rely on Bayesian filters and soforth for taming the wild flow of spam. Hopefully that trend doesn&amp;rsquo;t continue.&lt;/p&gt;&#xA;&lt;p&gt;Also, it seems as though I am now learning FORTRAN. I&amp;rsquo;m sortof starting working with Eric Shea-Brown on some Neuroscience research, working with HPC on NSF&amp;rsquo;s Teragrid. It&amp;rsquo;s pretty exciting stuff, and I&amp;rsquo;m really excited about getting moving on it. Anyways, back to FORTRANizing, I suppose.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Boom De Yada</title>
      <link>https://traviscj.com/blog/post/2008-10-31-boom_de_yada/</link>
      <pubDate>Fri, 31 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-31-boom_de_yada/</guid>
      <description>&lt;p&gt;I think I&amp;rsquo;ve already told most of my friends about this&amp;hellip; but it&amp;rsquo;s just way too awesome to not have documented somewhere. Doubly-pronged awesomeness, actually:&#xA;- The &lt;a href=&#34;http://www.youtube.com/watch?v=at_f98qOGY0&#34;&gt;Discovery Channel&amp;rsquo;s Boom De Yada&lt;/a&gt; video.&#xA;- XKCD&amp;rsquo;s &lt;a href=&#34;http://www.xkcd.com/442&#34;&gt;Boom De Yada&lt;/a&gt; comic strip&#xA;always makes my day that much better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Happy Birthday to Me, Pt. 2</title>
      <link>https://traviscj.com/blog/post/2008-10-28-happy_birthday_to_me_pt_2/</link>
      <pubDate>Tue, 28 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-28-happy_birthday_to_me_pt_2/</guid>
      <description>&lt;p&gt;As always, a picture&amp;rsquo;s worth a thousand words:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;osx_upgraded_memory.png&#34; alt=&#34;upgrade to 4gb&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting an AMATH Minor at the University of Washington</title>
      <link>https://traviscj.com/blog/post/2008-10-26-getting_an_amath_minor_at_the_university_of_washington/</link>
      <pubDate>Sun, 26 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-26-getting_an_amath_minor_at_the_university_of_washington/</guid>
      <description>&lt;p&gt;One of the secret gems at the University of Washington is the minor in applied math option. At least I think it&amp;rsquo;s somewhat secret. Most of the people I tell about it haven&amp;rsquo;t really heard of it. But yeah, here&amp;rsquo;s the deal: You only need to get through calculus and four more classes to get this minor! And a lot of programs require calculus anyways. I&amp;rsquo;ve taken most of the undergrad AMATH courses, so I figured I&amp;rsquo;d write something up about which ones I recommend the most.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Happy Birthday To Me</title>
      <link>https://traviscj.com/blog/post/2008-10-26-happy_birthday_to_me/</link>
      <pubDate>Sun, 26 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-26-happy_birthday_to_me/</guid>
      <description>&lt;p&gt;I should have written this up sooner, but I guess it worked out well because the last of it didn&amp;rsquo;t happen until just recently.&lt;/p&gt;&#xA;&lt;p&gt;My friends did a fantastic job of throwing me one hell of a birthday this year. Beals made it up a little bit early to begin the celebrations with food and manly stuff. Then Katie and I had a joint birthday dinner at Boca de Beppos. Tuesday Sharvil and I made it out for a while. Wednesday we had a nice dinner at Shultzy&amp;rsquo;s, though they&amp;rsquo;re kindof in the doghouse for the service that night. Thursday Jackie took me out to Sonrisa, which was absolutely delicious. And finally, Friday night Jackie gathered up a bunch of the Brazil crowd into Finn MacCools, and it was absolutely wonderful to see them all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart People Shows</title>
      <link>https://traviscj.com/blog/post/2008-10-26-smart_people_shows/</link>
      <pubDate>Sun, 26 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-26-smart_people_shows/</guid>
      <description>&lt;p&gt;Sharvil and I started watching Numb3rs today, from the pilot episode. We both basically decided that it&amp;rsquo;s really nice to watch shows that are sortof motivational in a way. Admittedly, they&amp;rsquo;re mostly designed to motivate you to watch more shows&amp;hellip; but I think Numb3rs has been an important show for me, if for no reason other than motivating me to keep working on stuff when I&amp;rsquo;d rather not or when I&amp;rsquo;m nearly too frustrated to keep going. (I have been watching it for a couple years now, if that wasn&amp;rsquo;t obvious). Anyways, it&amp;rsquo;s usually worth the Numbers Painfully Awkward Lines and just general cheesiness and admittedly odd scenes. (Look up Numb3rs on &lt;a href=&#34;http://www.recapist.com/tv-shows/numb3rs&#34;&gt;TheRecapist&lt;/a&gt; and prepare to giggle a bit.) And it turns out a fair bit of the math is pretty legit, even if usually the equations he&amp;rsquo;s writing on the boards are sortof generic and not necesarily what he&amp;rsquo;s talking about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A few more exotic uses for older hardware</title>
      <link>https://traviscj.com/blog/post/2008-10-22-a_few_more_exotic_uses_for_older_hardware/</link>
      <pubDate>Wed, 22 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-22-a_few_more_exotic_uses_for_older_hardware/</guid>
      <description>&lt;p&gt;There are tons of posts on the internet about what to do with older computers. In general, they say some of the same things: Linux/Firewall, Media Server, and &amp;lsquo;BitTorrent Box&amp;rsquo;. (Incidentally, the lattermost somewhat confuses me. I guess people want to download files on a separate machine in case it has viruses or whatever&amp;hellip; but if you&amp;rsquo;re using bit torrent so much that it&amp;rsquo;s worth having a separate box for, you&amp;rsquo;re probably still gonna be upset if a virus takes it out. Or you could just use antivirus or an alternative OS. But I digress.) Anyways, for the uses I&amp;rsquo;ll outline here I&amp;rsquo;m going to assume that you (at least roughly) fit into the prototype of &amp;lsquo;I have a pretty decent computer sitting around that never really gets used.&amp;rsquo; In my case, I tend to upgrade and want to keep the old one around because it&amp;rsquo;s still a pretty decent computer, but want to use the newer one for bigger and better things. Like reading xkcd and refreshing google news over and over again. Heh.&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>
    <item>
      <title>Minor OS X Shell Shortcomings</title>
      <link>https://traviscj.com/blog/post/2008-10-19-minor_os_x_shell_shortcomings/</link>
      <pubDate>Sun, 19 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-19-minor_os_x_shell_shortcomings/</guid>
      <description>&lt;p&gt;In spite of the fact that a lot of people seem to loathe the colorized ls functionality, I sortof grew up on it(so to speak). OS X, by default, does not have this functionality(well, at least, GNU&amp;rsquo;s &amp;ndash;color option never works). I figured the quick and easy way to solve this was to install coreutils, but I found another option. It appears OSX included a version of ls that works with ls -G. The coreutils one is (by it&amp;rsquo;s virtue as a GNU tool) probably more feature-driven, but realiasing it as&lt;/p&gt;</description>
    </item>
    <item>
      <title>Themes!</title>
      <link>https://traviscj.com/blog/post/2008-10-15-themes/</link>
      <pubDate>Wed, 15 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-15-themes/</guid>
      <description>&lt;p&gt;In all of my time with wordpress, I&amp;rsquo;ve pretty much stuck to the default themes, figuring that what I had to say was a bit more important than what I was doing with it. But then I came across one with some fluid dynamics going on&amp;hellip; and I couldn&amp;rsquo;t pass it up. Maybe someday I&amp;rsquo;ll get around to throwing some of my own graphics up there, hehe. Enjoy!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Backposts Galore!</title>
      <link>https://traviscj.com/blog/post/2008-10-14-backposts_galore/</link>
      <pubDate>Tue, 14 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-14-backposts_galore/</guid>
      <description>&lt;p&gt;Like I said in &amp;lsquo;~traviscj/ lives!&amp;rsquo;, I was stupid and forgot the hard drives with my websites on them at home. But&amp;hellip;.. Google Cache came through and I just pulled all my posts from that. The big downside is that there&amp;rsquo;s now definitely going to be some weirdness with overlapping posts and soforth, which is a pain, but I&amp;rsquo;m not really sure how to get around it, other than just waiting until I can get the data off the disks again.&#xA;So, if you came across my page from an old link, you probably won&amp;rsquo;t see what you&amp;rsquo;re expecting, at least until Google Cache re-pulls everything. I don&amp;rsquo;t think too many people have linked to me, which is actually a good thing this once, I guess. In any case, I have the dates, titles, and posts. Sorry I lost your comments, feel free to re-comment at will!&lt;/p&gt;</description>
    </item>
    <item>
      <title>traviscj lives!</title>
      <link>https://traviscj.com/blog/post/2008-10-13-traviscj_lives/</link>
      <pubDate>Mon, 13 Oct 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-10-13-traviscj_lives/</guid>
      <description>&lt;p&gt;I finally got my blog running again. I don&amp;rsquo;t have the old data&amp;hellip; oops. Forgot it at home. But in the mean time, at least I&amp;rsquo;m hosted again!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mugged!</title>
      <link>https://traviscj.com/blog/post/2008-08-24-mugged/</link>
      <pubDate>Sun, 24 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-24-mugged/</guid>
      <description>&lt;p&gt;Friday started off a pretty decent day in Brazil. I finally got comfortable enough with my phrase book to start busting out phrases to the Taxi driver and it ended up making our taxi rides a fair bit more comfortable, quicker, and cheaper. So, there’s one place that Portuguese is coming in really handy, even if it is even just a tiny bit of it. It’s getting a lot more comfortable interacting with the native Brazilians here, probably for all of us, but it was pretty pronounced today, and I was feeling pretty good about it. I had intended to get some pictures at IMPA, so I happened to have my camera today.&lt;/p&gt;</description>
    </item>
    <item>
      <title>More Updates from Rio</title>
      <link>https://traviscj.com/blog/post/2008-08-22-more_updates_from_rio/</link>
      <pubDate>Fri, 22 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-22-more_updates_from_rio/</guid>
      <description>&lt;p&gt;Sorry for not getting this updated a little bit sooner, but it has been an eventful week sortof. Apparently it’s been almost a week! Time flies, apparently.&lt;/p&gt;&#xA;&lt;p&gt;Wednesday was pretty standard. More classes, more modeling, more cool climate stuff. IMPA has pretty good coffee for free on supply until 4pm, and all of us Seattlites are pretty much living on it, and on the verge of staging a coup when they try to shut it down. There are currently a bunch of very fun, very loud Irish guys outside the 9-bed dorm room, so everyone in our room is pretty sleep deprived. Hence the coffee addiction. We also finally formalized some ‘cab groups’, or a set of people we’re going to share taxis with for all the taxi rides we’re taking to and from IMPA and other places around Rio.&lt;/p&gt;</description>
    </item>
    <item>
      <title>First Couple of Days in Rio</title>
      <link>https://traviscj.com/blog/post/2008-08-20-first_couple_of_days_in_rio/</link>
      <pubDate>Wed, 20 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-20-first_couple_of_days_in_rio/</guid>
      <description>&lt;p&gt;So Monday morning was really lazy. Some people went to get a volleyball, a bunch went down to the beach again, and I let my sunburn cool off. It was also really warm and sunny, which is a nice change from Seattle! We left for IMPA around 2, got on taxis to get over there, and eventually made it. The taxi drivers are apparently pretty vicious. We took 5 cabs, 3 got charged around 15, one around 20, and one 25. So they try to rip you off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>IN BRAZIL</title>
      <link>https://traviscj.com/blog/post/2008-08-18-in_brazil/</link>
      <pubDate>Mon, 18 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-18-in_brazil/</guid>
      <description>&lt;p&gt;I finally made it to Brazil. It was a very long and tiring flight, but I was seated next to a couple of very nice locals that fed me all sorts of useful information. I ended up pre-buying a ticket from the Taxi company, but apparently this is sortof a bad call, because they way overcharge if you don’t have them use the meter. Anyways, not too big of a deal. He took me right up to the hostel, and a bunch of familiar faces were there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In Atlanta</title>
      <link>https://traviscj.com/blog/post/2008-08-17-in_atlanta/</link>
      <pubDate>Sun, 17 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-17-in_atlanta/</guid>
      <description>&lt;p&gt;Well, I made it at least as far as Atlanta. The Boeing 757 we flew in had touchscreens in each monitor that told me I’ve traveled 2326 miles so far. Landing was pretty smooth, and the flight was relatively easy. A bit longer than I’d expected, and a little bit more restless than I’d hoped.&lt;/p&gt;&#xA;&lt;p&gt;I stopped to get some food immediately on arriving, somewhere called Krystal Hamburger. They have a Sausage Scramble Combo, a cup full of scrambled eggs, sausage, and grits! How awesome.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Whack it with an X squared!</title>
      <link>https://traviscj.com/blog/post/2008-08-07-whack_it_with_an_x_squared/</link>
      <pubDate>Thu, 07 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-07-whack_it_with_an_x_squared/</guid>
      <description>&lt;p&gt;David and I were working on our Math381 model, and I was getting frustrated because the data we collected and the results from the simulation were not lining up properly, which was quite frustrating. We were hoping to see something like this:&lt;/p&gt;&#xA;&lt;p&gt;Number of Logins from Data&lt;/p&gt;&#xA;&lt;p&gt;Instead, we were getting stuff distributed like this:&lt;/p&gt;&#xA;&lt;p&gt;Simulated Number of Logins&lt;/p&gt;&#xA;&lt;p&gt;I realized that we needed some function to force a bunch of this junk further left. Recalling an old adage from Mr. Cone’s AP Chemistry class, I decided it was the right time to whack it with an X squared. This is vaguely appropriate, because rand() has a range [0,1), so squaring it should put a whole bunch of stuff further right, but not everything(ie, the first half will end up in the first quarter, the first 3/4 will end up in the first 9/16, etc). Imagine my shock when I saw this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>iPhone 2.0 - Impressions and Favorites</title>
      <link>https://traviscj.com/blog/post/2008-08-05-iphone_2.0_-_impressions_and_favorites/</link>
      <pubDate>Tue, 05 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-05-iphone_2.0_-_impressions_and_favorites/</guid>
      <description>&lt;p&gt;I know that about every other iPhone owner has posted to their blog about this and almost a month ago already, but I’ll throw my own take into the mix.&lt;/p&gt;&#xA;&lt;p&gt;I originally planned on waiting a while before installing the second major revision of the iPhone software, but Sharvil tried it almost immediately and told me that I needed to give it a shot. So, I finally upgraded it, and have not been disappointed. Some highlights:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Johnson vs Acronis, Pt 2</title>
      <link>https://traviscj.com/blog/post/2008-08-04-johnson_vs_acronis_pt_2/</link>
      <pubDate>Mon, 04 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-04-johnson_vs_acronis_pt_2/</guid>
      <description>&lt;p&gt;Some more ways Acronis fails, just for the record:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Completely useless log files. Error messages are crucial in applications. Acronis says ‘Error creating file’. This could mean:&lt;/li&gt;&#xA;&lt;li&gt;I couldn’t resolve the FTP server’s hostname&lt;/li&gt;&#xA;&lt;li&gt;I could resolve the hostname, but could not connect to the FTP port&lt;/li&gt;&#xA;&lt;li&gt;I could resolve the hostname and connect, but I could not authenticate.&lt;/li&gt;&#xA;&lt;li&gt;I could resolve, connect, authenticate, but I could not create a new file.&lt;/li&gt;&#xA;&lt;li&gt;Any number of other things. I could not create a temporary file(Why? No permissions in Acronis’s temporary folder?  No hard drive space? It already exists? The folder that should be the temporary folder doesn’t exist?)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Another error we’ve gotten a few times is ‘Failed to process pair script (some hash).’ While it might be useful to someone, it’s not really any help. A lot of the same stuff applies: Is the file corrupt? What’s wrong with it? Improper syntax? The configuration files are XML, they should be editable as such. Point being: Acronis, get your stuff together and write some real, honest error checking code. It’s boring code to write, but it’s boilerplate stuff, and basic. This is what you hire interns for. Please do so.&#xA;2. The GUI stinks. Everything is wizard based. This in itself isn’t so much of a problem, but it becomes one with their absolute awful support of stuff like, oh, say, remembering passwords. To see how this is an issue: Say I realize that I want maximum encryption on my backup archives. So, I load up the tasks list, click the one I want to change, click the ‘changed settings’ button. It asks me what I want to backup(2-3 screens), then where I want to back it up to. I tell it the FTP site, and it asks me for my login for that site, then allows me to navigate(keep in mind this is already stored in the configuration file I’m trying to edit, in some encrypted form(hopefully, though I would not bet 2bits on it)). Then, it asks me if I want to sign in to the FTP anonymously or use a username and password. Upon selecting non-anonymously, it asks me for the same username and password. Every single time you try to change any part of the configuration.&#xA;3. The command line stinks. There are just a couple of commands, including trueimagecmd and trueimagemnt, but both of them are completely inconsistant on file argument parsing: trueimagemnt uses the more standard UNIX conventions of [-(shortopt)|–(longopt)] (arg) while trueimagecmd uses the completely zany –(longopt):(arg). The command trueimagecmd allows a –verify command, but doesn’t include it in the runtime help or the manual page. None of this seems like too big of a deal, but Acronis is basically the only program that we actual require any GUI at all for on 2 of our 4 main servers. It’d be very nice to have backups and not need a GUI.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Final Pre-trip Brazil Updates</title>
      <link>https://traviscj.com/blog/post/2008-08-03-final_pre-trip_brazil_updates/</link>
      <pubDate>Sun, 03 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-03-final_pre-trip_brazil_updates/</guid>
      <description>&lt;p&gt;I have been meaning to write for almost two weeks that I’ve got my Visa back from the Brazilian Consulate in San Francisco, which is pretty cool. I saw a picture of it and it looks really sweet. I’m slowly turning into a world traveler! It took about a week inside the consulate, then they FedEx Next Day Air’d it to Memphis, then Spokane, then the Tri-Cities, then Prosser. They dropped it off with Mom.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Johnson vs Acronis</title>
      <link>https://traviscj.com/blog/post/2008-08-02-johnson_vs_acronis/</link>
      <pubDate>Sat, 02 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-08-02-johnson_vs_acronis/</guid>
      <description>&lt;p&gt;The story goes something like this: Originally, we used external hard drives plugged in via USB to our servers to back up our servers. This worked well, except that we had two external drives and 7 servers. About this time I started working this job and immediately set up a MediaWiki website for storing documentation and a Mantis Bug Tracker website for storing information about ongoing projects–I think I’ll try to write a post about that at some point as well. Anyways, these two websites originally ran on my personal webserver in Prosser, but we decided to run them on a company-owned server instead, and that this new machine could act as both a backup server and a webserver for those two websites.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dijkstra&#39;s Algorithm Paper</title>
      <link>https://traviscj.com/blog/post/2008-07-30-dijkstras_algorithm_paper/</link>
      <pubDate>Wed, 30 Jul 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-07-30-dijkstras_algorithm_paper/</guid>
      <description>&lt;p&gt;The week before my sister’s wedding, I was tasked with writing a paper on Dijkstra’s Algorithm for my Discrete Mathematical Modeling class. I think I might have missed the mark a little bit, but I had so much fun writing it that I’m posting it here.&lt;/p&gt;&#xA;&lt;p&gt;I’m almost considering writing some more stuff in this style… anything anyone would like to see written about?&lt;/p&gt;&#xA;&lt;p&gt;Here’s a link: Dijkstra’s Algorithm&lt;/p&gt;</description>
    </item>
    <item>
      <title>Of Weddings and Best Men</title>
      <link>https://traviscj.com/blog/post/2008-07-15-of_weddings_and_best_men/</link>
      <pubDate>Tue, 15 Jul 2008 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-07-15-of_weddings_and_best_men/</guid>
      <description>&lt;p&gt;This past weekend I had the honor of being the Best Man at my sister Crystal’s wedding. It was a beautiful wedding at Silverlake Winery in Zillah, WA. I highly recommend it to anyone looking for a pretty spot like that, and it was definitely adequate for our relatively small 120 person party. Also, the wine was excellent. I enjoyed their Chenin Blanc most of the night, though I tried everything about twice, and ended up going home with some of their Reserve Chardonnay.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PHP Vulnerability Checklist</title>
      <link>https://traviscj.com/blog/post/2008-07-10-php_vulnerability_checklist/</link>
      <pubDate>Thu, 10 Jul 2008 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-07-10-php_vulnerability_checklist/</guid>
      <description>&lt;p&gt;Ray(the boss) and I were chatting about how we should implement our secure upload page. The way it should work is, an IP is added to the genhosts database, it sets up a 5 minute wait, and at the end of five minutes, redirects to the data upload page, at which point the computer is allowed to connect, since the new IP has propogated into /etc/hosts.allow(via a cronjob that takes MySQL entries and parses them(via HTTP and XML) into the standard /etc/hosts.allow format). It’s basically working, but we’re having a bunch of trouble getting IE and Firefox to redirect, since IE apparently detects my window.location.href and location.replace calls as popups, and blocks them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NSA&#39;s RHEL5 Guide</title>
      <link>https://traviscj.com/blog/post/2008-07-07-nsas_rhel5_guide/</link>
      <pubDate>Mon, 07 Jul 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-07-07-nsas_rhel5_guide/</guid>
      <description>&lt;p&gt;One of my tasks at work is to write up a security checklist of sorts, and from one of Ryan’s notes, I happened across the NSA’s Red Hat Enterprise Linux 5 guide. It’s pretty cool and covers basically everything. &lt;a href=&#34;http://www.nsa.gov/snac/os/redhat/rhel5-guide-i731.pdf&#34;&gt;Have a look&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Odegaard Copy Center</title>
      <link>https://traviscj.com/blog/post/2008-06-23-odegaard_copy_center/</link>
      <pubDate>Mon, 23 Jun 2008 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-06-23-odegaard_copy_center/</guid>
      <description>&lt;p&gt;This is going to be sortof a short post with not much worldwide applicability, but I just learned a couple of weeks ago that Odegaard’s Copy Center will bind a packet of papers for fairly cheap, it turns out. They do it with a clear front cover and a back cover of your choice, plus binding you pick out from their samples. They do it while you wait and have good hours. I had no idea they offered this service, and was very impressed with their output.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Firefox PDF on OSX</title>
      <link>https://traviscj.com/blog/post/2008-06-22-firefox_pdf_on_osx/</link>
      <pubDate>Sun, 22 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-06-22-firefox_pdf_on_osx/</guid>
      <description>&lt;p&gt;June 3 was a fantastic day, though I didn’t know it at the time. The reason? My biggest bitch about Firefox has finally been fixed. The big problem is that Firefox’s OSX program has the default behavior of saving PDFs to Desktop and starting Preview with it. Which isn’t a huge problem, except that if you download the file several times, it just downloads a file with -N appended. This is sortof a pain because in college a lot of teachers call files hw5.pdf, which means that I pretty much have to go to the website each time, or look through about 5 files each time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Skeletool CX</title>
      <link>https://traviscj.com/blog/post/2008-06-21-skeletool_cx/</link>
      <pubDate>Sat, 21 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-06-21-skeletool_cx/</guid>
      <description>&lt;p&gt;So, I finally got fed up with never having a screwdriver when I needed it unexpectedly. Perhaps this was due to the recent MacGyver watching binge, but either way, I’m calling it excess frustration. It seems like it always throws me off when I’m trying to do something at work or at a friend’s house to their computer or… whatever. I had started to carry my little red Swiss Army knife a while back, and it came in handy at least a couple of times a day, so I decided it was probably worth further investment to get one with a real screwdriver on it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brazil Tickets</title>
      <link>https://traviscj.com/blog/post/2008-06-20-brazil_tickets/</link>
      <pubDate>Fri, 20 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-06-20-brazil_tickets/</guid>
      <description>&lt;p&gt;I’m a little bit late announcing this, but…. I BOUGHT MY BRAZIL TICKETS!&lt;/p&gt;&#xA;&lt;p&gt;It ended up being like 1300 bucks, and I have a 13 hour layover in Atlanta on the way there…. but I think that’ll be okay. It’s actually enough time that I think I might go in and see the world’s largest aquarium, the CNN headquarters, and the World of Coca Cola.&lt;/p&gt;&#xA;&lt;p&gt;We’re going to be staying somewhere called El Misti Hostel, and make up about 70-80% of the residents there. It’s right off of Copacabana Beach, which is very, very exciting.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Differential Equations</title>
      <link>https://traviscj.com/blog/post/2008-05-12-differential_equations/</link>
      <pubDate>Mon, 12 May 2008 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-05-12-differential_equations/</guid>
      <description>&lt;p&gt;I’ve realized that a lot of people are nervous about differential equations. Which is understandable, but in general there’s some pretty straightforward ways to solve a fair number of the ones you come across. I’d really like to write some of it up.&lt;/p&gt;&#xA;&lt;p&gt;My basic idea is going to be, show a bit about integrating factors, a bit about separation of variables, the characteristic equation, and the method of undetermined coefficients. That covers a lot of physical territory. Then some about reducing order with transformations from n-th order equations to n 1-st order equations, and basic Laplace for a sortof general method. And finally, maybe a tiny bit about numeric methods.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cython</title>
      <link>https://traviscj.com/blog/post/2008-05-09-cython/</link>
      <pubDate>Fri, 09 May 2008 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-05-09-cython/</guid>
      <description>&lt;p&gt;After I had finally convinced myself to get out of bed this morning to go to my ACMS seminar, I quickly checked my email and my heart sank a little. Today’s talk was on SAGE. Don’t have anything against SAGE, but I thought it was just a big pile of open source packages in a big, heavy install. Sorta cool, but worthless, in other words.&lt;/p&gt;&#xA;&lt;p&gt;Turns out, I was pretty wrong about that. It is that, but it’s also  70k new lines of code that does a whole bunch of exciting stuff. Near the end of his talk, William Stein mentioned that they had created a new tool called Cython. (Well, extended Pyrex, but… whatever.)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vertigo</title>
      <link>https://traviscj.com/blog/post/2008-03-12-vertigo/</link>
      <pubDate>Wed, 12 Mar 2008 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2008-03-12-vertigo/</guid>
      <description>&lt;p&gt;No, not that dizzy, spinning sensation. The Firefox extension.&lt;/p&gt;&#xA;&lt;p&gt;Someone finally caught on to the fact that on a lot of modern computers, we have a lot more horizontal space than vertical. Whoever it was, they must have also been miffed that they never seemed to have room for all of their firefox tabs. So, they made a vertical tab menu, which is actually pretty cool. The standard stuff (ctrl-tab) still works, which is convenient.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Playing</title>
      <link>https://traviscj.com/blog/post/2007-12-28-python_playing/</link>
      <pubDate>Fri, 28 Dec 2007 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-12-28-python_playing/</guid>
      <description>&lt;p&gt;I’ve been playing around with Python a bit more over the break, mostly because I want to be lazy in my code-writing for the forseeable future, plus I’d like to give NumPy a shot, but I want to have a solid background before trying that. One thing that just has not gotten old yet is the ability to assign functions absolutely anywhere in python. You can pass them around like variables, put them in dictionaries, return them from functions, whatever. I mean, I lived in parenthesis for a while in my scheme class, so it’s not like I haven’t been exposed to it, but it’s still damn cool. You can do cool stuff like making a tuple of some index, some value, and the function to process the other two. That makes it so much easier to deal with various combinations of neat datastructures. Anyways, the book I’ve been reading is Dive Into Python, off diveintopython.org. I’m currently at about page 114 out of 327, and I’ve fairly faithfully read most of it up until that point. The format seems slightly frustrating to me, but it’s probably just because it’s such a departure from what a lot of books and tutorials use. It seems helpful and worthwhile in any case.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Acronis TrueImage</title>
      <link>https://traviscj.com/blog/post/2007-06-30-acronis_trueimage/</link>
      <pubDate>Sat, 30 Jun 2007 14:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-06-30-acronis_trueimage/</guid>
      <description>&lt;p&gt;TrueImage is&amp;hellip; well&amp;hellip; Quite the piece of software.&lt;/p&gt;&#xA;&lt;p&gt;What I need it to do: Tell the check_backupdisk script that it&amp;rsquo;s actually running the backup (IE&amp;ndash;don&amp;rsquo;t bitch on nagios) and handle all the mounting/umounting/fscking that it currently does. I think I&amp;rsquo;ll probably end up putting a wrapper script around it&amp;hellip;. but we&amp;rsquo;ll see.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MRTG</title>
      <link>https://traviscj.com/blog/post/2007-06-30-mrtg/</link>
      <pubDate>Sat, 30 Jun 2007 13:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-06-30-mrtg/</guid>
      <description>&lt;p&gt;So, another day, another (minor) problem. I had connected to a server with KDE instead of our usual GNOME interface. Which probably would have been fine except that KDE had a screensaver that sucked up the CPU. Which also would have been fine, if it hadn&amp;rsquo;t been a server that everyone else used. Oops. RRDtool and MRTG would have shown a CPU spike which I could have investigated.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cacti</title>
      <link>https://traviscj.com/blog/post/2007-06-30-cacti/</link>
      <pubDate>Sat, 30 Jun 2007 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-06-30-cacti/</guid>
      <description>&lt;p&gt;So, rrdtool is pretty sweet, but it&amp;rsquo;s somewhat of a pain to set up. So&amp;hellip; we use Cacti. It&amp;rsquo;s amazing. Supposedly it&amp;rsquo;ll integrate with Nagios as well, and then all of this data will be at our fingertips. For now, I just set it up on my server that&amp;rsquo;s probably going to go down shortly. In any case, I feel like this project is somewhat coming together. Nagios is great for what&amp;rsquo;s going on right now, cacti needs a way to know what&amp;rsquo;s going on right now–A match made in heaven, or something.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RRDTool</title>
      <link>https://traviscj.com/blog/post/2007-06-29-rrdtool/</link>
      <pubDate>Fri, 29 Jun 2007 14:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-06-29-rrdtool/</guid>
      <description>&lt;p&gt;I have apparently been missing out. There&amp;rsquo;s a really neat little unix tool called &amp;lsquo;rrdtool&amp;rsquo; that uses a fixed-size database to look at how something changes over time. I think I&amp;rsquo;ll use it to monitor server load&amp;hellip; and possibly network traffic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Subversion Bite-sized Projects</title>
      <link>https://traviscj.com/blog/post/2007-06-29-subversion_bite-sized_projects/</link>
      <pubDate>Fri, 29 Jun 2007 13:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-06-29-subversion_bite-sized_projects/</guid>
      <description>&lt;p&gt;Subversion added a tag in their bug-tracking database of projects that are &amp;lsquo;bite-sized&amp;rsquo;: self-contained, somewhat independent fixes that should happen. I&amp;rsquo;m not sure any look very interesting at the moment, but I&amp;rsquo;ll have to come back to it at some point.&#xA;&lt;a href=&#34;http://subversion.tigris.org/issues/buglist.cgi?component=subversion&amp;amp;issue_status=UNCONFIRMED&amp;amp;issue_status=NEW&amp;amp;issue_status=STARTED&amp;amp;issue_status=REOPENED&amp;amp;keywords=bite-sized&amp;amp;cmdtype=doit&#34;&gt;Bite-sized projects&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing... me</title>
      <link>https://traviscj.com/blog/post/2007-06-29-introducing_me/</link>
      <pubDate>Fri, 29 Jun 2007 12:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-06-29-introducing_me/</guid>
      <description>&lt;p&gt;Or not. Ok, so&amp;hellip; Every previous blog attempt has been a pile of crap. Well, therealtravisjohnson wasn&amp;rsquo;t always, but it kinda got stale. So, I&amp;rsquo;m not gonna bother talking about me until I have a substantial amount of posts.&lt;/p&gt;&#xA;&lt;p&gt;I got owned on my math quiz today. It&amp;rsquo;s kinda ridiculous that we have a 60 minute quiz after 3 hours of lecture, I feel. Thank god I&amp;rsquo;ve largely gotten over the not studying well phase.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where I&#39;m At</title>
      <link>https://traviscj.com/blog/post/2007-03-03-where_im_at/</link>
      <pubDate>Sat, 03 Mar 2007 00:00:00 +0000</pubDate>
      <guid>https://traviscj.com/blog/post/2007-03-03-where_im_at/</guid>
      <description>&lt;p&gt;So it&amp;rsquo;s almost the end of Winter Quarter 07 at the University of Washington. It&amp;rsquo;s cold and rainy and lame. Last week I got turned down from the Computer Science program here, which meant I spent the weekend generally freaking out.&lt;/p&gt;&#xA;&lt;p&gt;In any case, I then remembered that I liked the idea of an ACMS degree. The base of the major consists of the physics series, a Numerical Methods course and a Continuous modeling course from the AMATH department, and discrete models and statistics from the math department.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
