<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>yomimono - something to read</title>
    <link>http://localhost:1313/</link>
    <description>Recent content on yomimono - something to read</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 04 Mar 2022 18:00:00 +0000</lastBuildDate>
    <atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Chamelon: MVP persistent block storage for MirageOS</title>
      <link>http://localhost:1313/blog/2022/03/04/chamelon/</link>
      <pubDate>Fri, 04 Mar 2022 18:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/03/04/chamelon/</guid>
      <description>&lt;p&gt;TL;DR: I wrote a &lt;a href=&#34;https://github.com/mirage/mirage-kv&#34;&gt;key-value store&lt;/a&gt; for &lt;a href=&#34;https://mirage.io&#34;&gt;MirageOS&lt;/a&gt; backed by &lt;a href=&#34;https://github.com/mirage/mirage-block&#34;&gt;block storage&lt;/a&gt;. It&amp;rsquo;s called &lt;a href=&#34;https://github.com/yomimono/chamelon&#34;&gt;chamelon&lt;/a&gt;, it&amp;rsquo;s based off &lt;a href=&#34;https://github.com/littlefs-project/littlefs&#34;&gt;LittleFS&lt;/a&gt;, and if you&amp;rsquo;re brave, you can use it to store data.  Examples are available: &lt;a href=&#34;https://github.com/yomimono/url-shortener&#34;&gt;a URL shortener&lt;/a&gt; and an &lt;a href=&#34;https://github.com/yomimono/oauth2_server&#34;&gt;OAuth2 authorization server&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In English: I couldn&amp;rsquo;t save or load files before, and now I could. Wowzers!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Faithful High Resolution Textures</title>
      <link>http://localhost:1313/blog/2022/02/25/faithful-high-resolution-textures/</link>
      <pubDate>Fri, 25 Feb 2022 18:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2022/02/25/faithful-high-resolution-textures/</guid>
      <description>&lt;p&gt;I discovered a while ago that some games companies charge extra for &amp;ldquo;high resolution textures&amp;rdquo; for their games. This phrase stuck with me until it finally found an outlet: it obviously needs to be rendered in glorious 4-color CGA as a puzzle solution to the 1987 DOS implementation of the popular American game show, &amp;ldquo;Wheel of Fortune&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Talks</title>
      <link>http://localhost:1313/talks/</link>
      <pubDate>Fri, 04 Oct 2019 00:00:00 +0000</pubDate>
      <guid>http://localhost:1313/talks/</guid>
      <description>&lt;h1 id=&#34;2019&#34;&gt;2019&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&amp;ldquo;Library Operating Systems: Functional Programming for the Whole System&amp;rdquo;, &lt;a href=&#34;https://www.meetup.com/Haskallywags/&#34;&gt;Haskallywags&lt;/a&gt; [&lt;a href=&#34;https://github.com/yomimono/talks/blob/primary/haskallywags/slides.md&#34;&gt;slides&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;2018&#34;&gt;2018&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.recurse.com/events/localhost-mindy-preston&#34;&gt;&amp;ldquo;Library Operating Systems: from Localhost to Remote Guest&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://www.recurse.com/localhost&#34;&gt;Localhost&lt;/a&gt; [&lt;a href=&#34;https://github.com/yomimono/talks/blob/primary/localhost.md&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=L-rX1_PRdco&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;2017&#34;&gt;2017&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://bangbangcon.com/2017/speakers.html#mindy-preston&#34;&gt;&amp;ldquo;DHCP: IT&amp;rsquo;S MOSTLY YELLING!!&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://bangbangcon.com&#34;&gt;!!Con&lt;/a&gt; [&lt;a href=&#34;https://github.com/yomimono/talks/blob/primary/bangbangcon2017/slides.md&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=enRY9jd0IJw&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;MirageOS 3: Smaller, lighter, and more transparent&amp;rdquo; (with Amir Chaudhry), &lt;a href=&#34;https://conferences.oreilly.com/oscon/oscon-or&#34;&gt;OSCON&lt;/a&gt; 2017 [&lt;a href=&#34;https://www.oreilly.com/library/view/oscon-2017-/9781491976227/video306694.html&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devopsdays.org/events/2017-madison/program/mindy-preston&#34;&gt;&amp;ldquo;FuzzOps: keep your computers busy and your pagers quiet&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://devopsdays.org/events/2017-madison/welcome/&#34;&gt;DevOps Days Madison&lt;/a&gt; [&lt;a href=&#34;https://github.com/yomimono/talks/blob/primary/fuzzops.pdf&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=BtJsakoXxdY&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://fahrplan.events.ccc.de/congress/2017/Fahrplan/events/8949.html&#34;&gt;&amp;ldquo;library operating systems&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://events.ccc.de/congress/2017/wiki/Main_Page&#34;&gt;34th Chaos Communication Congress&lt;/a&gt; [&lt;a href=&#34;https://github.com/yomimono/talks/blob/primary/34c3.md&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=L-rX1_PRdco&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;2016&#34;&gt;2016&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://opensourcebridge.org/sessions/1812&#34;&gt;&amp;ldquo;Unikernels and Containers: How to Even&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://opensourcebridge.org&#34;&gt;Open Source Bridge&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.composeconference.org/2016/program/#Mindy%20Preston&#34;&gt;&amp;ldquo;Composing Network Operating Systems&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://www.composeconference.org&#34;&gt;Compose::Conf&lt;/a&gt; [&lt;a href=&#34;https://github.com/yomimono/mirage-decks/blob/compose16/slides/compose16/content.md&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=uXt4a_46qZ0&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Unikernels, MirageOS, Library Operating Systems, You&amp;rdquo;, Madison DevOps [&lt;a href=&#34;https://github.com/mirage/mirage-decks/commit/dedce507269fc80d1167b0543e2e7225e7da7985&#34;&gt;slides&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;2015&#34;&gt;2015&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thestrangeloop.com/2015/non-imperative-network-programming.html&#34;&gt;&amp;ldquo;Non-Imperative Network Programming&amp;rdquo;&lt;/a&gt;, &lt;a href=&#34;https://thestrangeloop.com&#34;&gt;Strange Loop&lt;/a&gt; [&lt;a href=&#34;https://github.com/mirage/mirage-decks/blob/master/slides/strangeloop15/content.md&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=GNc1t6Q5Dls&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;li&gt;&amp;ldquo;Persistent Networking with Irmin and MirageOS&amp;rdquo;, &lt;a href=&#34;https://thestrangeloop.com/2015/non-imperative-network-programming.html&#34;&gt;OCaml Users and Developers Workshop&lt;/a&gt; [&lt;a href=&#34;https://github.com/mirage/mirage-decks/blob/master/slides/ocaml15-irminnet/content.md&#34;&gt;slides&lt;/a&gt;] [&lt;a href=&#34;https://www.youtube.com/watch?v=nUJYGFJDVVo&#34;&gt;video&lt;/a&gt;]&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Ditch That AWS Build Host</title>
      <link>http://localhost:1313/blog/2018/07/16/ditch-aws-build-host/</link>
      <pubDate>Mon, 16 Jul 2018 19:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/07/16/ditch-aws-build-host/</guid>
      <description>&lt;p&gt;In honor of the &lt;a href=&#34;https://www.transnational-strike.info/2018/05/17/call-to-all-amazon-workers-in-europe-in-july-a-european-general-strike/&#34;&gt;transnational strike on Amazon this week&lt;/a&gt;, here are instructions for moving your AWS unikernels to a cloud that used to claim it wasn&amp;rsquo;t evil.  You might also be interested in establishing &lt;a href=&#34;https://bigboy.us/other/aws/&#34;&gt;a picket line for your packets&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This blog &lt;a href=&#34;http://localhost:1313/blog/2014/03/16/advancing-toward-the-mirage/&#34;&gt;originally ran on Amazon EC2&lt;/a&gt;.  Since early 2017, it&amp;rsquo;s been running on a different tech behemoth&amp;rsquo;s massive public cloud.  The deployment process is considerably easier and faster on this alternative public cloud &amp;ndash; I first saw it as a live demo given by &lt;a href=&#34;https://mjbright.github.io/&#34;&gt;Michael Bright&lt;/a&gt; and immediately knew I wanted to replace my AWS pipeline with it.  My AWS unikernel deployments required a secondary Linux host for building AMIs from a kernel image and usually took around 20 minutes from start to finish; GCP deployments can be done from my development host and take around 90 seconds.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Whacking the Bitcoin Piñata</title>
      <link>http://localhost:1313/blog/2018/04/17/whacking-the-bitcoin-pinata/</link>
      <pubDate>Tue, 17 Apr 2018 18:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2018/04/17/whacking-the-bitcoin-pinata/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;@yomimono or @hannesm surely know if people have tried crowbar on the BTC Piñata.&#xA;&amp;ndash; &lt;a href=&#34;https://mastodon.social/@Kensan/99536958321475407/&#34;&gt;@kensan@mastodon.social&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;tl;dr - &lt;a href=&#34;https://github.com/yomimono/ocaml-test-x509&#34;&gt;yes&lt;/a&gt;, and it seems that ocaml-x509 is not trivially easy to trick.&lt;/p&gt;&#xA;&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;&#xA;&lt;h3 id=&#34;the-bitcoin-piñata&#34;&gt;The Bitcoin Piñata&lt;/h3&gt;&#xA;&lt;p&gt;In 2015 David Kaloper-Mersinjak and Hannes Mehnert released &lt;a href=&#34;https://github.com/mirleft/ocaml-tls&#34;&gt;ocaml-tls&lt;/a&gt;, an implementation of TLS (formerly known as SSL) written fully in OCaml.  A full writeup of the stack is available in their &lt;a href=&#34;https://usenix15.nqsb.io/&#34;&gt;Usenix Security 2015 paper&lt;/a&gt;, and as &lt;a href=&#34;https://mirage.io/blog/announcing-mirage-25-release&#34;&gt;a series of blog posts on mirage.io&lt;/a&gt;.  To accompany the release they also deployed a fully-automated bug bounty for the security stack &amp;ndash; the &lt;a href=&#34;https://ownme.ipredator.se&#34;&gt;bitcoin piñata&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The piñata will establish TLS connections only with endpoints presenting a certificate signed by its own, undisclosed certificate authority, but allows an attacker to easily listen to the encrypted traffic.  The piñata always sends the same plaintext in such a connection: the private key to a wallet containing approximately 10 bitcoin.  If the attacker can decrypt the ciphertext, or trick the piñata into negotiating a TLS connection with another host and disclosing the key, the information (and therefore the money) is theirs.&lt;/p&gt;&#xA;&lt;h3 id=&#34;crowbar&#34;&gt;Crowbar&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/stedolan/crowbar&#34;&gt;Crowbar&lt;/a&gt; is a library for writing tests.  It combines a property-based API (like QuickCheck) with a coverage-driven generator of test cases (like the fuzzer American Fuzzy Lop).  Crowbar tries to find counterexamples to stated properties by prioritizing the generation of test cases which touch more code.  It is &lt;a href=&#34;https://github.com/stedolan/crowbar/issues/2&#34;&gt;very good at finding counterexamples&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;testing-ocaml-x509&#34;&gt;Testing ocaml-x509&lt;/h2&gt;&#xA;&lt;p&gt;TLS connections are usually authenticated via X509 certificates.  ocaml-tls uses &lt;a href=&#34;https://github.com/mirleft/ocaml-x509&#34;&gt;ocaml-x509&lt;/a&gt; for this purpose, which is written as a standalone library.  There is a clear separation of concerns between ocaml-x509 and ocaml-tls, and a straightforward API for certificate operations in ocaml-x509; both features help tremendously in writing tests for certificate handling.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Posts and Talks Elsewhere</title>
      <link>http://localhost:1313/blog/2017/12/23/posts-talks-2017/</link>
      <pubDate>Sat, 23 Dec 2017 18:00:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/12/23/posts-talks-2017/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve done a lot of stuff in the last half of 2017, but not much of it has made it here.  Here&amp;rsquo;s a roundup of things published/spoken/embroidered/etc in other places:&lt;/p&gt;</description>
    </item>
    <item>
      <title>NAT your own packets</title>
      <link>http://localhost:1313/post/2017-10-09-nat-your-own-packets/</link>
      <pubDate>Mon, 09 Oct 2017 00:03:00 +0000</pubDate>
      <guid>http://localhost:1313/post/2017-10-09-nat-your-own-packets/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been talking about &lt;a href=&#34;http://localhost:1313/blog/2015/04/01/things-routers-do-network-address-translation/&#34;&gt;network address translation&lt;/a&gt; here for a while, including &lt;a href=&#34;http://localhost:1313/blog/2015/04/02/lets-play-network-address-translation/&#34;&gt;instructions on building your own NAT device&lt;/a&gt; with MirageOS. The library behind those posts, &lt;a href=&#34;https://github.com/mirage/mirage-nat&#34;&gt;mirage-nat&lt;/a&gt;, went on to back &lt;a href=&#34;https://github.com/talex5/qubes-mirage-firewall&#34;&gt;talex5&amp;rsquo;s unikernel firewall for QubesOS&lt;/a&gt;, but was unreleased and essentially unmaintained between late 2015 and early 2017.&lt;/p&gt;&#xA;&lt;p&gt;At the &lt;a href=&#34;https://mirage.io/blog/2017-march-hackathon-roundup&#34;&gt;March 2017 MirageOS hack retreat&lt;/a&gt; in Marrakesh, talex5 convinced me to do some much-needed maintenance on this library. After having let it age between March and October, I was persuaded to release &lt;a href=&#34;https://github.com/mirage/mirage-nat/releases/tag/v1.0.0&#34;&gt;a version with the hippest latest build system&lt;/a&gt; last week. It comes with &lt;a href=&#34;https://github.com/mirage/mirage-nat/tree/master/example&#34;&gt;an example of how you might use it&lt;/a&gt; in a MirageOS unikernel that does no additional firewalling. A more compelling example of how you might use mirage-nat (and MirageOS) is still available in &lt;a href=&#34;https://github.com/talex5/qubes-mirage-firewall&#34;&gt;qubes-mirage-firewall&lt;/a&gt;, which I recommend highly if you’re using QubesOS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fine, I&#39;ll Download It For You</title>
      <link>http://localhost:1313/blog/2017/06/13/fine-ill-download-it-for-you/</link>
      <pubDate>Tue, 13 Jun 2017 15:14:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/06/13/fine-ill-download-it-for-you/</guid>
      <description>&lt;p&gt;I recently found myself needing to reset an iPhone 6 to its factory defaults.  There is some useful stuff to have if you&amp;rsquo;re trying to do this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;the passcode for the phone&lt;/li&gt;&#xA;&lt;li&gt;the AppleID with which the phone is associated&lt;/li&gt;&#xA;&lt;li&gt;an iTunes installation&lt;/li&gt;&#xA;&lt;li&gt;an Internet connection capable of downloading the iPhone software image in 15 minutes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It turns out the first two are optional given the last two, or at least a reasonable facsimile.  If you don&amp;rsquo;t have the last one, you have to fake it.  Here&amp;rsquo;s how I spent my first day of funemployment compensating for some Apple engineer failing to consider that it might be nice to download a file before you need to use it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Crowbar Your Favorite Library for Fun and Bugfixes</title>
      <link>http://localhost:1313/blog/2017/04/26/crowbar-dhcp/</link>
      <pubDate>Wed, 26 Apr 2017 03:14:49 +0000</pubDate>
      <guid>http://localhost:1313/blog/2017/04/26/crowbar-dhcp/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/stedolan/crowbar&#34;&gt;Crowbar&lt;/a&gt; is a tool that combines &lt;a href=&#34;https://github.com/stedolan/ocaml-afl-persistent&#34;&gt;afl-persistent&lt;/a&gt;&amp;rsquo;s instrumentation with &lt;a href=&#34;https://github.com/c-cube/qcheck&#34;&gt;quickcheck&lt;/a&gt;-like property-based testing.  &lt;a href=&#34;http://lcamtuf.coredump.cx/afl&#34;&gt;afl-fuzz&lt;/a&gt; is a great tool for detecting crashes, but Crowbar helps us go a step farther and automatically discover inputs which cause our program to no longer have the properties we expect it to have.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/linuxkit/linuxkit/blob/master/projects/miragesdk/why-dhcp.md&#34;&gt;For reasons that don&amp;rsquo;t need exploring at this juncture&lt;/a&gt;, I first thought to apply Crowbar to &lt;a href=&#34;https://github.com/yomimono/charrua-client&#34;&gt;charrua-client&lt;/a&gt;, a library which implements &lt;a href=&#34;http://www.tcpipguide.com/free/t_TCPIPDynamicHostConfigurationProtocolDHCP.htm&#34;&gt;the DHCP state machine&lt;/a&gt; from a client perspective.  Code snippets below are taken from &lt;a href=&#34;https://github.com/yomimono/somerandompacket/tree/master/dhcp&#34;&gt;the dhcp directory in my somerandompacket repository on GitHub&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Quick Guide to Quick Changes in MirageOS</title>
      <link>http://localhost:1313/blog/2015/11/26/quick-changes-in-mirageos/</link>
      <pubDate>Thu, 26 Nov 2015 12:14:50 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/11/26/quick-changes-in-mirageos/</guid>
      <description>&lt;p&gt;MirageOS is &lt;a href=&#34;https://github.com/mirage&#34;&gt;a collection of libraries&lt;/a&gt; and a system for assembling them into &lt;a href=&#34;http://unikernel.org&#34;&gt;unikernels&lt;/a&gt;.  What happens if you want to make changes to those libraries and test them with a new unikernel?&lt;/p&gt;&#xA;&lt;p&gt;Say, for example, I have a static website (like this blog) that I build in MirageOS.  I want to make some changes to the TCP implementation against which the blog is built.  In order to do that, I need to do all the following:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;figure out which module to change&lt;/li&gt;&#xA;&lt;li&gt;figure out which package provides that module&lt;/li&gt;&#xA;&lt;li&gt;get the source for that package and instruct the package manager to use it instead of the release&lt;/li&gt;&#xA;&lt;li&gt;make changes&lt;/li&gt;&#xA;&lt;li&gt;reinstall the package with your changes&lt;/li&gt;&#xA;&lt;li&gt;rebuild the unikernel completely&lt;/li&gt;&#xA;&lt;li&gt;see whether changes had the desired effect&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a quick primer on how.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OCaml Workshop and Strange Loop Talks</title>
      <link>http://localhost:1313/blog/2015/10/07/ocaml-workshop-and-strange-loop-talks/</link>
      <pubDate>Wed, 07 Oct 2015 11:05:43 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/10/07/ocaml-workshop-and-strange-loop-talks/</guid>
      <description>&lt;p&gt;As a result of great encouragement from colleagues and friends, I gave a few talks in September.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=nUJYGFJDVVo&amp;amp;list=PLnqUlCo055hU46uoONmhYGUbYAK27Y6rS&amp;amp;index=12&#34;&gt;Persistent Networking with Irmin and MirageOS&lt;/a&gt;, which I gave at the &lt;a href=&#34;http://ocaml.org/meetings/ocaml/2015/&#34;&gt;OCaml Workshop&lt;/a&gt;, is a talk on sticking a persistent database into various levels of the network stack.  (It includes demonstrations from &lt;a href=&#34;http://somerandomidiot.com/blog/2015/04/24/what-a-distributed-version-controlled-ARP-cache-gets-you/&#34;&gt;What a Distributed, Version-Controlled ARP Cache Gets You&lt;/a&gt;, as well as &lt;a href=&#34;https://github.com/yomimono/simple-nat&#34;&gt;an Irmin-ified NAT device&lt;/a&gt; that I haven&amp;rsquo;t yet written up here.)  The &lt;a href=&#34;http://decks.openmirage.org/ocaml15-irminnet&#34;&gt;slides for my OCaml Workshop talk&lt;/a&gt; are also available.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fun with Opam: Advice to my Past Self</title>
      <link>http://localhost:1313/blog/2015/07/27/fun-with-opam-advice-to-my-past-self/</link>
      <pubDate>Mon, 27 Jul 2015 10:13:10 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/07/27/fun-with-opam-advice-to-my-past-self/</guid>
      <description>&lt;p&gt;Most instructions on how to get started with OCaml packages now advise the user to get started with &lt;a href=&#34;http://opam.ocaml.org/&#34;&gt;opam&lt;/a&gt;, which is excellent advice.  Getting up and running with opam is pretty easy, but I wasn&amp;rsquo;t sure where to go from there when I wanted to &lt;em&gt;modify&lt;/em&gt; other people&amp;rsquo;s packages and use the modifications in my environment.  I wish I&amp;rsquo;d realized that &lt;a href=&#34;http://opam.ocaml.org/doc/Packaging.html&#34;&gt;the documentation for making packages&lt;/a&gt; has a lot of applicable advice for that use case, as well as the apparent target (making your own packges from scratch).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Retrospective</title>
      <link>http://localhost:1313/blog/2015/07/20/retrospective/</link>
      <pubDate>Mon, 20 Jul 2015 00:09:32 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/07/20/retrospective/</guid>
      <description>&lt;p&gt;In 2014, I spent 12 weeks at &lt;a href=&#34;https://www.recurse.com&#34;&gt;the Recurse Center&lt;/a&gt;, formerly (and at the time) known as Hacker School.  After finishing up my time there in May of that year, a lot of people asked me reasonable questions like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How was the Recurse Center?&lt;/li&gt;&#xA;&lt;li&gt;Was attending RC worth your time?&lt;/li&gt;&#xA;&lt;li&gt;What did you learn at the Recurse Center?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;My response to these questions was &amp;ldquo;I don&amp;rsquo;t know yet!  It&amp;rsquo;s too early to say.&amp;rdquo;  Now that more than a year has passed, I think I might have some idea of where to start.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What a Distributed, Version-Controlled ARP Cache Gets You</title>
      <link>http://localhost:1313/blog/2015/04/24/what-a-distributed-version-controlled-ARP-cache-gets-you/</link>
      <pubDate>Fri, 24 Apr 2015 16:45:11 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/04/24/what-a-distributed-version-controlled-ARP-cache-gets-you/</guid>
      <description>&lt;p&gt;&lt;code&gt;git&lt;/code&gt; (and its distributed version control system friends &lt;code&gt;hg&lt;/code&gt; and &lt;code&gt;darcs&lt;/code&gt;) have some great properties.  Not only do you get a full history of changes on objects stored in them, you can get comments on changes, as well as branching and merging, which lets you do intermediate changes without messing up state for other entities which want to work with the repository.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s all pretty cool.  I actually want that for some of my data structures, come to think of it.  Say, for example, a boring ol&amp;rsquo; key-value store which can be updated from a few different threads &amp;ndash; in this case, a cache that stores values it gets from the network and the querying/timeout code around it.  It would be nice if each thread could make a new branch, make its changes, then merge them into the primary branch once it&amp;rsquo;s done.&lt;/p&gt;&#xA;&lt;p&gt;It turns out you can totally do that with &lt;a href=&#34;https://github.com/mirage/irmin&#34;&gt;Irmin&lt;/a&gt;, &amp;ldquo;the database that never forgets&amp;rdquo;!  I did (and am still doing) a bit of work on sticking a modified version of the MirageOS address resolution protocol code&amp;rsquo;s data structures into Irmin:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ git log --all --decorate --oneline --graph&#xA;* 68216f3 (HEAD, primary, expire_1429688434.645130) Arp.tick: updating to age out old entries&#xA;* ec10c9a entry added: 192.168.3.1 -&amp;gt; 02:50:2a:16:6d:01&#xA;* 6446cef entry added: 10.20.254.2 -&amp;gt; 02:50:2a:16:6d:01&#xA;* 81cfa43 entry added: 10.50.20.22 -&amp;gt; 02:50:2a:16:6d:01&#xA;*   4e1e1c7 Arp.tick: merge expiry branch&#xA;|\  &#xA;| * cd787a0 (expire_1429688374.601896) Arp.tick: updating to age out old entries&#xA;* | 8df2ef7 entry added: 10.23.10.1 -&amp;gt; 02:50:2a:16:6d:01&#xA;|/  &#xA;* 8d11bba Arp.create: Initial empty cache&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Let&#39;s Play Network Address Translation: The Home Game</title>
      <link>http://localhost:1313/blog/2015/04/02/lets-play-network-address-translation/</link>
      <pubDate>Thu, 02 Apr 2015 14:53:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/04/02/lets-play-network-address-translation/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://localhost:1313/blog/2015/04/05/things-routers-do-network-address-translation/&#34;&gt;When last we spoke&lt;/a&gt;, I left you with a teaser about writing your own NAT implementation.  &lt;code&gt;iptables&lt;/code&gt; (and friends &lt;code&gt;nftables&lt;/code&gt; and &lt;code&gt;pf&lt;/code&gt;, to be a little less partisan and outdated) provide the interfaces to the kernel modules that implement NAT in many widely-used routers.  If we wanted to implement our own in a traditional OS, we&amp;rsquo;d have to either &lt;a href=&#34;http://kernelnewbies.org/FAQ&#34;&gt;take a big dive into kernel programming&lt;/a&gt; or &lt;a href=&#34;https://github.com/pkelsey/libuinet&#34;&gt;find a way to manipulate packets at the Ethernet layer in userspace&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;But if all we need to do is NAT traffic, why not just build something that only knows how to NAT traffic?  I&amp;rsquo;ve looked at building networked applications on top of (and with) the full network stack provided by the &lt;a href=&#34;http://openmirage.org&#34;&gt;MirageOS&lt;/a&gt; library OS a lot, but we can also build lower-level applications with fundamentally the same programming tactics and tools we use to write, for example, &lt;a href=&#34;http://hh360.user.srcf.net/blog/2015/03/part-3-running-your-own-dns-resolver-with-mirageos/&#34;&gt;DNS resolvers&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;building-a-typical-stack-from-scratch&#34;&gt;Building A Typical Stack From Scratch&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s have a look at the &lt;code&gt;ethif-v4&lt;/code&gt; example in the &lt;a href=&#34;http://github.com/mirage/mirage-skeleton&#34;&gt;mirage-skeleton example repository&lt;/a&gt;.  This example unikernel shows how to build a network stack &amp;ldquo;by hand&amp;rdquo; from a bunch of different functors, starting from a physical device (provided by &lt;code&gt;config.ml&lt;/code&gt; at build time, representing either a Xen backend if you configure with &lt;code&gt;mirage configure --xen&lt;/code&gt; or a Unix tuntap backend if you build with &lt;code&gt;mirage configure --unix&lt;/code&gt;).  I&amp;rsquo;ve reproduced the network setup bits from &lt;a href=&#34;https://github.com/mirage/mirage-skeleton/blob/694162bfa37b055786a1f4a0bb4c9ca7f08c9ef0/ethifv4/unikernel.ml&#34;&gt;the most recent version as of now&lt;/a&gt; and annotated them a bit:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Things Routers Do: Network Address Translation</title>
      <link>http://localhost:1313/blog/2015/04/01/things-routers-do-network-address-translation/</link>
      <pubDate>Wed, 01 Apr 2015 11:40:47 +0000</pubDate>
      <guid>http://localhost:1313/blog/2015/04/01/things-routers-do-network-address-translation/</guid>
      <description>&lt;p&gt;WiFi is fairly ubiquitous in 2015.  In most of the nonprofessional contexts in which we use it, it&amp;rsquo;s provided by a small box that&amp;rsquo;s plugged into mains power and an Ethernet cable, usually with an antenna or two sticking out of it.  I&amp;rsquo;ve heard these boxes called all kinds of things - hotspots, middleboxes, edge routers, home routers, NAT devices, gateways, and probably a few more I&amp;rsquo;ve forgotten; there are surely more I haven&amp;rsquo;t heard.  &amp;ldquo;Router&amp;rdquo; is the word I hear and use most often myself, despite the unfortunate overlap with a more specific meaning (a device with multiple network links, capable of sending traffic between them).  There are an awful lot of things these boxes do which aren&amp;rsquo;t implied by &amp;ldquo;router&amp;rdquo;!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some Random Idiot</title>
      <link>http://localhost:1313/blog/2014/10/22/some-random-idiot/</link>
      <pubDate>Wed, 22 Oct 2014 17:14:25 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/10/22/some-random-idiot/</guid>
      <description>&lt;p&gt;My first interesting job was as a student systems administrator for a fairly heterogenous group of UNIX servers.  For the first many months, I was essentially a clever interface to an array of search engines.  I came to have a great appreciation for the common phenomenon of a detailed solution to a very specific problem, laid out beautifully in the personal site of someone I&amp;rsquo;d never met.  I answered a lot of &amp;ldquo;how on Earth did you figure that out?&amp;rdquo; with &amp;ldquo;somebody on the Internet wrote about it&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Virtualization: WTF</title>
      <link>http://localhost:1313/blog/2014/10/07/virtualization-wtf/</link>
      <pubDate>Tue, 07 Oct 2014 14:13:03 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/10/07/virtualization-wtf/</guid>
      <description>&lt;p&gt;For reasons that don&amp;rsquo;t need exploring at this juncture, I decided to start reading through &lt;a href=&#34;http://pages.cs.wisc.edu/~remzi/Classes/838/Spring2013/&#34;&gt;a bunch of papers on virtualization&lt;/a&gt;, and I thought I&amp;rsquo;d force myself to actually do it by publicly committing to blogging about them.&lt;/p&gt;&#xA;&lt;p&gt;First on deck is &lt;a href=&#34;http://web.stanford.edu/class/cs240/readings/disco.pdf&#34;&gt;Disco: Running Commodity Operating Systems on Scalable Multiprocessors&lt;/a&gt;, a paper from 1997 that itself &amp;ldquo;brings back an idea popular in the 1970s&amp;rdquo; &amp;ndash; run a small virtualization layer between hardware and multiple virtual machines (referred to in the paper as a virtual machine monitor; &amp;ldquo;hypervisor&amp;rdquo; in more modern parlance).  Disco was aimed at allowing software to take advantage of new hardware innovations without requiring huge changes in the operating system.  I can speculate on a few reasons this paper&amp;rsquo;s first in the list:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;if you have a systems background, most of it is intelligible with some brow-furrowing&lt;/li&gt;&#xA;&lt;li&gt;it goes into a useful level of detail on the actual work of intercepting, rewriting, and optimizing host operating systems&amp;rsquo; access to hardware resources&lt;/li&gt;&#xA;&lt;li&gt;the authors went on to found VMware, a massively successful virtualization company&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I read the paper intending to summarize it for this blog, but I got completely distracted by the paper&amp;rsquo;s motivation, which I found both interesting and unexpected.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OPW FIN</title>
      <link>http://localhost:1313/blog/2014/08/22/opw-fin/</link>
      <pubDate>Fri, 22 Aug 2014 12:56:15 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/22/opw-fin/</guid>
      <description>&lt;p&gt;We&amp;rsquo;ve come to the end of my round of the &lt;a href=&#34;http://gnome.org/opw&#34;&gt;Outreach Program for Women&lt;/a&gt;, which sponsored my work with &lt;a href=&#34;http://www.openmirage.org&#34;&gt;the MirageOS folks&lt;/a&gt; this summer.  I was fortunate to be able to mark the occasion by joining my mentors and an awful lot of badass Xen hackers at the &lt;a href=&#34;http://events.linuxfoundation.org/events/xen-project-developer-summit&#34;&gt;Xen Project Developers Summit&lt;/a&gt; earlier this week, where I waved my extremely conspicuous American accent around in everyone&amp;rsquo;s face and saw some awesome presentations on Xen internals and research.  (&lt;a href=&#34;http://xenprojectdevelopersummit2014.sched.org/event/f08246d3babd972179ee05d4b310bd29?iframe=yes&amp;amp;w=i:0;&amp;amp;sidebar=yes&amp;amp;bg=no&#34;&gt;Xen on ARM is relatively performant!&lt;/a&gt;  &lt;a href=&#34;http://xenprojectdevelopersummit2014.sched.org/event/6cd3b3f8cacc3b711e22f8bcb418edbf?iframe=yes&amp;amp;w=i:100;&amp;amp;sidebar=yes&amp;amp;bg=no&#34;&gt;It&amp;rsquo;s hard to run 10,000 host VMs!&lt;/a&gt;  &lt;a href=&#34;http://xenprojectdevelopersummit2014.sched.org/event/fc33354584e57a307ccac0bae5fb0b2f?iframe=yes&amp;amp;w=i:0;&amp;amp;sidebar=yes&amp;amp;bg=no&#34;&gt;The HaLVM has already implemented a whole bunch of stuff I was thinking about doing!&lt;/a&gt;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>I Am Unikernel (And So Can You!)</title>
      <link>http://localhost:1313/blog/2014/08/17/i-am-unikernel/</link>
      <pubDate>Sun, 17 Aug 2014 23:47:13 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/17/i-am-unikernel/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://jvns.ca&#34;&gt;Julia Evans,&lt;/a&gt; prolific blogger and rad person, gave me several kind comments on the &amp;ldquo;Why I Unikernel&amp;rdquo; posts (&lt;a href=&#34;http://localhost:1313/blog/2014/08/11/attack-surface-area/&#34;&gt;security&lt;/a&gt;, &lt;a href=&#34;http://localhost:1313/blog/2014/08/14/my-content-is-mine/&#34;&gt;self-hosting&lt;/a&gt;).  She also asked, quite reasonably, whether I&amp;rsquo;d written a high-level summary of how I host my blog from a unikernel.  &amp;ldquo;No, but I should,&amp;rdquo; I said, and unlike most times I say I should do something, I actually did it.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the very-high-level overview:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;use brain to generate content that some human, somewhere, might want to read (hardest step)&lt;/li&gt;&#xA;&lt;li&gt;write all that stuff in Markdown&lt;/li&gt;&#xA;&lt;li&gt;use &lt;a href=&#34;http://www.octopress.org&#34;&gt;Octopress&lt;/a&gt; to generate a static site from that Markdown&lt;/li&gt;&#xA;&lt;li&gt;use &lt;a href=&#34;http://www.openmirage.org&#34;&gt;Mirage&lt;/a&gt; to build a unikernel with the blog content&lt;/li&gt;&#xA;&lt;li&gt;upload the unikernel to an EC2 instance running Linux&lt;/li&gt;&#xA;&lt;li&gt;build a new EC2 instance from the uploaded unikernel&lt;/li&gt;&#xA;&lt;li&gt;make sure that newly generated instance looks like my website with new content&lt;/li&gt;&#xA;&lt;li&gt;shut down the Linux host that made the new EC2 instance&lt;/li&gt;&#xA;&lt;li&gt;make &lt;code&gt;somerandomidiot.com&lt;/code&gt; point to the new EC2 instance&lt;/li&gt;&#xA;&lt;li&gt;kill the EC2 instance which previously served &lt;code&gt;somerandomidiot.com&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And below, one can find the gory details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Content is Mine: Why I Unikernel, Part 2</title>
      <link>http://localhost:1313/blog/2014/08/13/my-content-is-mine/</link>
      <pubDate>Wed, 13 Aug 2014 15:33:52 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/13/my-content-is-mine/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://localhost:1313/blog/2014/08/11/attack-surface-area/&#34;&gt;Having a machine capable of executing arbitrary instructions on the public Internet is a responsibility&lt;/a&gt;, and it&amp;rsquo;s a fairly heavy one to assume just to run a blog.  Some people solve this by letting someone else take care of it &amp;ndash; GitHub, Tumblr, or Medium, for example.  I&amp;rsquo;m not so keen on that solution for a number of reasons, almost none of which are Internet-old-person crankery.&lt;/p&gt;&#xA;&lt;p&gt;First, and most emotionally: as dumb as my thoughts are, they&amp;rsquo;re &lt;em&gt;mine&lt;/em&gt;.  Not GitHub&amp;rsquo;s or Medium&amp;rsquo;s or any other group&amp;rsquo;s.  Most entities on the web don&amp;rsquo;t host user content out of the goodness of their heart; they&amp;rsquo;re getting something out of it, and it&amp;rsquo;s likely that they&amp;rsquo;re getting more out of it than the user is.  I&amp;rsquo;m reminded of the old MetaFilter maxim: &amp;ldquo;If you&amp;rsquo;re not paying for it, you&amp;rsquo;re not the consumer, you&amp;rsquo;re the product.&amp;rdquo;  Either someone&amp;rsquo;s making money off of you now or &lt;a href=&#34;http://idlewords.com/bt14.htm#ads&#34;&gt;they plan to do it later&lt;/a&gt;.  I don&amp;rsquo;t want to encourage that kind of behavior.  I just want to write things that people can read about how to make stuff work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Attack Surface: Why I Unikernel, Part 1</title>
      <link>http://localhost:1313/blog/2014/08/08/attack-surface-area/</link>
      <pubDate>Fri, 08 Aug 2014 14:17:43 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/08/attack-surface-area/</guid>
      <description>&lt;p&gt;Before I started this blog, I had started a few others at &lt;!-- raw HTML omitted --&gt;my other domain&lt;!-- raw HTML omitted --&gt; (now moribund).  Despite repeated attempts, I never could resign myself to doing systems administration for a web server that executed dynamic code, like that which powers WordPress or Drupal; I&amp;rsquo;d install such a framework, begin &lt;a href=&#34;http://blog.softlayer.com/2012/tips-and-tricks-how-to-secure-wordpress/&#34;&gt;locking the site down&lt;/a&gt;, realize that I&amp;rsquo;d spent a lot of time reassuring myself that the site was secure without believing it for a second, then delete the framework and revert the frontpage to an &lt;code&gt;index.html&lt;/code&gt; rather like what&amp;rsquo;s present there now.  Particularly ambitious iterations would get a post or two published before this cycle completed, now long-vanished.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Doing Nothing in Mirage</title>
      <link>http://localhost:1313/blog/2014/07/25/doing-nothing-in-mirage/</link>
      <pubDate>Fri, 25 Jul 2014 13:30:49 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/07/25/doing-nothing-in-mirage/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s Northern Hemisphere summer right now, and in Wisconsin we&amp;rsquo;re having one of the loveliest ones I can remember.  Today the temperature is hovering right at pleasant, there are high clouds blowing across the sky, the breeze is soothing, and birds are singing all over the place.  It is not, in short, programming weather.  It is sit-outside, read-a-novel, do-nothing weather.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://flic.kr/p/jWqcS&#34;&gt;&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;http://localhost:1313/images/bicycle_tree.jpg&#34;&#xA;    alt=&#34;Sunbeams stream through the leaves of a large tree, beneath which is a bicycle.&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;Yes, this sort of thing.&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;We don&amp;rsquo;t often let our programs slack off, even when we let ourselves take a peaceful day.  I got to wondering (staring off into space, watching the shadows cast by sun-dappled leaves) what the most trivial, do-nothing Mirage project would look like, and how it could be constructed with a minimum of activity and a maximum of understanding.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~$ mkdir trivial&#xA;[] dothraki@iBook:~$ cd trivial/&#xA;[] dothraki@iBook:~/trivial$ ls -alh&#xA;total 16K&#xA;drwxrwxr-x   2 dothraki dothraki 4.0K Jul 23 13:17 .&#xA;drwxr-xr-x 161 dothraki dothraki  12K Jul 23 13:17 ..&#xA;[] dothraki@iBook:~/trivial$ mirage configure --xen&#xA;[ERROR]      No configuration file config.ml found.&#xA;You&amp;#39;ll need to create one to let Mirage know what to do.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Okay, we&amp;rsquo;ll have to do at least one thing to make this work.  Mirage uses &lt;code&gt;config.ml&lt;/code&gt; to programmatically generate a &lt;code&gt;Makefile&lt;/code&gt; and &lt;code&gt;main.ml&lt;/code&gt; when you invoke &lt;code&gt;mirage --configure&lt;/code&gt;.  &lt;code&gt;main.ml&lt;/code&gt; uses instructions from &lt;code&gt;config.ml&lt;/code&gt; to satisfy module types representing driver requirements for your application, then begins running the threads you requested that it run.  That all sounds an awful lot like work; maybe we can get away with not asking for anything.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~/trivial$ touch config.ml&#xA;[] dothraki@iBook:~/trivial$ mirage configure --xen&#xA;Mirage      Using scanned config file: config.ml&#xA;Mirage      Processing: /home/dothraki/trivial/config.ml&#xA;Mirage      =&amp;gt; rm -rf /home/dothraki/trivial/_build/config.*&#xA;Mirage      =&amp;gt; cd /home/dothraki/trivial &amp;amp;&amp;amp; ocamlbuild -use-ocamlfind -tags annot,bin_annot -pkg mirage config.cmxs&#xA;empty       Using configuration: /home/dothraki/trivial/config.ml&#xA;empty       0 jobs []&#xA;empty       =&amp;gt; ocamlfind printconf path&#xA;empty       Generating: main.ml&#xA;empty       Now run &amp;#39;make depend&amp;#39; to install the package dependencies for this unikernel.&#xA;[] dothraki@iBook:~/trivial$ ls&#xA;_build  config.ml  empty.xl  log  main.ml  Makefile&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That seems like a great start!  Maybe we can trivially achieve our dream of doing nothing.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~/trivial$ make depend&#xA;opam install mirage-xen --verbose&#xA;[NOTE] Package mirage-xen is already installed (current version is 1.1.1).&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Resting on our laurels.  Excellent.  (In keeping with the lazy theme of this post, I&amp;rsquo;ll elide the &lt;code&gt;make depend&lt;/code&gt; step from future examples, but if you&amp;rsquo;re playing along at home you may discover that you need to run it when you introduce new complexity in pursuit of perfect non-action.)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~/trivial$ make&#xA;ocamlbuild -classic-display -use-ocamlfind -pkgs lwt.syntax,mirage-types.lwt -tags &amp;#34;syntax(camlp4o),annot,bin_annot,strict_sequence,principal&amp;#34; -cflag -g -lflags -g,-linkpkg,-dontlink,unix main.native.o&#xA;ocamlfind ocamldep -package mirage-types.lwt -package lwt.syntax -syntax camlp4o -modules main.ml &amp;gt; main.ml.depends&#xA;ocamlfind ocamlc -c -g -annot -bin-annot -principal -strict-sequence -package mirage-types.lwt -package lwt.syntax -syntax camlp4o -o main.cmo main.ml&#xA;+ ocamlfind ocamlc -c -g -annot -bin-annot -principal -strict-sequence -package mirage-types.lwt -package lwt.syntax -syntax camlp4o -o main.cmo main.ml&#xA;File &amp;#34;main.ml&amp;#34;, line 8, characters 2-13:&#xA;Error: Unbound module OS&#xA;Command exited with code 2.&#xA;make: *** [main.native.o] Error 10&#xA;[] dothraki@iBook:~/trivial$ &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oh, bother.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Set the Evil Bit</title>
      <link>http://localhost:1313/blog/2014/07/08/how-to-set-the-evil-bit/</link>
      <pubDate>Tue, 08 Jul 2014 15:23:55 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/07/08/how-to-set-the-evil-bit/</guid>
      <description>&lt;p&gt;Our mission: fuzzing &lt;a href=&#34;http://localhost:1313/blog/2014/07/07/parsers-optional/&#34;&gt;TCP options&lt;/a&gt; from &lt;code&gt;scapy&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Our target: the &lt;code&gt;echo&lt;/code&gt; service from &lt;code&gt;mirage-tcpip/examples/services.ml&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Outcome: a revision on a widely-used OCaml dependency, gleeful murder and resurrection of several EC2 instances, something to brag to my mom about, a look at a case worse than failure, and great justice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Parsers Optional</title>
      <link>http://localhost:1313/blog/2014/07/07/parsers-optional/</link>
      <pubDate>Mon, 07 Jul 2014 12:49:38 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/07/07/parsers-optional/</guid>
      <description>&lt;p&gt;Friends, I have spoken to you of &lt;a href=&#34;http://localhost:1313/blog/2014/06/03/the-minnesota-goodbye/&#34;&gt;TCP&lt;/a&gt; and of &lt;a href=&#34;http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/&#34;&gt;fuzzing&lt;/a&gt;.  Next I will speak to you of both, but today, I will speak to you of TCP options.  If you&amp;rsquo;re here for the pwnage, sit tight; it&amp;rsquo;s coming.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-even-is-tcp-anyway&#34;&gt;What Even Is TCP Anyway&lt;/h3&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the lazy way of explaining it: TCP is the abstraction layer that allows you to pretend that network communication works in a logical, orderly, reliable fashion when you&amp;rsquo;re writing an application.  Reading data and having it always be in the order it was sent?  TCP.  Being able to know whether a connection is open or closed?  TCP.  Knowing the difference between data coming from two separate processes on the same remote host?  TCP.  (There are other ways to get these guarantees, but the vast majority of Internet traffic that needs them gets them via TCP.)&lt;/p&gt;&#xA;&lt;p&gt;On a less abstract level, TCP is a header (one of several!) that your operating system slaps on your network traffic before shipping it over the wire, on the way to its final destination.  For damn near all the information on TCP you can shake a stick at, you can consult &lt;a href=&#34;http://www.rfc-editor.org/rfc/rfc793.txt&#34;&gt;RFC 793&lt;/a&gt; directly.  The header summary, most relevant for our exploration, is reproduced below:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0                   1                   2                   3   &#xA;0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 &#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|          Source Port          |       Destination Port        |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                        Sequence Number                        |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                    Acknowledgment Number                      |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|  Data |           |U|A|P|R|S|F|                               |&#xA;| Offset| Reserved  |R|C|S|S|Y|I|            Window             |&#xA;|       |           |G|K|H|T|N|N|                               |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|           Checksum            |         Urgent Pointer        |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                    Options                    |    Padding    |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                             data                              |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Everything here is a fixed-length field except for &lt;code&gt;Options&lt;/code&gt;, &lt;code&gt;Padding&lt;/code&gt;, and &lt;code&gt;data&lt;/code&gt;, all of which are optional.  &lt;code&gt;Data&lt;/code&gt; is up to the application, when it&amp;rsquo;s present (and is also frequently referred to as &lt;code&gt;payload&lt;/code&gt;).  When you loaded this web page, TCP packets were sent from my server at &lt;code&gt;somerandomidiot.com&lt;/code&gt; to your computer, and the contents of the &lt;code&gt;data&lt;/code&gt; field were these very words that you&amp;rsquo;re reading right now.  TCP is &lt;code&gt;data&lt;/code&gt;-agnostic; it only cares that your payload arrives intact, not what&amp;rsquo;s in it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Options&lt;/code&gt;, on the other hand, are very much TCP&amp;rsquo;s concern.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hacking Your Hacker School T-Shirt</title>
      <link>http://localhost:1313/blog/2014/06/25/hacking-your-hacker-school-t-shirt/</link>
      <pubDate>Wed, 25 Jun 2014 16:01:55 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/06/25/hacking-your-hacker-school-t-shirt/</guid>
      <description>&lt;figure class=&#34;left&#34;&gt;&lt;img src=&#34;http://localhost:1313/images/blink-shirt/blinky.gif&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;On the last day of our &lt;a href=&#34;http://www.hackerschool.com&#34;&gt;Hacker School&lt;/a&gt; batch, we got some cool commemorative T-shirts with the stylish Hacker School logo on them.  Now, this is an excellent T-shirt, and the only way I know of to get an official one is to attend the last day of a batch of Hacker School, so it&amp;rsquo;s already a pretty rad shirt.  I wanted to make it radder, and I did, and now I want to tell you how.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Minnesota Goodbye</title>
      <link>http://localhost:1313/blog/2014/06/03/the-minnesota-goodbye/</link>
      <pubDate>Tue, 03 Jun 2014 13:28:43 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/06/03/the-minnesota-goodbye/</guid>
      <description>&lt;p&gt;Looking into some of the &lt;a href=&#34;http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/&#34;&gt;results from last week&amp;rsquo;s fuzzing session&lt;/a&gt;, I noticed something interesting:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ tcpdump -r experimenting_with_pathoc.pcap &amp;#39;src host 192.168.2.24 and tcp[13] &amp;amp; 1 != 0&amp;#39;&#xA;reading from file experimenting_with_pathoc.pcap, link-type EN10MB (Ethernet)&#xA;$&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s translate that into human.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;tcpdump -r experimenting_with_pathoc.pcap&lt;/code&gt;: use &lt;a href=&#34;http://www.danielmiessler.com/study/tcpdump/&#34;&gt;tcpdump&lt;/a&gt; to read an existing packet trace named &lt;code&gt;experimenting_with_pathoc.pcap&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;src host 192.168.2.24&lt;/code&gt;: show me only packets that were sent by &lt;code&gt;192.168.2.24&lt;/code&gt;, which is the IP address of a running unikernel that&amp;rsquo;s serving web pages on port 80.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;and tcp[13] &amp;amp; 1 != 0&lt;/code&gt;: of the packets sent by &lt;code&gt;192.168.2.24&lt;/code&gt;, show me only those where the least significant bit of the 13th byte of the TCP header was not zero.  The 13th byte of the TCP header is designated for flags relevant to how the packet should be processed by the &lt;a href=&#34;http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm&#34;&gt;TCP state machine&lt;/a&gt;, and the least significant bit corresponds to the &lt;code&gt;FIN&lt;/code&gt; flag, used to initiate graceful connection closures.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;All together, &amp;ldquo;show me all the packets sent by 192.168.2.24 which initiated a graceful connection closure.&amp;rdquo;  &lt;code&gt;tcpdump&lt;/code&gt; helpfully shows us&amp;hellip; all zero such packets in the trace.&lt;/p&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t necessarily wrong for a webserver implementing HTTP/1.1, which defaults to persistent connections:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;8.1.2 Overall Operation&lt;/p&gt;&#xA;&lt;p&gt;A significant difference between HTTP/1.1 and earlier versions of&#xA;HTTP is that persistent connections are the default behavior of any&#xA;HTTP connection. That is, unless otherwise indicated, the client&#xA;SHOULD assume that the server will maintain a persistent connection,&#xA;even after error responses from the server.&#xA;&amp;ndash; RFC 2616&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So let&amp;rsquo;s make something that &lt;em&gt;will&lt;/em&gt; try to initiate a connection closure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Throwing Some Fuzzy Dice</title>
      <link>http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/</link>
      <pubDate>Thu, 22 May 2014 10:42:56 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/</guid>
      <description>&lt;p&gt;I mentioned &lt;a href=&#34;http://localhost:1313/blog/2014/04/23/verb-your-own-noun/index.html&#34;&gt;a while ago&lt;/a&gt; that the &lt;a href=&#34;http://www.openmirage.org&#34;&gt;Mirage project&lt;/a&gt; agreed to have me on board, through the &lt;a href=&#34;https://opw.gnome.org&#34;&gt;OPW internship project&lt;/a&gt;, for the summer.  We started on Monday, and I&amp;rsquo;ve already had a lot of fun!&lt;/p&gt;&#xA;&lt;p&gt;Officially, my job for the summer is to help shore up the network stack in Mirage, in part by running the current code through its paces, and in part through implementing some new functionality.  This first week, I continued some work I started at the end of Hacker School - figuring out how to fuzz some strange (and not-so-strange) corners, and how to wrangle the data I got out of doing so.&lt;/p&gt;&#xA;&lt;h2 id=&#34;fuzz-what-now&#34;&gt;Fuzz What Now?&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s step back.  Way, way, way back.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re a computer program, and you have some data that you care about, your data is likely in some kind of structure reflecting an underlying order to that data.  Objects are a common way to organize this stuff; dictionaries, hashmaps, lists, arrays, trees, the list goes on.  That&amp;rsquo;s all well and good when your program is running, keeping all this stuff in memory.  But it happens depressingly often that you need to dump this stuff to permanent storage, or express it in some way to some other program or another computer, or represent it on the screen because something awful has happened, and you can&amp;rsquo;t just say &amp;ldquo;&lt;code&gt;memory address 0x52413abd&lt;/code&gt;, &lt;code&gt;memory address 0x52413cda&lt;/code&gt;, &lt;code&gt;memory address 0x52413ea2&lt;/code&gt;&amp;rdquo; - these things are meaningless outside the context of the current run of that program.&lt;/p&gt;&#xA;&lt;p&gt;So we have &lt;a href=&#34;https://en.wikipedia.org/wiki/Serialization&#34;&gt;serialization&lt;/a&gt;, the high-level concept for the jillion different ways to take that data and put it in a string, or a binary data format, so something else can read that string and reassemble the structure of the data.  That&amp;rsquo;s deserialization, which implies parsing; parsing is &lt;a href=&#34;https://en.wikipedia.org/wiki/Abstract_syntax_tree&#34;&gt;a pretty big deal&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When the data you&amp;rsquo;re attempting to assemble into a structure is as you expect it and everything is correct, parsing&amp;rsquo;s no problem.  But it frequently happens that everything is not as you expect it, for any number of reasons - the programmer who made the program that made the message made a mistake; the programmer who made the program that reads the message made a mistake; the programs reading and writing the message are using different versions of the specification in the first place; the specification wasn&amp;rsquo;t specific about whether the third byte&amp;rsquo;s range from 0 to 5 was inclusive or exclusive and each programmer made a different decision; both programs agree, but the message was corrupted in transit; the message was corrupted in transit, and one program has implemented a different corruption recovery algorithm than the other&amp;hellip; I&amp;rsquo;ll stop now, but I could keep going for a long time.&lt;/p&gt;&#xA;&lt;p&gt;There are a lot of bad messages out there.  It&amp;rsquo;s hard to make your parser do the right thing when it receives an arbitrary bad message.  It can be hard to even know that your parser does the &lt;em&gt;wrong&lt;/em&gt; thing when it receives an arbitrary bad message - if you thought of a certain kind of bad message to use in testing, of course you fixed your code to deal with it; you thought of it!  But there are almost certainly loads more bad messages out there than the ones you thought of - both by chance, and &lt;a href=&#34;http://insecure.org/sploits/ping-o-death.html&#34;&gt;by design&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If humans can&amp;rsquo;t make enough bad messages, maybe computers can.  Randomly generating a whole mess of bad messages, sending them to your program, and seeing what happens is called fuzz testing, and it&amp;rsquo;s awesome.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Verb Your Own Noun</title>
      <link>http://localhost:1313/blog/2014/04/23/verb-your-own-noun/</link>
      <pubDate>Wed, 23 Apr 2014 12:03:04 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/04/23/verb-your-own-noun/</guid>
      <description>&lt;p&gt;This blog has been running on a &lt;a href=&#34;http://www.openmirage.com&#34;&gt;Mirage OS unikernel&lt;/a&gt; hosted on &lt;a href=&#34;http://ec2.aws.amazon.com&#34;&gt;Amazon EC2&lt;/a&gt; since April 3rd:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ec2-get-console-output --region the-best-region i-0123abcd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;2014-04-03T16:42:58+0000&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Xen Minimal OS!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In that time, I&amp;rsquo;ve done some stuff:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;submitted &lt;a href=&#34;http://www.github.com/mirage/mirage-tcpip/pull/48&#34;&gt;a successful pull request to Mirage&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;made a permanent home for &lt;a href=&#34;http://www.github.com/yomimono/glow-cloud&#34;&gt;Secret Project Glow Cloud&amp;rsquo;s code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;successfully applied to &lt;a href=&#34;https://gnome.org/opw/&#34;&gt;the Outreach Program for Women&lt;/a&gt; to work on Mirage some more&lt;/li&gt;&#xA;&lt;li&gt;broke and fixed my OCaml development environment repeatedly&lt;/li&gt;&#xA;&lt;li&gt;sang in public in front of other Hacker Schoolers&lt;/li&gt;&#xA;&lt;li&gt;looked at &lt;a href=&#34;http://www.metmuseum.org&#34;&gt;a lot&lt;/a&gt; of &lt;a href=&#34;http://www.brooklynmuseum.org&#34;&gt;neat objects&lt;/a&gt; and &lt;a href=&#34;http://www.themorgan.org&#34;&gt;buildings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;started work on a &lt;a href=&#34;https://www.owasp.org/index.php/Fuzzing&#34;&gt;fuzzing&lt;/a&gt; framework to scratch my own itch for testing network clients&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I figured it was time to tell you about some of it, but first I did some other stuff:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;upgraded some packages on my build machine&lt;/li&gt;&#xA;&lt;li&gt;broke the build on my blog&lt;/li&gt;&#xA;&lt;li&gt;learned about how Mirage makefiles are generated by trying to get mine working again&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;You&amp;rsquo;d rather hear about all of that, right?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tying the Knot</title>
      <link>http://localhost:1313/blog/2014/04/02/tying-the-knot/</link>
      <pubDate>Wed, 02 Apr 2014 14:58:53 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/04/02/tying-the-knot/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;This is a pretty strange piece of code,&#xA;and it may take a few moments of thought&#xA;to figure out what&amp;rsquo;s going on.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; Real World OCaml&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;A few weeks ago, &lt;a href=&#34;http://chenlin.io&#34;&gt;fellow Hacker Schooler Chen Lin&lt;/a&gt; and I were trying to solve a simple graph problem in Haskell.  I was all ready to charge forward with something quite like &lt;a href=&#34;http://pages.cs.wisc.edu/~siff/CS367/Notes/graphs.html&#34;&gt;the Java implementation I learned back in undergrad&lt;/a&gt;, but my fellow Hacker Schooler had some hesitation around whether this kind of structure would work in Haskell.&lt;/p&gt;&#xA;&lt;p&gt;After a little bit of Googling, I found out that the canonical solution in Haskell involves something intriguingly dubbed &lt;a href=&#34;http://www.haskell.org/haskellwiki/Tying_the_Knot&#34;&gt;tying the knot&lt;/a&gt;.  I stared blankly at this HaskellWiki page with my fellow Hacker Schooler, trying to understand it quickly enough to have a useful conversation about it, and failed.  We threw a couple of other ideas around and then decided to both pursue other projects.  I moved on, Chen moved on, and I&amp;rsquo;m not sure either of us thought much about it&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;until yesterday, when I ran into &lt;a href=&#34;https://realworldocaml.org/v1/en/html/imperative-programming-1.html#memoization-and-dynamic-programming&#34;&gt;tying the knot&lt;/a&gt; again.  This time, it was hiding deep within (of all things!) the chapter on imperative programming in &lt;a href=&#34;https://realworldocaml.org&#34;&gt;Real World OCaml&lt;/a&gt;, and I was unhurried and determined.  &amp;ldquo;Abstract concept, I am going to understand you &lt;em&gt;so hard&lt;/em&gt;,&amp;rdquo; I thought, jaw set.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Arriving At the Mirage</title>
      <link>http://localhost:1313/blog/2014/03/24/arriving-at-the-mirage/</link>
      <pubDate>Mon, 24 Mar 2014 17:57:37 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/03/24/arriving-at-the-mirage/</guid>
      <description>&lt;p&gt;When last we left our hero, I was strugging valiantly to get a &lt;a href=&#34;http://www.openmirage.org&#34;&gt;Mirage unikernel&lt;/a&gt; version of this blog running on Amazon EC2.  All unikernels built and shipped off to EC2 would begin booting, but never become pingable or reachable on TCP port 80.  &lt;code&gt;ec2-get-console-output&lt;/code&gt; on any instance running a Mirage unikernel would show the beginning stages of a &lt;a href=&#34;http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol&#34;&gt;DHCP transaction&lt;/a&gt;, then the disappointing &lt;code&gt;RX exn Invalid_argument(&amp;quot;String.sub&amp;quot;)&lt;/code&gt;, then&amp;hellip; silence.&lt;/p&gt;&#xA;&lt;p&gt;When all you had for many years was a hammer, stuff is still going to look an awful lot like nails to you, even if it&amp;rsquo;s pretty distinctly screw-shaped.  I wanted to take a &lt;a href=&#34;http://www.tcpdump.org&#34;&gt;packet trace&lt;/a&gt; of this transaction pretty badly.  I could do three things that were &lt;em&gt;almost&lt;/em&gt; like this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;get a packet trace of another machine getting a DHCP lease on EC2&lt;/li&gt;&#xA;&lt;li&gt;get a packet trace of a unikernel getting a DHCP lease on my local Xen server&lt;/li&gt;&#xA;&lt;li&gt;print out an awful lot of diagnostic data from the EC2 unikernel and read it from the console&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Trying to draw some conclusions from the first option above led me down the wrong path for about a day or so.  I did manage to cause the DHCP client to fail on my local Xen server by sending a DHCP reply packet with no &lt;code&gt;server-identifier&lt;/code&gt; set, using &lt;code&gt;scapy&lt;/code&gt; and some hackery to cause the &lt;code&gt;xid&lt;/code&gt; to always match:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Advancing Toward the Mirage</title>
      <link>http://localhost:1313/blog/2014/03/16/advancing-toward-the-mirage/</link>
      <pubDate>Sun, 16 Mar 2014 15:11:09 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/03/16/advancing-toward-the-mirage/</guid>
      <description>&lt;p&gt;I left off last time telling you about &lt;a href=&#34;http://localhost:1313/blog/2014/03/14/its-a-mirage/&#34;&gt;getting Mirage to not work&lt;/a&gt;.  I&amp;rsquo;m still working hard to get this blog &amp;ndash; yes, this one you&amp;rsquo;re reading now &amp;ndash; up and running as a unikernel on EC2.&lt;/p&gt;&#xA;&lt;p&gt;It became clear to me last week that I needed to fork my own instance of the &lt;code&gt;mirage-tcpip&lt;/code&gt; repository and compile my kernels with it, if I were to make any progress in debugging the DHCP problems I was having.  A few naive attempts to monkey with version of &lt;code&gt;mirage-tcpip&lt;/code&gt; downloaded by &lt;code&gt;opam&lt;/code&gt; weren&amp;rsquo;t successful, so I set about to figure out how actual OCaml developers develop in OCaml with &lt;code&gt;opam&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;First stop: &lt;a href=&#34;https://opam.ocaml.org/doc/Developing.html&#34;&gt;the opam documentation on doing tricky things.&lt;/a&gt;  This is a little short of a step-by-step &amp;ldquo;do this, dorp&amp;rdquo; guide, unfortunately; here&amp;rsquo;s what I end up doing, and it sorta seems to work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>It&#39;s a mirage! (Or, how to shave a yak.)</title>
      <link>http://localhost:1313/blog/2014/03/14/its-a-mirage/</link>
      <pubDate>Fri, 14 Mar 2014 15:53:00 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/03/14/its-a-mirage/</guid>
      <description>&lt;p&gt;A week or so ago, I heard about the &lt;a href=&#34;http://www.openmirage.org&#34;&gt;Mirage project&lt;/a&gt;, a library OS project that makes tiny virtual machines running on top of Xen to run a given application, and do nothing else.  I was intrigued, and started working through &lt;a href=&#34;http://www.openmirage.org/wiki/hello-world&#34;&gt;the excellent intro documentation&lt;/a&gt;, and got to the point where I wanted to replace my ho-hum statically-compiled blog hosted from &lt;a href=&#34;https://wiki.ubuntu.com/LTS&#34;&gt;Ubuntu LTS&lt;/a&gt; with a unikernel that would serve my static site and do nothing else.&lt;/p&gt;&#xA;&lt;p&gt;There are excellent instructions on doing this with a Jekyll site on &lt;a href=&#34;http://amirchaudhry.com/from-jekyll-to-unikernel-in-fifty-lines/&#34;&gt;Amir Chaudhry&amp;rsquo;s blog&lt;/a&gt;.  Octopress, which I use to generate this site, is built on top of Jekyll, and I only had a few extra goodies to throw in before I was able to make a unikernel that would run my blog with a few &lt;code&gt;rake&lt;/code&gt; invocations.  After getting the first unikernel up and running via Xen on my laptop, I entertained myself by throwing a few &lt;code&gt;nmap&lt;/code&gt; commands at it; I was particularly curious to see whether my unikernel knew what to do with UDP packets:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo nmap -sO 192.168.2.13&#xA;&#xA;Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-14 23:26 EDT&#xA;Nmap scan report for 192.168.2.13&#xA;Host is up (0.00037s latency).&#xA;Not shown: 254 open|filtered protocols&#xA;PROTOCOL STATE SERVICE&#xA;1        open  icmp&#xA;6        open  tcp&#xA;MAC Address: 00:16:3E:53:E0:1B (Xensource)&#xA;&#xA;Nmap done: 1 IP address (1 host up) scanned in 17.72 seconds&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Hee hee hee.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Finding Kitten</title>
      <link>http://localhost:1313/blog/2014/03/09/finding-kitten/</link>
      <pubDate>Sun, 09 Mar 2014 16:57:45 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/03/09/finding-kitten/</guid>
      <description>&lt;h2 id=&#34;robot-finds-kitten&#34;&gt;Robot Finds Kitten&lt;/h2&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;right&#34;&gt;&lt;img src=&#34;http://localhost:1313/images/digital_clock.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA; Sometime way back in the past, a human who wanted me to feel joy introduced me to &lt;a href=&#34;http://www.robotfindskitten.org&#34;&gt;Robot Finds Kitten&lt;/a&gt;, a Zen simulation which is pretty close to exactly what it says on the tin.  There are already &lt;a href=&#34;http://robotfindskitten.org/aw.cgi?main=software.rfk&#34;&gt;quite a lot of ports&lt;/a&gt; of the original POSIX implementation, but none of them were written in &lt;a href=&#34;http://elm-lang.org/&#34;&gt;Elm&lt;/a&gt;.  Obviously this is a problem that needs fixing.&lt;/p&gt;&#xA;&lt;p&gt;Before I get into the gory details of learning Elm via robots, I should tell you that my implementation is available for free play (edit: sorry, this has bitrotted too much to be included anymore), and &lt;a href=&#34;https://www.github.com/yomimono/elm-finds-kitten&#34;&gt;you can also go look at the source code&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;elm&#34;&gt;Elm&lt;/h2&gt;&#xA;&lt;p&gt;I got a really wonderful introduction to Elm when Evan Czaplicki came to &lt;a href=&#34;http://www.hackerschool.com&#34;&gt;Hacker School&lt;/a&gt; in our second week.  We got a slightly adapted version of &lt;a href=&#34;http://www.infoq.com/presentations/elm-reactive-programming&#34;&gt;this talk from StrangeLoop 2013&lt;/a&gt;, which moved me to make a browser game (something I&amp;rsquo;ve never wanted to do at any previous point in life).  The language seemed elegant and expressive, for lack of less cliched words, and I thought it might be relatively simple to make a succinct Robot Finds Kitten clone.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sometimes it&#39;s no fun to be right.</title>
      <link>http://localhost:1313/blog/2014/02/25/sometimes-its-no-fun-to-be-right/</link>
      <pubDate>Tue, 25 Feb 2014 19:05:30 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/02/25/sometimes-its-no-fun-to-be-right/</guid>
      <description>&lt;p&gt;I promised a lot of people that I would let them know how Hacker School is.  It&amp;rsquo;s difficult for me to answer this question (&lt;a href=&#34;http://jvns.ca/blog/2014/02/15/how-was-hacker-school&#34;&gt;although Julia Evans, a previous batch process, has done a fantastic job&lt;/a&gt;), both because it feels so early in the batch and because Hacker School is a lot of things.  I also promised a lot of people that I would let them know how New York is, and that&amp;rsquo;s a little easier, so I&amp;rsquo;ll start there and then move on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Early Thoughts on Hacker School</title>
      <link>http://localhost:1313/blog/2014/02/12/hacker-school/</link>
      <pubDate>Wed, 12 Feb 2014 03:47:52 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/02/12/hacker-school/</guid>
      <description>&lt;p&gt;I got my acceptance notification for the winter 2014 batch of &lt;!-- raw HTML omitted --&gt;Hacker School&lt;!-- raw HTML omitted --&gt; on January 3rd, six weeks ago.  Right after being accepted, I wrote a bit in the same directory where I&amp;rsquo;d saved my application answers:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Secret Project Glow Cloud (Embroidery)</title>
      <link>http://localhost:1313/blog/2014/01/22/secret-project-glow-cloud-embroidery/</link>
      <pubDate>Wed, 22 Jan 2014 01:56:56 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/01/22/secret-project-glow-cloud-embroidery/</guid>
      <description>&lt;p&gt;All of the stitches in the &lt;!-- raw HTML omitted --&gt;wearable circuit elements&lt;!-- raw HTML omitted --&gt; of Secret Project Glow Cloud were simple running stitches, which I tried to keep as consistent as possible.  The real embroidery work for the Glow Cloud was concentrated in two decorative elements: the &lt;!-- raw HTML omitted --&gt;Welcome to Night Vale&lt;!-- raw HTML omitted --&gt; logo in front of the light sensor, and the cloud design in front of the light circuit.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Secret Project Glow Cloud (Electronics)</title>
      <link>http://localhost:1313/blog/2014/01/18/secret-project-glow-cloud/</link>
      <pubDate>Sat, 18 Jan 2014 18:42:41 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/01/18/secret-project-glow-cloud/</guid>
      <description>&lt;p&gt;&lt;figure class=&#34;left&#34;&gt;&lt;img src=&#34;http://localhost:1313/images/glow_selfie.png&#34;&#xA;    alt=&#34;The author wearing a T-shirt with a glowing cloud design&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;Glow Selfie&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA; A few months ago I ordered &lt;!-- raw HTML omitted --&gt;this Glow Gloud T-shirt&lt;!-- raw HTML omitted --&gt;, one of the first pieces of merchandise available promoting &lt;!-- raw HTML omitted --&gt;Welcome to Night Vale&lt;!-- raw HTML omitted --&gt;.  A lot of other people love Welcome to Night Vale, and so the shirts were massively oversold for their first printing; as a result, I wasn&amp;rsquo;t sure when I was going to get my shirt.  With a determination born of despondency, I turned to a big box of stuff I had ordered from &lt;!-- raw HTML omitted --&gt;Adafruit&lt;!-- raw HTML omitted --&gt; and a pile of fabric, and I said &amp;ldquo;Okay, I&amp;rsquo;ll make my own T-shirt.  With glowy bits!  And I&amp;rsquo;ll bet I can get it done before this T-shirt everyone else is going to have arrives!&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Four months later (and about three and a half months after the mass-produced T-shirt arrived), I wore my shirt for the first time.  Here&amp;rsquo;s how I made it.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
