<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Benwen Blog.</title>
    <description>My set of unfiltered musings on life, technology, craft, and family. All opinions are mine. Copyright &amp;#169; 2014-2026 Benson Wen.</description>
    <link>http://benwen.com/</link>
    <atom:link href="http://benwen.com/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Wed, 24 Jun 2026 07:16:18 +0000</pubDate>
    <lastBuildDate>Wed, 24 Jun 2026 07:16:18 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Configure the Universe</title>
        <description>&lt;p&gt;A rubric runon&lt;/p&gt;

&lt;p&gt;From where we are today, what is the best path to the configuration of
the universe that has the highest likelihood of the biggest outcome
with the least amount of risk and the lowest cost in the shortest
amount of time in the way most aligned with our values and sense of
aesthetic?&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate>
        <link>http://benwen.com/life/2026/06/23/configure-the-universe/</link>
        <guid isPermaLink="true">http://benwen.com/life/2026/06/23/configure-the-universe/</guid>
        
        <category>howto</category>
        
        
        <category>life</category>
        
      </item>
    
      <item>
        <title>AI, AI, AI. That&apos;s the answer. Now, what was the question again?</title>
        <description>&lt;p&gt;When some new techno trend “foo” arrives, I find myself repeating the
same chestnut: “Foo, foo, foo that’s the answer, now remind me again
what was the question?” In my career there was an XML phase, a NoSQL
fever, a Cloud boom. That was followed by Node.js, Docker, Blockchain,
and for the last two years, AI. This AI one has lasted longer than the
rest (barring the Cloud one).&lt;/p&gt;

&lt;p&gt;Now with the arrival of OpenClaw and orchestrators like Gas Town, the
AI trend looks to be here for another year or two.&lt;/p&gt;

&lt;p&gt;These open source projects are early signals for the next area of
intense growth in software: long-running multi-agent systems. Both are
going to be a huge sink for tokens. They will burn a &lt;em&gt;lot&lt;/em&gt; of
tokens. OpenClaw author at the first Claw-Con this week: “Ya, more
tokens. Someone has to support Anthropic.” Steve Yegge in his latest
Medium post
&lt;a href=&quot;https://steve-yegge.medium.com/the-anthropic-hive-mind-d01f768f3d7b&quot;&gt;The Anthropic Hive Mind&lt;/a&gt;:
“But there is a yellow brick road: spending tokens. This golden
shimmering trail will lead your company gradually in the right
direction.”&lt;/p&gt;

</description>
        <pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate>
        <link>http://benwen.com/ai/2026/02/07/AI-AI-AI/</link>
        <guid isPermaLink="true">http://benwen.com/ai/2026/02/07/AI-AI-AI/</guid>
        
        <category>ai,</category>
        
        <category>programming</category>
        
        
        <category>ai</category>
        
      </item>
    
      <item>
        <title>Clojure Conditional Breakpoint on Passed Function Name</title>
        <description>&lt;p&gt;Conditional breakpoint in Clojure to match a passed function’s
name/class, using Emacs and Cider.  Clojure 1.8.0. CIDER 0.13.0.&lt;/p&gt;

&lt;p&gt;Insert this in front of the expression you want to break on.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;      #dbg ^{:break/when (re-find #&quot;draw_row&quot; (str (class f)))}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Wed, 07 Jun 2017 00:00:00 +0000</pubDate>
        <link>http://benwen.com/programming/2017/06/07/clojure-conditional-breakpoint-on-function-name/</link>
        <guid isPermaLink="true">http://benwen.com/programming/2017/06/07/clojure-conditional-breakpoint-on-function-name/</guid>
        
        <category>clojure</category>
        
        <category>programming</category>
        
        
        <category>programming</category>
        
      </item>
    
      <item>
        <title>Clojure recur and variadic functions</title>
        <description>&lt;p&gt;tl;dr: for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;recur&lt;/code&gt; call to a variadic function, wrap the variadic
parameters in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(list ..)&lt;/code&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I am writing this for my future self because I’ll stub my toe on this
again if I don’t.  Future self, you’re welcome.&lt;/p&gt;

&lt;p&gt;So, I was editing a function to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;recur&lt;/code&gt;.  It was my first time
using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;recur&lt;/code&gt; with a variadic parameter.&lt;/p&gt;

&lt;p&gt;WTF. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;recur&lt;/code&gt; invocation threw an error.  Walking in the debugger
confused me further. What saved me from frustration was this in the middle of the community documentation for
&lt;a href=&quot;http://clojuredocs.org/clojure.core/recur#example-55ff3cd4e4b08e404b6c1c7f&quot;&gt;recur&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;; Note that recur can be surprising when using variadic functions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And in the official &lt;a href=&quot;http://clojure.org/reference/special_forms#recur&quot;&gt;docs&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The recur expression must match the arity of the recursion point exactly. In particular, if the recursion point was the top of a variadic fn method, there is no gathering of rest args - a single seq (or null) should be passed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, good to know.&lt;/p&gt;

&lt;p&gt;And here’s the function I was refactoring.&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cleave-repeat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Finds a repeating pattern in string s using r as the next attempt to try.&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;               &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; http://clojuredocs.org/clojure.core/recur &lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; recur with variadic does not wrap r in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; a list. So a normal function call and recur&apos;d one will otherwise differ.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;empty?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;empty?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cleave-repeat&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;rest&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; This calls the variadic &quot;normally&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;empty?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                       &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; We have the pattern in r if this is true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
           &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clojure.string/split&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
             &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;drop-last&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;mod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
             &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;re-pattern&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                            &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; Return the pattern&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;; &apos;recur&apos; calls with varadic not wrapped by a list, so (list ...) is needed.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;recur&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;rest&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clojure.string/join&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))])))))))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Damn you JVM.&lt;/p&gt;
</description>
        <pubDate>Thu, 01 Sep 2016 00:00:00 +0000</pubDate>
        <link>http://benwen.com/programming/2016/09/01/clojure-recur-and-variadic/</link>
        <guid isPermaLink="true">http://benwen.com/programming/2016/09/01/clojure-recur-and-variadic/</guid>
        
        <category>clojure</category>
        
        <category>wtf</category>
        
        <category>programming</category>
        
        <category>venting</category>
        
        
        <category>programming</category>
        
      </item>
    
      <item>
        <title>Boot and Vagrant</title>
        <description>&lt;p&gt;&lt;img src=&quot;/assets/boot-logo-3.png&quot; alt=&quot;boot-clj logo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://boot-clj.com&quot;&gt;Boot&lt;/a&gt; is a new-ish software build system
designed for and built with &lt;a href=&quot;http://www.clojure.org&quot;&gt;Clojure&lt;/a&gt; and
&lt;a href=&quot;https://github.com/clojure/clojurescript&quot;&gt;ClojureScript&lt;/a&gt;.  Here are
some notes on using it with a &lt;a href=&quot;https://www.vagrantup.com&quot;&gt;Vagrant&lt;/a&gt;
session on a Mac.&lt;sup id=&quot;fnref:TODO&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:TODO&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;This is very much a work in progress.  I generally like working with
Vagrant to keep my development environments packaged, isolated, and
repeatably built.  No exception while I learn Clojure / ClojureScript,
and as I decide on the surrounding tooling like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;boot&lt;/code&gt;.  The main
hurdles were to get the REPL and reload connections to be exposed to
Vagrant network forwards.&lt;/p&gt;

&lt;h3 id=&quot;buildboot&quot;&gt;build.boot&lt;/h3&gt;
&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;;; define dev task as composition of subtasks&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;deftask&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Launch Immediate Feedback Development Environment&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;comp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;serve&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:dir&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:port&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;            &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;;; ports 3000-3003 are forwarded by Vagrantfile&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cljs-repl&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:nrepl-opts&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:port&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3002&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:bind&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;cljs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:dir&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:port&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reload&lt;/code&gt; needs to be cast to an int.&lt;/li&gt;
  &lt;li&gt;I failed to get bash to pass the EDN
parameter &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{:port 3002 :bind &quot;0.0.0.0&quot;}&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cljs-repl&lt;/code&gt; for the
nREPL port on the command line, so creating a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deftask&lt;/code&gt; 
is necessary.&lt;sup id=&quot;fnref:cljs-repl&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:cljs-repl&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:bind&lt;/code&gt; parameter in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cljs-repl&lt;/code&gt; overrides the default
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost&lt;/code&gt;, which is not visible to Vagrant.&lt;/li&gt;
  &lt;li&gt;Run with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;boot dev&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Thank you to
&lt;a href=&quot;https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-03.md#enter-deftask&quot;&gt;modern_cljs&lt;/a&gt;
tutorial for the source task.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;vagrantfile&quot;&gt;Vagrantfile&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  config.vm.network &quot;forwarded_port&quot;, guest: 3000, host: 3000 # web server
  config.vm.network &quot;forwarded_port&quot;, guest: 3001, host: 3001 # reload browser signaling
  config.vm.network &quot;forwarded_port&quot;, guest: 3002, host: 3002 # nREPL 
  config.vm.network &quot;forwarded_port&quot;, guest: 3003, host: 3003 # bREPL 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;emacs&quot;&gt;Emacs&lt;/h3&gt;
&lt;p&gt;To connect to the guest nREPL for the CLJS environment&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;M-x cider-connect
localhost
3002
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;M-x cider-connect&lt;/code&gt; doesn’t (yet) bind the host cider environment
to the guest REPL, so sadly a lot of the magic isn’t working yet,
like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cider-eval-defun-at-point&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the nREPL, to connect to the bREPL&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;boot.user&amp;gt; (start-repl :port (int 3003) :ip &quot;0.0.0.0&quot;)
&amp;lt;&amp;lt; started Weasel server on ws://0.0.0.0:3003 &amp;gt;&amp;gt;
&amp;lt;&amp;lt; waiting for client to connect ... Connection is ws://localhost:3003
Writing boot_cljs_repl.cljs...
(open host browser at http://localhost:3000)
 connected! &amp;gt;&amp;gt;
To quit, type: :cljs/quit
nil
cljs.user&amp;gt; (js/alert &quot;hello&quot;)
(dismiss popup in host browser)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;detailed-use-case&quot;&gt;Detailed use case&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;a Clojure application server in development mode on port 3000&lt;/li&gt;
  &lt;li&gt;the guest virtual machine is running Ubuntu Linux.&lt;/li&gt;
  &lt;li&gt;web application runs ClojureScript&lt;/li&gt;
  &lt;li&gt;web browser is on host Mac&lt;/li&gt;
  &lt;li&gt;Emacs running Cider is the development environment running on the
 host Mac&lt;/li&gt;
  &lt;li&gt;Cider to nREPL on guest, chained to bREPL to the browser for
debugging / inspection.&lt;/li&gt;
  &lt;li&gt;Boot tasks: &lt;a href=&quot;https://github.com/pandeiro/boot-http&quot;&gt;serve&lt;/a&gt; &lt;a href=&quot;https://github.com/boot-clj/boot/blob/master/doc/boot.task.built-in.md#watch&quot;&gt;watch&lt;/a&gt;&lt;sup id=&quot;fnref:watch&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:watch&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;a href=&quot;https://github.com/adzerk-oss/boot-reload&quot;&gt;reload&lt;/a&gt; &lt;a href=&quot;https://github.com/adzerk-oss/boot-cljs-repl&quot;&gt;cljs-repl&lt;/a&gt; &lt;a href=&quot;https://github.com/adzerk-oss/boot-cljs&quot;&gt;cljs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Guest OS: Ubuntu Trusty64.  Host OS: MacOS 10.11.5.  Vagrant
 version: 1.8.1.  Provider: vm_fusion.  Hypervisor: VMware
 Fusion 8.1.1.  Clojure: 1.7.0.  Java: SE Runtime build
 1.8.0_91-b14 and HotSpot 64-bit Server VM build 25.91-b14, mixed
 mode. Emacs: Aquamacs 3.2 GNU Emacs 24.4.51.2&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:TODO&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;TODO: create a GitHub repo with an auto-provisioning Vagrantfile as a nice template. &lt;a href=&quot;#fnref:TODO&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:cljs-repl&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;boot cljs-repl -n &quot;{:port 3002 :bind \&quot;0.0.0.0\&quot;}&quot;&lt;/code&gt;: clojure.lang.ExceptionInfo: clojure.lang.PersistentVector cannot be cast to java.lang.String. &lt;a href=&quot;#fnref:cljs-repl&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:watch&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;The guest filesystem &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;watch&lt;/code&gt; is blind to changes made from the host’s Vagrant synced files.  Sadly this currently means that touching a file from the guest to kickoff a build. &lt;a href=&quot;#fnref:watch&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Thu, 28 Jul 2016 00:00:00 +0000</pubDate>
        <link>http://benwen.com/howto/2016/07/28/boot-clj-vagrant/</link>
        <guid isPermaLink="true">http://benwen.com/howto/2016/07/28/boot-clj-vagrant/</guid>
        
        <category>clojure</category>
        
        <category>boot-clj</category>
        
        <category>programming</category>
        
        <category>vagrantup</category>
        
        
        <category>howto</category>
        
      </item>
    
      <item>
        <title>Multisensor Data Fusion</title>
        <description>&lt;p&gt;Recently, I’ve come across this technical term that’s crops up a lot
in the engineering world of IoT and mobile devices: Sensor Fusion. In
its nominal usage, it means the ability to combine the output of
common multiple mobile sensors like gyros, compasses, and GPS into a
synthesized, more application-useful signal.  A more precise term for
that would be “multisensor data fusion”. That is, data from multiple
sensors being combined together.&lt;/p&gt;

&lt;p&gt;More broadly, sensor fusion can include synthesis of outputs of a
single sensor over time, or an array of similar sensors in an
environment, which would include human stereoscopic vision.&lt;/p&gt;

&lt;p&gt;I’m largely an application software kind of guy, so these terms are
novel to me.&lt;/p&gt;

&lt;p&gt;I like to take concepts to an usually absurd apex or nadir&lt;sup id=&quot;fnref:nadir&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:nadir&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.  So then,
would the human brain then be an exquisite sensor fusion
implementation?&lt;/p&gt;

&lt;hr /&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:nadir&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;“Multisensor data fusion” can be sung to Supercalifragilisticexpialidocious. &lt;a href=&quot;#fnref:nadir&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Fri, 13 Feb 2015 00:00:00 +0000</pubDate>
        <link>http://benwen.com/misc/2015/02/13/multisensor-data-fusion/</link>
        <guid isPermaLink="true">http://benwen.com/misc/2015/02/13/multisensor-data-fusion/</guid>
        
        <category>technophilo</category>
        
        
        <category>misc</category>
        
      </item>
    
      <item>
        <title>Oculus Vertiginous</title>
        <description>&lt;p&gt;Unfortunately, I’m in the category of vertigo sufferers when donning
the Oculus Rift. I tried one on tonight for the first time. I had it
on for maybe 10 minutes before I had to take it off.  I almost had to
look around for a barf bag.&lt;/p&gt;

&lt;p&gt;A bit of a disappointment.&lt;/p&gt;

&lt;p&gt;Back in 1995 I had a prototype head-mounted display shipped from
California for a Virtual Reality project we had undertaken.  I
distinctly remember the hand-wrapped package made from two boxes taped
together haphazardly.  The goggle’s plastic was coarse and a bright
light green and black.  The duckbill shaped front was unbalanced.  The
latency was on the order of hundreds of milliseconds and had terrible
angular sensor resolution.  I think the screen had poor color
saturation and contrast.  I don’t think it ever made it past the
prototype phase.&lt;/p&gt;

&lt;p&gt;We had other prototypes and products, like the Virtual I/O, which may
have been the most popular at the time.&lt;/p&gt;

&lt;p&gt;The Rift is far superior than those, but I still sense a very hobbyist
kind of experience.&lt;/p&gt;

&lt;p&gt;There is some kind of irresistible siren song of 3D virtual reality
goggles for each generation of programmers. Prior to the Virtual I/O
generation, there were Evans and Sutherland displays that had to
be mounted on a articulated arm to support the weight.&lt;/p&gt;

&lt;p&gt;I may no longer be in the demographic for these, but I understand the
appeal.  So here’s a toast to the next generation!&lt;/p&gt;
</description>
        <pubDate>Thu, 12 Feb 2015 00:00:00 +0000</pubDate>
        <link>http://benwen.com/opinion/product/2015/02/12/oculus-vertiginous/</link>
        <guid isPermaLink="true">http://benwen.com/opinion/product/2015/02/12/oculus-vertiginous/</guid>
        
        <category>opinion</category>
        
        <category>product</category>
        
        
        <category>opinion</category>
        
        <category>product</category>
        
      </item>
    
      <item>
        <title>Apple&apos;s New Market</title>
        <description>&lt;p&gt;&lt;a href=&quot;http://stratechery.com/2015/apples-new-market/&quot;&gt;Apple’s New Market&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ben Thompson adds Apple’s recent astounding quarter to evidence
against the Clay Christensen’s low-end disruptive innovation
model… at least applied to Apple’s business.  He ends with a sly
reference to the further disruptive possibilities of the Apple Watch.
To which,
&lt;a href=&quot;/opinion/product/2015/01/29/apple-pocket-phone/&quot;&gt;I agree&lt;/a&gt;
heartily.&lt;/p&gt;

&lt;p&gt;Makes me wonder: What other businesses could this dis-commodification apply?&lt;/p&gt;

</description>
        <pubDate>Wed, 11 Feb 2015 00:00:00 +0000</pubDate>
        <link>http://benwen.com/opinion/business/2015/02/11/Apples-New-Market/</link>
        <guid isPermaLink="true">http://benwen.com/opinion/business/2015/02/11/Apples-New-Market/</guid>
        
        <category>opinion</category>
        
        <category>business</category>
        
        <category>apple</category>
        
        <category>watch</category>
        
        <category>stratechery</category>
        
        
        <category>opinion</category>
        
        <category>business</category>
        
      </item>
    
      <item>
        <title>Naming Things</title>
        <description>&lt;p&gt;In roughly the order they spilled out of my brain.  There are lots of
other considerations that go into a name of a company or product. Here
are a few acid tests to throw on your names ideas.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Evokes your desired brand characteristics (e.g. strength, humor,
compassion): +5&lt;/li&gt;
  &lt;li&gt;Is easy for most people to spell: +1&lt;/li&gt;
  &lt;li&gt;Is “scalable” meaning there are a variety of natural sub-names +1&lt;/li&gt;
  &lt;li&gt;You have to spell out your URL in phone conversation: -2&lt;/li&gt;
  &lt;li&gt;Your 15-second radio spot uses 10 seconds to get the URL out -2&lt;/li&gt;
  &lt;li&gt;You rely on interCaps as a pronounciation hint: -1&lt;/li&gt;
  &lt;li&gt;It’s trademarkable: +2&lt;/li&gt;
  &lt;li&gt;Is available across all relevant media +2&lt;/li&gt;
  &lt;li&gt;References an obscure Dennis Miller schtick: -25&lt;/li&gt;
  &lt;li&gt;Unless you’re marketing to Dennis Miller fans exclusively: +24&lt;/li&gt;
  &lt;li&gt;Uses phonetic dopplegangers (e.g. Lyft) -1&lt;/li&gt;
  &lt;li&gt;Unless you have a big marketing budget +1&lt;/li&gt;
  &lt;li&gt;Uses easily confounded letters / numbers -1&lt;/li&gt;
  &lt;li&gt;Uses 1eetspeak: -1&lt;/li&gt;
  &lt;li&gt;Has punctuation in the name (hypens, periods, exclamation points etc.) -1&lt;/li&gt;
  &lt;li&gt;Your mother pronounces it correctly on sight: +10&lt;/li&gt;
  &lt;li&gt;Your mother spells it correctly upon hearing it: +15&lt;/li&gt;
  &lt;li&gt;You overly agonize: -1&lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Tue, 10 Feb 2015 00:00:00 +0000</pubDate>
        <link>http://benwen.com/opinion/marketing/2015/02/10/Naming-Things/</link>
        <guid isPermaLink="true">http://benwen.com/opinion/marketing/2015/02/10/Naming-Things/</guid>
        
        <category>opinion</category>
        
        <category>marketing</category>
        
        <category>evergreen</category>
        
        
        <category>opinion</category>
        
        <category>marketing</category>
        
      </item>
    
      <item>
        <title>ATT Telegram</title>
        <description>&lt;p&gt;&lt;img src=&quot;/assets/ATT%20U-Verse%20Form%20Detail.png&quot; alt=&quot;ATT Order Form&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Apparently ATT still stands for American Telephone and &lt;em&gt;Telegraph&lt;/em&gt;
company.  This is the back of an actual ATT u-verse Internet
service order form:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;To cancel this transaction… send a telegram to the address
below..&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;/assets/ATT%20U-Verse%20Form.png&quot;&gt;Entire form&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 09 Feb 2015 00:00:00 +0000</pubDate>
        <link>http://benwen.com/misc/2015/02/09/ATT-Telegram/</link>
        <guid isPermaLink="true">http://benwen.com/misc/2015/02/09/ATT-Telegram/</guid>
        
        <category>misc</category>
        
        <category>wtf</category>
        
        <category>att</category>
        
        
        <category>misc</category>
        
      </item>
    
  </channel>
</rss>
