<?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>Sat, 07 Feb 2026 10:39:04 +0000</pubDate>
    <lastBuildDate>Sat, 07 Feb 2026 10:39:04 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <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>
    
      <item>
        <title>Robo Speed Limits</title>
        <description>&lt;p&gt;Seeing a Google self-driving Lexus on the highway, I
thought, “Will they ever be caught speeding?”&lt;/p&gt;

&lt;p&gt;And if so caught, or involved in an accident, will the memory or
configuration of the computer or GPS be admissible evidence?&lt;/p&gt;

&lt;p&gt;Would that be an incentive for manufacturers to install a speed
governor?&lt;/p&gt;

&lt;p&gt;Would a sufficent fraction of speed-governed self-driving cars on a
stretch of highway cause median non-robotic drivers to otherwise slow
their pace?&lt;/p&gt;

&lt;p&gt;Would the governor be a deterrance for rushed or thrill-seeking
drivers&lt;sup id=&quot;fnref:disclaimer&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:disclaimer&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; from enabling the computer, wanting the freedom
to exceed the legal speed limit?&lt;/p&gt;

&lt;p&gt;With years of safety data, assuming any needed improvements in safety,
suggesting that self-driving cars are &lt;em&gt;safer&lt;/em&gt; at speed, would there
then be a relaxation of the law thereby allowing robo-speeding,
effectively penalizing human speeders?  A side benefit would be higher
vehicle densities (with greater road wear) per unit time.&lt;/p&gt;

&lt;p&gt;Would that make the manual driving of a car seen as reckless as not
wearing a seatbelt?&lt;/p&gt;

&lt;p&gt;I, for one, welcome our new fast and furious overlords.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:disclaimer&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Not me, officer. &lt;a href=&quot;#fnref:disclaimer&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>Sun, 08 Feb 2015 00:00:00 +0000</pubDate>
        <link>http://benwen.com/whatif/technology/2015/02/08/Robo-Speed-Limits/</link>
        <guid isPermaLink="true">http://benwen.com/whatif/technology/2015/02/08/Robo-Speed-Limits/</guid>
        
        <category>whatif</category>
        
        <category>technology</category>
        
        <category>robotoverlords</category>
        
        
        <category>whatif</category>
        
        <category>technology</category>
        
      </item>
    
  </channel>
</rss>
