<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>shapr's RSS feed</title>
    <link href="https://www.scannedinavian.com/atom.xml" rel="self" />
    <link href="https://www.scannedinavian.com" />
    <id>https://www.scannedinavian.com/atom.xml</id>
    <author>
        <name>Shae Erisson</name>
        
        <email>shae+blog@scannedinavian.com</email>
        
    </author>
    <updated>2025-12-03T00:00:00Z</updated>
    <entry>
    <title>Monoidal Hashing</title>
    <link href="https://www.scannedinavian.com/monoidal-hashing.html" />
    <id>https://www.scannedinavian.com/monoidal-hashing.html</id>
    <published>2025-12-03T00:00:00Z</published>
    <updated>2025-12-03T00:00:00Z</updated>
    <summary type="html"><![CDATA[Data deduplication with monoidal hashing]]></summary>
</entry>
<entry>
    <title>Can you discover unknown elements by calculating their spectra?</title>
    <link href="https://www.scannedinavian.com/can-you-discover-unknown-elements-by-calculating-their-spectra.html" />
    <id>https://www.scannedinavian.com/can-you-discover-unknown-elements-by-calculating-their-spectra.html</id>
    <published>2025-12-02T00:00:00Z</published>
    <updated>2025-12-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[physics, astronomy]]></summary>
</entry>
<entry>
    <title>Lockhart's Lament</title>
    <link href="https://www.scannedinavian.com/lockharts-lament.html" />
    <id>https://www.scannedinavian.com/lockharts-lament.html</id>
    <published>2025-06-03T00:00:00Z</published>
    <updated>2025-06-03T00:00:00Z</updated>
    <summary type="html"><![CDATA[Why you should keep a collection of small fun puzzles.]]></summary>
</entry>
<entry>
    <title>Split keyboard tips</title>
    <link href="https://www.scannedinavian.com/split-keyboard-tips.html" />
    <id>https://www.scannedinavian.com/split-keyboard-tips.html</id>
    <published>2025-06-02T00:00:00Z</published>
    <updated>2025-06-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[You just switched to a split keyboard, now what?]]></summary>
</entry>
<entry>
    <title>Tools built on tree-sitter's concrete syntax trees</title>
    <link href="https://www.scannedinavian.com/tools-built-on-tree-sitters-concrete-syntax-trees.html" />
    <id>https://www.scannedinavian.com/tools-built-on-tree-sitters-concrete-syntax-trees.html</id>
    <published>2025-05-31T00:00:00Z</published>
    <updated>2025-05-31T00:00:00Z</updated>
    <summary type="html"><![CDATA[syntax tree for diff, merge, navigate, edit]]></summary>
</entry>
<entry>
    <title>Buy a blog post</title>
    <link href="https://www.scannedinavian.com/buy-a-blog-post.html" />
    <id>https://www.scannedinavian.com/buy-a-blog-post.html</id>
    <published>2025-05-29T00:00:00Z</published>
    <updated>2025-05-29T00:00:00Z</updated>
    <summary type="html"><![CDATA[bribe me plz, I will write cool things]]></summary>
</entry>
<entry>
    <title>Do something, BRAG ABOUT IT</title>
    <link href="https://www.scannedinavian.com/do-something-brag-about-it.html" />
    <id>https://www.scannedinavian.com/do-something-brag-about-it.html</id>
    <published>2025-04-25T00:00:00Z</published>
    <updated>2025-04-25T00:00:00Z</updated>
    <summary type="html"><![CDATA[write about your cool thing so I can find them]]></summary>
</entry>
<entry>
    <title>Programmers want flow. when programming, light turns RED</title>
    <link href="https://www.scannedinavian.com/programmers-want-flow-when-programming-light-turns-red.html" />
    <id>https://www.scannedinavian.com/programmers-want-flow-when-programming-light-turns-red.html</id>
    <published>2024-12-12T00:00:00Z</published>
    <updated>2024-12-12T00:00:00Z</updated>
    <summary type="html"><![CDATA[<div class="info">
    Posted on 2024-12-12
    
</div>

<p><img src="../images/rosahringurminni.png" /></p>
<p>I read <a href="https://christop.club/publications/pdfs/Zuger-etal_2017.pdf">Reducing Interruptions at Work: A Large-Scale Field Study of FlowLight</a> and built my own FlowLight.</p>
<p>When I first heard about this paper from the second author, Chris Corley, he said something to the effect of “the easiest way to detect if a programmer is in flow is to see if they’re typing into their programmer’s editor.”
This is the approach I wanted to implement.</p>
<p><img src="../images/magtag-busy.png" /></p>
<p><img src="../images/magtag-free.jpg" /></p>
<p>Go look at the <a href="https://github.com/shapr/flowlight/">elisp and circuitpython source code</a>!</p>
<h1 id="whats-flow">What’s Flow?</h1>
<p>Wikipedia says Flow is also called <strong>in the zone</strong> or <strong>locked in</strong>. It’s that time where you have enough of the system loaded into short term memory that you can smoothly and fluently do the thing!</p>
<p>That same page has a section that mentions <a href="https://en.wikipedia.org/wiki/Flow_(psychology)#Characteristics">seven flow conditions</a>, one of which is “Freedom from distractions”.</p>
<p>Most programmers have other humans nearby, in the same physical space. They could be coworkers, children, or partners.</p>
<p>If you are doing the thing, and someone bumps into you and asks if you want coffee, this can lead to an extra fifteen minutes spent reloading short term memory.</p>
<p>Wouldn’t it be nice if those other humans had a way to see if you were <strong>not</strong> at a good point for a distraction?</p>
<h1 id="implementation">Implementation</h1>
<p><a href="https://en.wikipedia.org/wiki/Emacs">Emacs</a>! A
<a href="https://www.adafruit.com/product/4800">MagTag</a> board from AdaFruit,
and its built-in <a href="https://www.adafruit.com/product/4801">NeoPixel Strip</a>!</p>
<p>How do I track activity?</p>
<p>The original authors tracked keypresses and mouse clicks, but I want to do this entirely inside emacs.</p>
<h1 id="emacs-idle-timers">Emacs idle timers?</h1>
<ul>
<li>The idle timer waits for ten seconds, then appends the pair of (now,seconds-of-idle-time) to a list.</li>
<li>The other timer runs every sixty seconds to calculate the status to send, and removes elements older than seven minutes.</li>
</ul>
<p>It works, but there’s gotta be a better approach. This is newbie elisp code, I’d appreciate any suggestions or improvements.</p>
<p>From reading the emacs documentation about idle timers, it says seconds-of-idle-time is <code>nil</code> if emacs isn’t idle. I never got a <code>nil</code> value, so I think my computer is fast enough to run all the background tasks everytime I press a key?</p>
<p>There’s the usual start and stop boilerplate that you need for every emacs timer, and the core is:</p>
<pre class="elisp"><code>;; will this break if I type fast enough for (current-idle-time) to return nil ?
(defun is-active (pair)
  &quot;Check PAIR, idle values less than 10 seconds counts as active. idle returns -1 and active returns 1.&quot;
  (if (&lt; (cdr pair) 10) 1 -1))

(defun flowlight-update-color ()
  &quot;Update the color. This is done by checking whether more than half of the samples from the last seven minutes have activity.&quot;
  (interactive)
  (progn
    (flowlight-prune-activity-intervals) ;; remove old values
    (if	;; if values are more active than inactive, set BUSY status
    (&gt; (apply &#39;+ (cl-mapcar &#39;is-active flowlight-activity-intervals)) 0)
    (url-retrieve &quot;http://flowlight.local/status?status=busy&quot; &#39;message)
  (url-retrieve &quot;http://flowlight.local/status?status=free&quot; &#39;message))))

(defun flowlight-prune-activity-intervals ()
  &quot;Remove any samples older than seven minutes.&quot;
  (interactive)
  (let ((seven-minutes-before-now (- (time-convert nil &#39;integer) (* 60 7))))
    (setq flowlight-activity-intervals
      (cl-remove-if (lambda (row) (&gt; seven-minutes-before-now (car row))) flowlight-activity-intervals))))

</code></pre>
<h1 id="leds-circuitpython">LEDs? CircuitPython?</h1>
<p>I like to buy AdaFruit hardware, and along the way I picked up a
<a href="https://www.adafruit.com/product/4800">MagTag</a> board.</p>
<p>The MagTag board runs CircuitPython, and is one of the few that can run an HTTP server. I hooked a webserver endpoint to the LED colors and e-ink text.</p>
<p>Bonus fun included adding support for multicast DNS:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>mdns_server <span class="op">=</span> mdns.Server(wifi.radio)</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a>mdns_server.hostname <span class="op">=</span> <span class="st">&quot;flowlight&quot;</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(<span class="st">&quot;MDNS Hostname: &quot;</span> <span class="op">+</span> mdns_server.hostname)</span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a>mdns_server.advertise_service(service_type<span class="op">=</span><span class="st">&quot;_http&quot;</span>, protocol<span class="op">=</span><span class="st">&quot;_tcp&quot;</span>, port<span class="op">=</span><span class="dv">80</span>)</span></code></pre></div>
<p>The core of the code is an endpoint for <strong>BUSY</strong> or <strong>FREE</strong>:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="at">@server.route</span>(<span class="st">&quot;/status&quot;</span>, GET)</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> set_status(request: Request):</span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>    <span class="co">&quot;&quot;&quot;Changes the color of the built-in NeoPixels and the status text using query/GET params.&quot;&quot;&quot;</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a>    <span class="co"># e.g. /status?status=busy or /status?status=free</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a>    status <span class="op">=</span> request.query_params.get(<span class="st">&quot;status&quot;</span>)</span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a>    response <span class="op">=</span> <span class="st">&quot;&quot;</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a>    <span class="cf">if</span> status <span class="op">==</span> <span class="st">&quot;busy&quot;</span>:</span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a>    magtag.peripherals.neopixels.fill((<span class="dv">255</span>, <span class="dv">0</span>, <span class="dv">0</span>))</span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a>    magtag.set_text(<span class="st">&quot;BUSY&quot;</span>)</span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a>    response <span class="op">=</span> <span class="st">&quot;busy&quot;</span></span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a>    <span class="cf">elif</span> status <span class="op">==</span> <span class="st">&quot;free&quot;</span>:</span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a>    magtag.peripherals.neopixels.fill((<span class="dv">0</span>, <span class="dv">255</span>, <span class="dv">0</span>))</span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a>    magtag.set_text(<span class="st">&quot;FREE&quot;</span>)</span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a>    response <span class="op">=</span> <span class="st">&quot;free&quot;</span></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true" tabindex="-1"></a>    <span class="cf">else</span>:</span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a>    magtag.peripherals.neopixels.fill((<span class="dv">0</span>, <span class="dv">0</span>, <span class="dv">255</span>))</span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a>    magtag.set_text(<span class="st">&quot;ERROR&quot;</span>)</span>
<span id="cb3-18"><a href="#cb3-18" aria-hidden="true" tabindex="-1"></a>    response <span class="op">=</span> <span class="st">&quot;error&quot;</span></span>
<span id="cb3-19"><a href="#cb3-19" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb3-20"><a href="#cb3-20" aria-hidden="true" tabindex="-1"></a>    <span class="cf">return</span> Response(request, <span class="ss">f&quot;Changed status to </span><span class="sc">{</span>response<span class="sc">}</span><span class="ss">&quot;</span>)</span></code></pre></div>
<h1 id="improvements">Improvements?</h1>
<ul>
<li>Using timers feels janky, maybe I should try what I did for <a href="https://github.com/shapr/markovkeyboard/">markovkeyboard</a> and hook into every keypress? I’m not sure how to structure that efficiently.</li>
<li>I really wanted a <a href="https://en.wikipedia.org/wiki/Sparkline">sparkline</a> of activity, but I don’t have a board with a big display than can run an HTTP server.</li>
<li>I’d like to use the <a href="https://www.adafruit.com/product/5778">Matrix Portal S3</a>, as it can run an HTTP server and has a big display, but it’s out of stock!</li>
<li>This code totally ignores the per-minute buckets and smoothing from the original paper, I’d like to go back and improve that.</li>
</ul>
<h1 id="credits">Credits</h1>
<p>Most of the emacs timer stuff (and how to write elisp) came from discussions with <a href="https://reedmullanix.com/">Reed Mullanix</a> and <a href="http://canonical.org/~kragen/">Kragen Sitaker</a>, thanks!
My friend <a href="https://christop.club/">Chris Corley</a> told me about the FlowLight paper right after it was written, hopefully this post lets me put stop thinking about it for awhile.</p>
<h1 id="notes">Notes</h1>
<p>I started out with AdaFruit’s <a href="https://www.adafruit.com/product/4985">FunHouse Board</a>, but after throwing the board in my backpack without a case, something bad happened and that board has fatal issues getting data over USB.</p>
<p>On the good side, my MagTag board already has a case with an attached battery, and its own set of magnet feet, so I can stick it on the wall for anyone to see.</p>
<p>If you want to buy your own hardware to run this, there are a few suitable boards in stock at the time of publication.</p>
<p>I’d suggest the <a href="https://www.adafruit.com/product/5420">Memento</a> camera, or one of the AdaFruit Feather boards that appear when you click on the arrow to the left of “Available on these boards” section of
the <a href="https://docs.circuitpython.org/en/latest/shared-bindings/socketpool/index.html">socketpool</a> docs.</p>
]]></summary>
</entry>
<entry>
    <title>How to run Haskell source files like shell scripts</title>
    <link href="https://www.scannedinavian.com/how-to-run-haskell-source-files-like-shell-scripts.html" />
    <id>https://www.scannedinavian.com/how-to-run-haskell-source-files-like-shell-scripts.html</id>
    <published>2024-11-14T00:00:00Z</published>
    <updated>2024-11-14T00:00:00Z</updated>
    <summary type="html"><![CDATA[How do I run a Haskell source file like a shell script?]]></summary>
</entry>
<entry>
    <title>The github plugin my coworkers asked me not to write.</title>
    <link href="https://www.scannedinavian.com/the-github-plugin-my-coworkers-asked-me-not-to-write.html" />
    <id>https://www.scannedinavian.com/the-github-plugin-my-coworkers-asked-me-not-to-write.html</id>
    <published>2024-11-11T00:00:00Z</published>
    <updated>2024-11-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[Bus Factor and Goodhart's Law]]></summary>
</entry>
<entry>
    <title>My own system packages in NixOS</title>
    <link href="https://www.scannedinavian.com/my-own-system-packages-in-nixos.html" />
    <id>https://www.scannedinavian.com/my-own-system-packages-in-nixos.html</id>
    <published>2024-04-27T00:00:00Z</published>
    <updated>2024-04-27T00:00:00Z</updated>
    <summary type="html"><![CDATA[frustration, confusion, resolution]]></summary>
</entry>
<entry>
    <title>Static blog on Nix</title>
    <link href="https://www.scannedinavian.com/static-blog-on-nix.html" />
    <id>https://www.scannedinavian.com/static-blog-on-nix.html</id>
    <published>2024-04-15T00:00:00Z</published>
    <updated>2024-04-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[frustration, confusion, resolution]]></summary>
</entry>
<entry>
    <title>Remarkable 2 review</title>
    <link href="https://www.scannedinavian.com/remarkable-2-review.html" />
    <id>https://www.scannedinavian.com/remarkable-2-review.html</id>
    <published>2024-01-22T00:00:00Z</published>
    <updated>2024-01-22T00:00:00Z</updated>
    <summary type="html"><![CDATA[good, bad, and expensive]]></summary>
</entry>
<entry>
    <title>How to use Private Storage on Android</title>
    <link href="https://www.scannedinavian.com/how-to-use-private-storage-on-android.html" />
    <id>https://www.scannedinavian.com/how-to-use-private-storage-on-android.html</id>
    <published>2023-08-07T00:00:00Z</published>
    <updated>2023-08-07T00:00:00Z</updated>
    <summary type="html"><![CDATA[step by step installing gridsync and private storage and sharing data]]></summary>
</entry>
<entry>
    <title>Run property tests until coverage stops increasing</title>
    <link href="https://www.scannedinavian.com/run-property-tests-until-coverage-stops-increasing.html" />
    <id>https://www.scannedinavian.com/run-property-tests-until-coverage-stops-increasing.html</id>
    <published>2023-07-30T00:00:00Z</published>
    <updated>2023-07-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[just the right amount of property tests]]></summary>
</entry>
<entry>
    <title>Android app in Haskell, six months, no previous Android experience</title>
    <link href="https://www.scannedinavian.com/android-app-in-haskell-six-months-no-previous-android-experience.html" />
    <id>https://www.scannedinavian.com/android-app-in-haskell-six-months-no-previous-android-experience.html</id>
    <published>2023-07-25T00:00:00Z</published>
    <updated>2023-07-25T00:00:00Z</updated>
    <summary type="html"><![CDATA[Android app in Haskell, six months, no previous Android experience]]></summary>
</entry>
<entry>
    <title>SMT Solvers part three</title>
    <link href="https://www.scannedinavian.com/smt-solvers-part-three.html" />
    <id>https://www.scannedinavian.com/smt-solvers-part-three.html</id>
    <published>2022-04-11T00:00:00Z</published>
    <updated>2022-04-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[optimal pairing by language preference using SMT solvers]]></summary>
</entry>
<entry>
    <title>How to improve meaningful social interactions on the internet?</title>
    <link href="https://www.scannedinavian.com/how-to-improve-meaningful-social-interactions-on-the-internet.html" />
    <id>https://www.scannedinavian.com/how-to-improve-meaningful-social-interactions-on-the-internet.html</id>
    <published>2022-03-30T00:00:00Z</published>
    <updated>2022-03-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[there must be a better way to video chat]]></summary>
</entry>
<entry>
    <title>Recurse Center again!</title>
    <link href="https://www.scannedinavian.com/recurse-center-again.html" />
    <id>https://www.scannedinavian.com/recurse-center-again.html</id>
    <published>2022-03-29T00:00:00Z</published>
    <updated>2022-03-29T00:00:00Z</updated>
    <summary type="html"><![CDATA[Shae attends another Recurse Center batch]]></summary>
</entry>
<entry>
    <title>Why does magit-status give me an error?</title>
    <link href="https://www.scannedinavian.com/why-does-magit-status-give-me-an-error.html" />
    <id>https://www.scannedinavian.com/why-does-magit-status-give-me-an-error.html</id>
    <published>2021-04-18T00:00:00Z</published>
    <updated>2021-04-18T00:00:00Z</updated>
    <summary type="html"><![CDATA[A stream of consciousness recording of my attempt to debug an emacs problem]]></summary>
</entry>
<entry>
    <title>Open Source Hardware Hearing Aid Part 1</title>
    <link href="https://www.scannedinavian.com/open-source-hardware-hearing-aid-part-1.html" />
    <id>https://www.scannedinavian.com/open-source-hardware-hearing-aid-part-1.html</id>
    <published>2019-08-03T00:00:00Z</published>
    <updated>2019-08-03T00:00:00Z</updated>
    <summary type="html"><![CDATA[Why pay thousands for a hearing aid when you could pay $300?]]></summary>
</entry>
<entry>
    <title>Hyper and Super on my keyboard?</title>
    <link href="https://www.scannedinavian.com/hyper-and-super-on-my-keyboard.html" />
    <id>https://www.scannedinavian.com/hyper-and-super-on-my-keyboard.html</id>
    <published>2019-07-21T00:00:00Z</published>
    <updated>2019-07-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[Stranger Strings or the new-ish way to redefine keyboard layouts in the X Window System]]></summary>
</entry>
<entry>
    <title>Part two of SMT Solvers, Integer Linear Programming</title>
    <link href="https://www.scannedinavian.com/part-two-of-smt-solvers-integer-linear-programming.html" />
    <id>https://www.scannedinavian.com/part-two-of-smt-solvers-integer-linear-programming.html</id>
    <published>2019-07-12T00:00:00Z</published>
    <updated>2019-07-12T00:00:00Z</updated>
    <summary type="html"><![CDATA[Other people already know how to do this well]]></summary>
</entry>
<entry>
    <title>SMT Solvers, Integer Linear Programming</title>
    <link href="https://www.scannedinavian.com/smt-solvers-integer-linear-programming.html" />
    <id>https://www.scannedinavian.com/smt-solvers-integer-linear-programming.html</id>
    <published>2019-07-10T00:00:00Z</published>
    <updated>2019-07-10T00:00:00Z</updated>
    <summary type="html"><![CDATA[How do I get started optimizing cost/benefit with constraints?]]></summary>
</entry>
<entry>
    <title>Sparklines in text</title>
    <link href="https://www.scannedinavian.com/sparklines-in-text.html" />
    <id>https://www.scannedinavian.com/sparklines-in-text.html</id>
    <published>2019-06-16T00:00:00Z</published>
    <updated>2019-06-16T00:00:00Z</updated>
    <summary type="html"><![CDATA[I want to use sparklines to display data in tmux]]></summary>
</entry>
<entry>
    <title>Markov Keyboard, The Rabbit Hole Factory</title>
    <link href="https://www.scannedinavian.com/markov-keyboard-the-rabbit-hole-factory.html" />
    <id>https://www.scannedinavian.com/markov-keyboard-the-rabbit-hole-factory.html</id>
    <published>2019-06-11T00:00:00Z</published>
    <updated>2019-06-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[suggestions and ideas for the markov keybaord]]></summary>
</entry>
<entry>
    <title>Linux on RISC-V</title>
    <link href="https://www.scannedinavian.com/linux-on-risc-v.html" />
    <id>https://www.scannedinavian.com/linux-on-risc-v.html</id>
    <published>2019-06-08T00:00:00Z</published>
    <updated>2019-06-08T00:00:00Z</updated>
    <summary type="html"><![CDATA[how I installed Linux on my RISC-V board]]></summary>
</entry>
<entry>
    <title>two weeks of recurse center</title>
    <link href="https://www.scannedinavian.com/two-weeks-of-recurse-center.html" />
    <id>https://www.scannedinavian.com/two-weeks-of-recurse-center.html</id>
    <published>2019-06-01T00:00:00Z</published>
    <updated>2019-06-01T00:00:00Z</updated>
    <summary type="html"><![CDATA[retrospective on two weeks at the recurse center]]></summary>
</entry>
<entry>
    <title>markov keyboard</title>
    <link href="https://www.scannedinavian.com/markov-keyboard.html" />
    <id>https://www.scannedinavian.com/markov-keyboard.html</id>
    <published>2019-05-31T00:00:00Z</published>
    <updated>2019-05-31T00:00:00Z</updated>
    <summary type="html"><![CDATA[markov keyboard that changes with every letter you type]]></summary>
</entry>
<entry>
    <title>mastermind in elisp</title>
    <link href="https://www.scannedinavian.com/mastermind-in-elisp.html" />
    <id>https://www.scannedinavian.com/mastermind-in-elisp.html</id>
    <published>2019-05-21T00:00:00Z</published>
    <updated>2019-05-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[sketch of a mastermind game in elisp]]></summary>
</entry>
<entry>
    <title>xmonad the tiling window manager</title>
    <link href="https://www.scannedinavian.com/xmonad-the-tiling-window-manager.html" />
    <id>https://www.scannedinavian.com/xmonad-the-tiling-window-manager.html</id>
    <published>2019-05-11T00:00:00Z</published>
    <updated>2019-05-11T00:00:00Z</updated>
    <summary type="html"><![CDATA[setting up xmonad on ubuntu 19.04]]></summary>
</entry>
<entry>
    <title>blogging with emacs' org-mode</title>
    <link href="https://www.scannedinavian.com/blogging-with-emacs-org-mode.html" />
    <id>https://www.scannedinavian.com/blogging-with-emacs-org-mode.html</id>
    <published>2019-05-02T00:00:00Z</published>
    <updated>2019-05-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[hakyll blog posts from emacs]]></summary>
</entry>
<entry>
    <title>Recurse Center</title>
    <link href="https://www.scannedinavian.com/recurse-center.html" />
    <id>https://www.scannedinavian.com/recurse-center.html</id>
    <published>2019-05-01T00:00:00Z</published>
    <updated>2019-05-01T00:00:00Z</updated>
    <summary type="html"><![CDATA[Recurse Center is amazing, I can barely wait to start]]></summary>
</entry>
<entry>
    <title>Faster Haskell code, by example!</title>
    <link href="https://www.scannedinavian.com/faster-haskell-code-by-example.html" />
    <id>https://www.scannedinavian.com/faster-haskell-code-by-example.html</id>
    <published>2017-07-09T00:00:00Z</published>
    <updated>2017-07-09T00:00:00Z</updated>
    <summary type="html"><![CDATA[how to speed up your Haskell code]]></summary>
</entry>

</feed>
