<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>mort’s mythopœia</title>
    <subtitle>with apologies</subtitle>
    <link rel="self" type="application/atom+xml" href="https://mort.io/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://mort.io"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-03T00:00:00+00:00</updated>
    <id>https://mort.io/atom.xml</id>
    <entry xml:lang="en">
        <title>Updating Cambridge VPN configuration</title>
        <published>2026-03-03T00:00:00+00:00</published>
        <updated>2026-03-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/cambridge-vpn/"/>
        <id>https://mort.io/blog/cambridge-vpn/</id>
        
        <content type="html" xml:base="https://mort.io/blog/cambridge-vpn/">&lt;p&gt;UIS recently rolled over the certificate for the University’s VPN service, and
the same update was applied to the Computer Lab’s service at the same time. This
was a bit of a pain as the (as close as we get to) supported Linux distribution
is Ubuntu, but I use NixOS.&lt;&#x2F;p&gt;
&lt;p&gt;It took me too long to figure this out and was, as is often the case, much
simpler in retrospect than I was trying to make it. So here’s the answer :)&lt;&#x2F;p&gt;
&lt;p&gt;I should note that the original version of this module was produced by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jeffa5&#x2F;nix-home&#x2F;blob&#x2F;main&#x2F;nixos&#x2F;modules&#x2F;vpn.nix&quot;&gt;Andrew
Jeffery&lt;&#x2F;a&gt; and
has really only been lightly edited by me.&lt;&#x2F;p&gt;
&lt;p&gt;Set &lt;code&gt;CRSID&lt;&#x2F;code&gt; and &lt;code&gt;HOSTNAME&lt;&#x2F;code&gt; appropriately.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{ pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;, ...&lt;&#x2F;span&gt;&lt;span&gt; }:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;let&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  crsid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;CRSID&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;HOSTNAME&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  environment&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;systemPackages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; = with&lt;&#x2F;span&gt;&lt;span&gt; pkgs; [ strongswan ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  services&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    strongswan&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;      # Passwords per&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;      # https:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;service&#x2F;network-services&#x2F;remote-access&#x2F;uis-vpn&#x2F;ubuntu1604#password-file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      secrets&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&#x2F;etc&#x2F;secrets&#x2F;ipsec.secrets&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      connections&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;%default&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        keyexchange&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;ikev2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        ikelifetime&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;60m&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        keylife&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;20m&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rekeymargin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;3m&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        keyingtries&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      connections&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;UCAM&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;        # Setup instructions:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;        # https:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;service&#x2F;network-services&#x2F;remote-access&#x2F;uis-vpn&#x2F;ubuntu2004&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;        # Password from https:&#x2F;&#x2F;tokens.uis.cam.ac.uk&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;%any&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;crsid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;_ucamvpn@cam.ac.uk&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftauth&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;eap&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftsourceip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;%config&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftfirewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;yes&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;vpn.uis.cam.ac.uk&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;&amp;#39;&amp;quot;CN=vpn.uis.cam.ac.uk&amp;quot;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightca&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;&amp;#39;&amp;quot;C=US, O=Internet Security Research Group, CN=ISRG Root X1&amp;quot;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightsubnet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;0.0.0.0&#x2F;0&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;add&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;      # Setup instructions: https:&#x2F;&#x2F;www.cst.cam.ac.uk&#x2F;local&#x2F;sys&#x2F;vpn2&#x2F;linux&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;      # Password from https:&#x2F;&#x2F;vpnpassword.cl.cam.ac.uk&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      connections&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;CUCL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        reauth&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;no&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        left&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;%any&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;crsid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftauth&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;eap&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftsourceip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;%config4,%config6&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        leftfirewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;yes&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        right&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;vpn2.cl.cam.ac.uk&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;%any&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightsendcert&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;never&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightsubnet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; builtins&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;concatStringsSep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;,&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;10.128.0.0&#x2F;9&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;10.64.0.0&#x2F;10&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;128.232.0.0&#x2F;16&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;129.169.0.0&#x2F;16&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;131.111.0.0&#x2F;16&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;172.16.0.0&#x2F;13&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;172.24.0.0&#x2F;14&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;172.28.0.0&#x2F;15&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;172.30.0.0&#x2F;16&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;192.18.195.0&#x2F;24&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;193.60.80.0&#x2F;20&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;193.63.252.0&#x2F;23&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;2001:630:210::&#x2F;44&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          &amp;quot;2a05:b400::&#x2F;32&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;add&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      ca&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;CUCL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;add&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        cacert&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.&#x2F;isrgrootx1.pem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Weeks 19---21 &#x2F; Month 5</title>
        <published>2026-03-01T00:00:00+00:00</published>
        <updated>2026-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w19-21/"/>
        <id>https://mort.io/blog/sabbatical-diary-w19-21/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w19-21/">&lt;p&gt;Well, it was less runny. Though as you can probably guess from a 3-week hiatus,
also unproductively busy :&#x2F;&lt;&#x2F;p&gt;
&lt;p&gt;Proofread the proof of a book chapter that was first conceived and later
submitted during the pandemic. To be honest I’d pretty much completely forgotten
about it! It looked mostly OK though, so that’s nice.&lt;&#x2F;p&gt;
&lt;p&gt;Got round to replying to the various
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.me.uk&#x2F;@mort&#x2F;116031920390698961&quot;&gt;toots&lt;&#x2F;a&gt; on &lt;a href=&quot;&#x2F;blog&#x2F;cosi-lawful-access&#x2F;&quot;&gt;my post about
end-to-end encryption and lawful&#x2F;exceptional access&lt;&#x2F;a&gt;.
A summarizing blog post will follow soon. (And maybe I should finally join
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsky.app&#x2F;&quot;&gt;Bluesky&lt;&#x2F;a&gt; so that I don’t have to rely on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;martin.kleppmann.com&#x2F;post&#x2F;3mdid65zs2c2v&quot;&gt;Martin to reskeet
(is that the verb?) it for
me&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;p&gt;Had a few interesting chats with new faculty, old&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-old-1&quot;&gt;&lt;a href=&quot;#fn-old&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; administrators, the EU
Fundamental Rights Agency, and my Ph.D. and Masters’ students. Also reviewed
several papers for conferences and a post-doctoral fellowship competition, and
wrote several reference letters.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fl pd1&quot;&gt;&lt;img src=&quot;boxes.webp&quot; class=&quot;fl pd1&quot; alt=&quot;Optimistic boxes claiming to contain AI supercomputers&quot; width=&quot;240&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;Optimistic boxes&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;Wrangled some budgets into place so that I’m now the proud owner&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-owner-1&quot;&gt;&lt;a href=&quot;#fn-owner&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; of two
“AI supercomputers”.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-super-1&quot;&gt;&lt;a href=&quot;#fn-super&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; In the process of which I learned that it’s only
&lt;em&gt;Equipment&lt;&#x2F;em&gt; if it’s over £5000 per unit otherwise it’s just sparkling
consumables. Also that two devices on a single purchase order can exceed the
insurance limit for the shipper in question with DHL, but one device on each of
two purchase orders &lt;em&gt;delivered in the same van&lt;&#x2F;em&gt; is fine. Can’t help but feel
that the subtleties of correlated risk have been passed over rather loosely
there but hey, they arrived safe and sound so who’s counting.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;back-with-ports.webp&quot; class=&quot;fr pd1&quot; alt=&quot;The back of an AI supercomputer showing the various ports&quot; width=&quot;240&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;Rear view&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;front.webp&quot; class=&quot;fr pd1&quot; alt=&quot;The front of an AI supercomputer showing a metal grill&quot; width=&quot;240&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;Front view&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;And some external work in London that was moderately interesting.&lt;&#x2F;p&gt;
&lt;p&gt;So another period that was not unproductive in a general sense, but also wasn’t
very productive in a specific sabbatical-outcome sense. Hopefully better to come
this week. Although I have to not think too carefully about how fast the halfway
mark is approaching.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-old&quot;&gt;
&lt;p&gt;In the sense of vastly experienced and knowledgeable that is. &lt;a href=&quot;#fr-old-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-owner&quot;&gt;
&lt;p&gt;That is, I have caused the University to become the proud
owner—obviously not my actual property. &lt;a href=&quot;#fr-owner-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-super&quot;&gt;
&lt;p&gt;Said so on the box, so it must be true. &lt;a href=&quot;#fr-super-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 18</title>
        <published>2026-02-07T00:00:00+00:00</published>
        <updated>2026-02-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w18/"/>
        <id>https://mort.io/blog/sabbatical-diary-w18/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w18/">&lt;p&gt;So. That was a rather stop-start week.&lt;&#x2F;p&gt;
&lt;p&gt;It started off pretty well: as &lt;a href=&quot;&#x2F;blog&#x2F;sabbatical-diary-w16-17&#x2F;&quot;&gt;noted last
week&lt;&#x2F;a&gt;, I was in Brussels to attend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fosdem.org&#x2F;2026&#x2F;&quot;&gt;FOSDEM
2026&lt;&#x2F;a&gt; for the first time in a decade. As well as
getting my tax return submitted to HMRC before the deadline on the Saturday, I
also managed to finish my slides—more precisely, editing Amjad’s slides—to
give my talk on Sunday literally &lt;em&gt;hours&lt;&#x2F;em&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-hours-1&quot;&gt;&lt;a href=&quot;#fn-hours&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; beforehand.&lt;&#x2F;p&gt;
 &lt;a href=&quot;https:&#x2F;&#x2F;video.fosdem.org&#x2F;2026&#x2F;ua2114&#x2F;F33P7S-unlocking_extra_cluster_capacity_with_enhanced_linux_cgroup_scheduling.av1.webm&quot;&gt;&lt;img src=&quot;talk-title.webp&quot; class=&quot;fl pd1&quot; alt=&quot;Splash slide for a FOSDEM 2026 talk title _Unlocking extra cluster
        capacity with enhanced Linux cgroup scheduling&quot; width=&quot;480&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;p&gt;I found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;neilzone.co.uk&#x2F;2026&#x2F;02&#x2F;reflections-on-my-first-day-ever-at-fosdem&#x2F;&quot;&gt;as others have
commented&lt;&#x2F;a&gt;
it was very busy, and the venue quality was a bit patchy: some rooms seemed to
work really well, some were rather hot with lots of background noise. It was
great to catch up with a few folk though, as well as to give &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;video.fosdem.org&#x2F;2026&#x2F;ua2114&#x2F;F33P7S-unlocking_extra_cluster_capacity_with_enhanced_linux_cgroup_scheduling.av1.webm&quot;&gt;Amjad’s talk,
“Unlocking extra cluster capacity with enhanced Linux cgroup
scheduling”&lt;&#x2F;a&gt;. Got a couple of good questions, plus a couple more
follow-up chats off-mic. All-in-all I was pretty pleased with the attendance
given it was the graveyard shift as the last talk in the Kernel devroom before
the closing conference keynote in another building. For those who want more than
the video, &lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;sabbatical-diary-w18&#x2F;.&#x2F;fosdem26-mortier.pdf&quot;&gt;find the slides here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I even managed to make it to the station on time notwithstanding having to bail
off the tram and walk a bit to the metro due to police cars blocking the way,
and then putting up with the usual rather stringent approach Brussels Eurostar
seems to take to gate closing times.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-eurostar-1&quot;&gt;&lt;a href=&quot;#fn-eurostar&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; So that was nice.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately most of the rest of the week after I got back was taken up with a
meeting for some external work I do (fun!) followed by a stomach bug for ~36
hours (not fun!). And then recovery, both physical and catching up on the
resulting backlog.&lt;&#x2F;p&gt;
&lt;p&gt;Ho hum. Hopefully next week will be better! Or at least less… runny.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-hours&quot;&gt;
&lt;p&gt;At least one. Maybe as much as two. &lt;a href=&quot;#fr-hours-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-eurostar&quot;&gt;
&lt;p&gt;Seriously. Why does Brussels seem to be so much more rigid about
this. I never have a problem at stations in London, Paris,
Amsterdam. But for some reason, Brussels seems to close the gate
absolutely on the dot of 30min before the train, no matter what. In
this case I arrived to an almost empty hall—about three other
people going through security ahead of me—to “are you for the
18.52?” “yes” “you have one minute before the gate closes”. &lt;a href=&quot;#fr-eurostar-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Weeks 16&#x2F;17 &#x2F; Months 2---4</title>
        <published>2026-01-30T00:00:00+00:00</published>
        <updated>2026-01-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w16-17/"/>
        <id>https://mort.io/blog/sabbatical-diary-w16-17/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w16-17/">&lt;p&gt;More personal and suchlike stuff going on the last two weeks, hence the week’s
gap. Felt less productive as a result, though some things got done I guess.&lt;&#x2F;p&gt;
&lt;p&gt;I engaged with a range of students:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;some Ph.D. supervising of my newest student, Yaman Kalaji (more later)&lt;&#x2F;li&gt;
&lt;li&gt;helped out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.srcf.net&#x2F;&quot;&gt;SRCF&lt;&#x2F;a&gt; for which I appear to have
become Senior Treasurer&lt;&#x2F;li&gt;
&lt;li&gt;did some more Ph.D. and M.Phil. assessment and interviewing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I started wrapping up the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;edgeless-project.eu&#x2F;&quot;&gt;EDGELESS&lt;&#x2F;a&gt; project in
the sense of getting the no-cost extension sorted out, signing off on the
(almost) final timesheets, and other exciting administrative tasks. I also think
I’ve unblocked (finally!) the industrial funding project proposal &lt;a href=&quot;&#x2F;blog&#x2F;sabbatical-diary-w11-12&#x2F;&quot;&gt;I’ve
mentioned previously&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I participated in a visit by a Ukrainian Teachers’ association, answering
questions about Christ’s and Computer Science.&lt;&#x2F;p&gt;
&lt;p&gt;I finished the review process for EuroSys 2026—just one of my batch of five
from this round accepted (but I think 20% is about usual for EuroSys).&lt;&#x2F;p&gt;
&lt;p&gt;I circulated and got initial feedback from several people on the &lt;a href=&quot;&#x2F;blog&#x2F;sabbatical-diary-w6-9&#x2F;&quot;&gt;writing
previously mentioned&lt;&#x2F;a&gt; in which I try to give an
overview of how undergraduate education works at the University. Feedback was
both less bad than I’d feared and more useful than I’d hoped (!) in that I
didn’t think it was close to being ready for detailed feedback, but apparently
it was. Though it’s already eight pages and counting; looks like it’ll be about
ten by the time it’s done.&lt;&#x2F;p&gt;
&lt;p&gt;I also fed into a consultation about end-to-end encryption and law enforcement
activity, largely repeating many of the things &lt;a href=&quot;&#x2F;blog&#x2F;cosi-lawful-access&#x2F;&quot;&gt;said to the COSI
meeting&lt;&#x2F;a&gt;, which was an interesting chat.&lt;&#x2F;p&gt;
&lt;p&gt;I even did some Actual Science™ by walking the William Gates Building to
validate that the building management system’s temperature sensors really were
behaving themselves as we’d spotted room temperatures ranging from 12—25°C
on a cold day a couple of weeks ago, which seemed rather a wide range. But they
did seem to be. Possibly more evidence that sorting the heating out really could
have some useful impact on energy consumption (and thus both bills and carbon
output).&lt;&#x2F;p&gt;
&lt;p&gt;…And finally! Earlier today I travelled to lovely Brussels to attend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fosdem.org&#x2F;2026&#x2F;&quot;&gt;FOSDEM
2026&lt;&#x2F;a&gt; for the first time in a decade. Due to visa
issues it looks like I’ll be presenting Amjad’s work&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-visa-1&quot;&gt;&lt;a href=&quot;#fn-visa&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; on Sunday—maybe
see you there :)&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-visa&quot;&gt;
&lt;p&gt;This is the second time this happened, the first being the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sesame23.github.io&#x2F;&quot;&gt;SESAME
2023&lt;&#x2F;a&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;3592533.3592807&quot;&gt;paper&lt;&#x2F;a&gt; in Rome. &lt;a href=&quot;#fr-visa-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Some Remarks on the Risks of Lawful Access</title>
        <published>2026-01-22T00:00:00+00:00</published>
        <updated>2026-01-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/cosi-lawful-access/"/>
        <id>https://mort.io/blog/cosi-lawful-access/</id>
        
        <content type="html" xml:base="https://mort.io/blog/cosi-lawful-access/">&lt;p&gt;Last summer I was invited to participate in an informal meeting of the EU
Standing Committee on Operational Cooperation on Internal Security (COSI). The
session I was asked to join concerned end-to-end encryption (“E2EE”). I was
asked to “…set the scene for the discussion laying out in layman’s terms the
technical possibilities of access to data and the technical consequences of it”,
before being followed by the two other organizations presenting.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-chatham-1&quot;&gt;&lt;a href=&quot;#fn-chatham&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I present below the remarks I made. Unusually for me, I actually wrote down all
the words I intended to say in advance rather than using slides and winging it
in the usual way. The context and topic felt like it would be worth avoiding
slips of the tongue in this case. I gave it pretty much as written—even when I
try, I can’t help a small amount of ad libbing! But I did not deviate
significantly from this text.&lt;&#x2F;p&gt;
&lt;p&gt;Having sought feedback from others on this, I would like to add a couple of
remarks as a preface.&lt;&#x2F;p&gt;
&lt;p&gt;First, the “Police Behaving Badly” paper puts the percentage of cybercrime
convictions involving police at 56% in the first half of 2024, and details how
police have had encrypted communication data but had it leaked by a corrupt
intelligence analyst advising her drug dealer friend that it was compromised.&lt;&#x2F;p&gt;
&lt;p&gt;Second, although I did try to be clear, I could have been more explicit that a
significant challenge in this space is the inevitability of software bugs.
(Approximately) All software contains bugs and it is almost certain that any
exceptional access system, due to the unavoidable complexity of such systems,
will contain bugs and so will not work as intended. The position I am trying to
take is that, while that is insufficient reason to reject every such proposal,
it is important to be realistic about the risks so that the costs and benefits
can be weighed rationally.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;who-am-i&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#who-am-i&quot; aria-label=&quot;Anchor link for: who-am-i&quot;&gt;Who am I?&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;First, I should introduce myself. I am Richard Mortier, more commonly known as
Mort. I am a professor in the Department of Computer Science &amp;amp; Technology at
Cambridge University, UK, and Fellow of Christ’s College, Cambridge. I
previously spent 6 years as a researcher with Microsoft Research Cambridge,
and 6 months with Sprint Advanced Technology Labs, California, and I have
founded three startups. I am currently also a member of the UK’s Investigatory
Powers’ Commissioner’s Office Technology Advisory Panel.&lt;&#x2F;p&gt;
&lt;p&gt;My primary expertise is in computer systems and networking, and human-computer
interaction. I thus speak on this topic as a computer scientist with general
expertise in computer systems rather than as a specialist in encryption or
messaging systems. I make these remarks in a personal capacity, representing
no-one’s views but my own.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;this-debate&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#this-debate&quot; aria-label=&quot;Anchor link for: this-debate&quot;&gt;This debate&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I have been asked to speak to you today about &lt;strong&gt;lawful&lt;&#x2F;strong&gt; or &lt;strong&gt;exceptional
access&lt;&#x2F;strong&gt;. I will stay above the nitty-gritty technical details of encryption,
communications protocols and so on, while still staying sufficiently grounded
in technology that this is not a purely abstract, philosophical debate.&lt;&#x2F;p&gt;
&lt;p&gt;My impression of this debate is that it can often descend into an unhelpful
back and forth between two extreme positions that I might simplistically
characterize as “We must provide lawful access—think of the children!” and
“We cannot provide lawful access—privacy is a fundamental right!”. “We
must!” “We can’t!” and so on.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;my-position&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-position&quot; aria-label=&quot;Anchor link for: my-position&quot;&gt;My position&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I wish to re-frame this debate to place those positions at the two extremes of
what is actually a spectrum of possibilities ranging from one where we have
mechanisms to provide perfectly secure, invisible communication among group
members where groups can form and dissolve on an ad hoc basis, to one where no
communication is possible without authorized bodies having full access to all
communication content and metadata.&lt;&#x2F;p&gt;
&lt;p&gt;Neither extreme is sensible or achievable in my view—but intermediate
positions might be. The basis for a society to decide where it wants to be on
that spectrum requires articulation and evaluation of the risks involved. I
observe, as a computer scientist, that building any large-scale
network-connected secure system is complex, and all complexity has costs and
introduces risks. Typically, the more complex, the more cost and the more
risk. Implementation of lawful access mechanisms is inevitably complex as they
are powerful and must be secured against external and internal bad actors.&lt;&#x2F;p&gt;
&lt;p&gt;This needs to be acknowledged in the discussion. These are not trivial
mechanisms and may even involve research activity in order to articulate the
design space and understand the trade-offs involved. Justification for these
mechanisms thus needs to be stronger than “we once had this ability, so we are
worried about losing it”.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;relevant-terms&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#relevant-terms&quot; aria-label=&quot;Anchor link for: relevant-terms&quot;&gt;Relevant terms&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I will define some relevant terms.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Encryption&lt;&#x2F;strong&gt; refers to the transformation of &lt;em&gt;plain text&lt;&#x2F;em&gt; information into a
&lt;em&gt;cipher text&lt;&#x2F;em&gt; such that only the authorized parties can decrypt the cipher
text, transforming it back into the plain text. Such transformations are
usually described in mathematical terms.&lt;&#x2F;p&gt;
&lt;p&gt;An &lt;strong&gt;encryption scheme&lt;&#x2F;strong&gt; is a scheme for exchanging secret data over an
insecure channel using encryption. As they are based on mathematical
operations, it is generally possible to give guarantees about how
computationally difficult it is to, for example, work out the plain text that
produced a given cipher text—that is, to break the encryption scheme.&lt;&#x2F;p&gt;
&lt;p&gt;There are many such schemes with a range of trade-offs between complexity,
computational cost, and how difficult they make it for an unauthorized party
to decrypt a cipher text. All rely at some level on the creation and
consumption of secret &lt;strong&gt;key material&lt;&#x2F;strong&gt; to perform transformations between
plain text and cipher text.&lt;&#x2F;p&gt;
&lt;p&gt;In practice, an encryption scheme has to be reduced to an implementation,
usually in software. It takes considerable effort to ensure that a given
implementation correctly implements the encryption scheme, and even more
effort to ensure that it does not leak information about the plain text
message or the secret key material during encryption or (attempted)
decryption.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Secure messaging systems&lt;&#x2F;strong&gt; are Internet-connected services that provide for
exchange of messages between two or more individual devices. Older systems
provide message exchange by having devices send messages to central servers
that then replicate those messages, transmitting them to other devices
participating in the conversation. This requires those central servers to have
access to the secret key material so that they can decrypt messages to work
out where to send them on to.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;End-to-end encryption&lt;&#x2F;strong&gt; refers to those encryption systems where this is not
the case: the central servers that assist in replication of messages to the
intended recipients do not have access to the secret key material and so
cannot decrypt the encrypted messages. Only the participating devices can do
that. End-to-end encryption is increasingly common in consumer-grade messaging
applications.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, &lt;strong&gt;lawful&lt;&#x2F;strong&gt; (or &lt;strong&gt;exceptional&lt;&#x2F;strong&gt;) &lt;strong&gt;access&lt;&#x2F;strong&gt; in this context refers to
technical mechanisms provided to enable authorized bodies such as law
enforcement and intelligence services to access communications systems on
production of suitable authorization. In the UK, for example, this would
entail the relevant body seeking a suitable warrant under the Investigatory
Powers Act (2016) as amended. Lawful access mechanisms have historically been
provided in many communication systems.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-problem&quot; aria-label=&quot;Anchor link for: the-problem&quot;&gt;The problem&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;End-to-end encryption does make provision of lawful access more difficult: the
secret key material is in principle never held by the service provider and so
they cannot simply grant access to messages. Mechanisms would need to be added
to enable such access. But as soon as any mechanism exists for a third party
to gain access to decrypted messages, bad actors will also seek to exploit it.&lt;&#x2F;p&gt;
&lt;p&gt;As such mechanisms are powerful, as with any additional feature they add
complexity and increase the likelihood of creating vulnerabilities that can be
attacked. And so the argument goes that we &lt;strong&gt;cannot&lt;&#x2F;strong&gt; provide lawful access
mechanisms because it would be irresponsible to do so, weakening protections
that law-abiding members of society rely upon for so many different purposes.&lt;&#x2F;p&gt;
&lt;p&gt;But, so the counter-argument continues, lawful access is necessary to protect
the public including the vulnerable and children. Bad actors make use of
secure messaging services to exchange illegal material, to plan and execute
serious crimes, to commit terrorism and so forth. So mechanisms for lawful
access &lt;strong&gt;must&lt;&#x2F;strong&gt; be provided otherwise it is impossible for law enforcement to
carry out their duties to enforce the law and protect society. And so the
argument continues that we must provide mechanisms for lawful access.&lt;&#x2F;p&gt;
&lt;p&gt;We can’t. We must. We can’t. We must. Both positions are extreme points in a
spectrum of risk. What I believe we can and must do is take a risk-based
approach to this challenge: articulate the risks and, if we decide they are
worth taking, develop mechanisms to mitigate them. Lawful access can be done
and has been done—but should it be done, and how?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;two-principles&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#two-principles&quot; aria-label=&quot;Anchor link for: two-principles&quot;&gt;Two principles&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So what are the principles to consider, what risks do such mechanisms create,
and how might we consider them?&lt;&#x2F;p&gt;
&lt;p&gt;The first principle is that any lawful access mechanism is, by definition,
powerful. It allows an authorized party to access information that people wish
to keep secret. It is not therefore something that is easy to design,
implement, test, maintain and operate: considerable care will be required, and
potentially considerable expense incurred.&lt;&#x2F;p&gt;
&lt;p&gt;The second is that any such mechanism can and will be abused. Bad actors will
seek to exploit it to gain access to information, and may well succeed from
time to time. Those unauthorized accesses will come from external bad actors
but also internal bad actors. As well as the maintenance costs this creates,
it also suggests that accountability and transparency are critical.&lt;&#x2F;p&gt;
&lt;p&gt;For example, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;~ah793&#x2F;cccd.html&quot;&gt;Cambridge Computer Crime
Database&lt;&#x2F;a&gt; is a database of
cybercrime events of many kinds where the offender or alleged offender has
been arrested, charged and&#x2F;or prosecuted in the UK, dating from 1 January
2010. In the last 6 months of 2023, nearly half of the cases involved police
as offenders. I am not saying that these directly involve lawful access or
similar mechanisms, or that such incidents are commonplace—but it is
undeniable that they do occur, and that lawful access mechanisms could create
another route by which they can be carried out. Bad actors will also be
present in the service providers. Strong powers require strong oversight.&lt;&#x2F;p&gt;
&lt;p&gt;The debate cannot continue under the assumptions that this is a
straightforward technology to build and protect against unauthorized use, and
that authorized users will always use it lawfully.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;thinking-about-risk-necessity-proportionality&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#thinking-about-risk-necessity-proportionality&quot; aria-label=&quot;Anchor link for: thinking-about-risk-necessity-proportionality&quot;&gt;Thinking about risk: necessity &amp;amp; proportionality&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I think it is useful to think about the risks from a perspective of necessity
and proportionality.&lt;&#x2F;p&gt;
&lt;p&gt;First, &lt;strong&gt;necessity&lt;&#x2F;strong&gt;: what is it that lawful access enables, and why?
Mechanisms could be built to enable a range of types of lawful access. For
example, access to the content of all messages; access to the content of all
messages involving certain keywords or with attached images that trigger some
flag; access to the content of all messages involving certain participants;
access to the content of selected messages; or access to metadata about
messages such as participant identifiers, message timestamps, locations of
transmission and reception, whether for all messages, all messages involving
certain parties, or specific messages. To determine what access is appropriate
requires articulating the purpose: to what use will the information be put? By
whom? And are there really no existing mechanisms by which the desired outcome
can be achieved?&lt;&#x2F;p&gt;
&lt;p&gt;Second, &lt;strong&gt;proportionality&lt;&#x2F;strong&gt;: what are the effects of exercising lawful access,
and how are the harms to be balanced against the benefits? All the mechanisms
listed above create risks when abused—but some create more risks than
others. Creating an ability, however well protected, to read any and all
messages between any communicating parties clearly creates enormous potential
for privacy infringement and crime. Creating an ability simply to know which
accounts communicated and when also creates risks but perhaps lesser ones in
most cases.&lt;&#x2F;p&gt;
&lt;p&gt;These perspectives need to be tested and debated before suitable mechanisms
can be designed, implemented, and exercised. Oversight mechanisms—perhaps
including by non-governmental organizations—need to be part of the design.
The intended benefits need to be articulated. Usage and impact need to be
tracked. Scope creep and the ability to silently expand the reach of such a
capability to enable mass surveillance needs to be guarded against. Comparison
needs to be made against alternative current approaches. For example, a
warrant can be obtained to hack a target’s phone giving access to all content
on that device, not just their messages; is that more or less intrusive than
providing a mechanism that enables selected messages or communications’
metadata to be obtained on presentation of a suitable warrant, but which
simply cannot be used to reveal any other content?&lt;&#x2F;p&gt;
&lt;p&gt;In a world where, as I understand it, policing resources are constantly being
stretched, how will law enforcement ensure it has the capacity to use
effectively information gained via such lawful access mechanisms? The risks
created by these mechanisms, once deployed, are always present even when they
are not being legally exercised: creating the mechanisms and then not
effectively using them considerably reduces any proportionality argument. If
the resource to sift existing data is already stretched, how will putting more
hay on the haystack help in finding the needles?&lt;&#x2F;p&gt;
&lt;p&gt;For example, the success of operations against systems such as
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;EncroChat&quot;&gt;Encrochat&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bbc.co.uk&#x2F;news&#x2F;articles&#x2F;clyljpygxgjo&quot;&gt;Ghost&lt;&#x2F;a&gt; raises the question:
is it enough to concentrate on those systems that target criminal use? How
much extra will be gained by creating lawful access mechanisms in
consumer-grade systems? I am not saying nothing will be gained—but the
expected benefits need to be quantified for the case to be made.&lt;&#x2F;p&gt;
&lt;p&gt;Is the call for lawful access mechanisms based on specific, recorded instances
where they would have made a material difference to society? Or is it based
primarily on fear of a future where once useful mechanisms cease to be
available? “Once we could but now we cannot” is not a very strong argument for
necessity and proportionality given the way that technology has constantly
evolved over decades and centuries.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Communications_Assistance_for_Law_Enforcement_Act&quot;&gt;Communications Assistance for Law Enforcement Act (CALEA)
1994&lt;&#x2F;a&gt;
enforced US communications providers to implement wire-tapping capabilities.
It also mandated that those providers secure their networks. Unfortunately, it
seems that the implementation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.schneier.com&#x2F;blog&#x2F;archives&#x2F;2025&#x2F;04&#x2F;arguing-against-calea.html&quot;&gt;that capability created a risk that was
exploited&lt;&#x2F;a&gt;
by a group dubbed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;techcrunch.com&#x2F;2024&#x2F;10&#x2F;07&#x2F;the-30-year-old-internet-backdoor-law-that-came-back-to-bite&#x2F;&quot;&gt;Salt
Typhoon&lt;&#x2F;a&gt;
to allow capture of sensitive call metadata in Washington D.C. Experts have
been reported as saying that such an attack was “inevitable”. How can such
risks, in terms of both likelihood and impact, be quantified and weighed in
the balance?&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;non-solutions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#non-solutions&quot; aria-label=&quot;Anchor link for: non-solutions&quot;&gt;Non-solutions&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It is worth at this point dismissing some ways that have in the past been
proposed for lawful access but which have very significant problems.&lt;&#x2F;p&gt;
&lt;p&gt;First, deliberately weakening encryption schemes. This simply does not work in
practice: bad actors will use more secure schemes anyway, and will seek to
exploit law-abiding services that use the weakened schemes, putting
law-abiding users at risk.&lt;&#x2F;p&gt;
&lt;p&gt;Second, forms of key escrow. This is where the secret key material is placed
under the control of some trusted party, and can be accessed on presentation
of a suitably authorized request. Unfortunately, this allows anyone who can
produce, whether or not legitimately, such a request to access &lt;strong&gt;all&lt;&#x2F;strong&gt;
communications.&lt;&#x2F;p&gt;
&lt;p&gt;Third, ghost users. This is where providers add law enforcement operatives to
chats without triggering notifications or otherwise informing chat
participants that a new member has been added. While in some ways technically
attractive, as described such a mechanism provides no means for accountability
and oversight: what record is made, and how is it inspected, that such an
action was carried out by the service provider, for what purpose, at what
time.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;a-possible-solution&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#a-possible-solution&quot; aria-label=&quot;Anchor link for: a-possible-solution&quot;&gt;A possible solution&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I will close by sketching &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;martin.kleppmann.com&#x2F;2021&#x2F;07&#x2F;16&#x2F;cryptographic-backdoors-hotpets.html&quot;&gt;a proposal from a colleague, Dr Martin
Kleppmann&lt;&#x2F;a&gt;,
for a lawful access mechanism that seeks to balance benefits and harms,
published at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;petsymposium.org&#x2F;2021&#x2F;hotpets.php&quot;&gt;HotPETS (Privacy Enhancing Technologies Symposium) Workshop
in 2021&lt;&#x2F;a&gt;. It seeks to ensure that
undetectable mass surveillance cannot be carried out, and that oversight can
be exercised in relevant jurisdictions.&lt;&#x2F;p&gt;
&lt;p&gt;In short, it provides a public &lt;em&gt;transparency log&lt;&#x2F;em&gt; into which all accepted
lawful access requests are written with a few publicly readable fields
indicating the requesting body, the warrant jurisdiction, its basis and
validity period, plus some cryptographic commitment as to the target for the
warrant. Thus, anyone can see how many warrants are being issued, why, and
when &lt;em&gt;without the targets being revealed&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The service’s client application then checks the log and if it finds a valid
entry for the device it is running on, it uploads the requested data for the
indicated period to the specified LEA. This is similar to the message backup
procedure already provided for by many secure messaging applications.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time, a trusted oversight body in the jurisdiction can cross-check
log entries against issued warrants, and require the service provider to
reveal the targets of those warrants so that proportionality can be justified
by reference to the seriousness of the crime of which they are accused.&lt;&#x2F;p&gt;
&lt;p&gt;This provides targeted upload of data, reducing the ease with which bad actors
can use it to acquire data themselves. It enables interested parties, perhaps
including civil society organizations, to monitor general use of the mechanism
so that moves towards mass surveillance can be detected. It enables trusted
oversight bodies to exercise powers to inspect and ensure that necessity and
proportionality requirements are being met.&lt;&#x2F;p&gt;
&lt;p&gt;This is not a fully worked up proposal, and it does not thoroughly address
every possible challenge. To produce such a proposal would require, as well as
some of the discussion and debate referred to above, more technical details
about how the communications services that would be subject to such mechanisms
are architected and operated. But it hopefully serves as an example of an
approach that sits on the spectrum somewhere between “We can’t” and “We must”.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusions&quot; aria-label=&quot;Anchor link for: conclusions&quot;&gt;Conclusions&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In summary then,&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I believe that it is in principle possible to design, implement and deploy
lawful access mechanisms, even in end-to-end encrypted systems.&lt;&#x2F;li&gt;
&lt;li&gt;But doing so requires careful justification as to necessity and
proportionality: just because such mechanisms could be built and would be
useful does not automatically mean that they should be built.&lt;&#x2F;li&gt;
&lt;li&gt;Such justification must include realistic consideration of the risks even
just the existence of such mechanisms would introduce, as well as
mechanisms to mitigate those risks.&lt;&#x2F;li&gt;
&lt;li&gt;To maintain public trust in secure communications means that such strong
powers must be designed and implemented so as to enable strong oversight
by trusted bodies, likely including non-governmental bodies.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;hr &#x2F;&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;References&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lawfaremedia.org&#x2F;article&#x2F;principles-more-informed-exceptional-access-debate&quot;&gt;Principles for a More Informed Exceptional Access Debate&lt;&#x2F;a&gt;”,
Ian Levy &amp;amp; Crispin Robinson. 29 November 2018.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;~ah793&#x2F;papers&#x2F;2019inside_out.pdf&quot;&gt;Inside out: Characterising cybercrimes committed inside and outside the
workplace&lt;&#x2F;a&gt;”.
Alice Hutchings and Ben Collier, Cambridge University. IEEE European
Symposium on Security and Privacy Workshops (EuroS&amp;amp;PW) 2019, pp. 481– 490.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gov.uk&#x2F;government&#x2F;publications&#x2F;open-letter-to-mark-zuckerberg&#x2F;written-testimony-of-chloe-squires-director-national-security-home-office&quot;&gt;Judiciary Committee United States Senate hearing: Encryption and Lawful
Access: Evaluating Benefits and Risks to Public Safety and Privacy&lt;&#x2F;a&gt;”,
Chloe Squires, Director National Security, Home Office. 23 December 2019.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;securephones.io&#x2F;main.html&quot;&gt;Data Security on Mobile Devices: Current State of the Art, Open
Problems, and Proposed Solutions&lt;&#x2F;a&gt;”,
Maximilian Zinkus, Tushar M. Jois, Matthew Green, Johns Hopkins
University. 6 June 2021.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;martin.kleppmann.com&#x2F;papers&#x2F;backdoors-hotpets21.pdf&quot;&gt;Harm Reduction for Cryptographic
Backdoors&lt;&#x2F;a&gt;”,
Martin Kleppmann, Cambridge University. 14th Workshop on Hot Topics in
Privacy Enhancing Technologies (HotPETs). 16 July 2021.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;home-affairs.ec.europa.eu&#x2F;networks&#x2F;high-level-group-hlg-access-data-effective-law-enforcement_en#recommendations&quot;&gt;Concluding report of the High-Level Group on access to data for
effective law enforcement&lt;&#x2F;a&gt;”.
15 November 2024.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;“&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;~ah793&#x2F;papers&#x2F;2025police.pdf&quot;&gt;Police behaving
badly&lt;&#x2F;a&gt;”. Alice
Hutchings, Cambridge University. IEEE Security and Privacy, 23(1),
pp.80-82. 4 February 2025.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;hr &#x2F;&gt;
&lt;hr &#x2F;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-chatham&quot;&gt;
&lt;p&gt;A la the Chatham House Rule, we were asked not to reveal identities
of participants or the organizations they represented. I was there
in a private capacity, giving my own views as an academic computer
scientist. You might choose to guess who might be the sorts of
organization not in COSI with a stake in this debate; I couldn’t
possibly comment. &lt;a href=&quot;#fr-chatham-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Restarting audio</title>
        <published>2026-01-19T00:00:00+00:00</published>
        <updated>2026-01-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/restarting-audio/"/>
        <id>https://mort.io/blog/restarting-audio/</id>
        
        <content type="html" xml:base="https://mort.io/blog/restarting-audio/">&lt;p&gt;I run, at least for the time being, NixOS, generally from the main &#x2F; unstable
branch rather than a stable release. After a recent upgrade I found audio was
not working, most likely because &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pipewire.org&#x2F;&quot;&gt;&lt;code&gt;pipewire&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
appeared to have stopped running. This is a jotting of the runes I invoked to
restart it.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-aliases-1&quot;&gt;&lt;a href=&quot;#fn-aliases&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;First, check whether any suitable looking process seems to be running:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; procs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pipewire&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; PID:▲&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; User │ TTY CPU MEM CPU Time │ Command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            │&lt;&#x2F;span&gt;&lt;span&gt;     [%] [%]          │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 6008&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  mort │&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;     0.0 0.8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 00:00:22 │ &#x2F;nix&#x2F;store&#x2F;ka3w75gd28llnz2ns8p9svlhl16mxaxi-slack-4.47.59&#x2F;lib&#x2F;slac...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 6304&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  mort │&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;     0.0 0.3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 00:00:09 │ &#x2F;proc&#x2F;self&#x2F;exe&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --type=utility --utility-sub-type=network.mojom.Net...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 7171&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  mort │&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;     0.0 0.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 00:00:01 │ &#x2F;proc&#x2F;self&#x2F;exe&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --type=utility --utility-sub-type=audio.mojom.Audio...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; procs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pulseaudio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; PID:▲&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; User │ TTY CPU MEM CPU Time │ Command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            │&lt;&#x2F;span&gt;&lt;span&gt;     [%] [%]          │&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then try to restart &lt;code&gt;pipewire&lt;&#x2F;code&gt; itself. First, as a user service:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; restart pipewire&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Failed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; to restart pipewire.service: Unit pipewire.service not found.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Doesn’t exist so retry as a system service:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; restart pipewire&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Authentication&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; is required to restart &amp;#39;pipewire.service&amp;#39;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Authenticating&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; as: mort&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Password:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;==== AUTHENTICATION COMPLETE ====&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Failed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; to restart pipewire.service: Unit pipewire.service is masked.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Bother. It’s masked. And unmasking doesn’t work due to NixOS using a read-only partition:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; unmask pipewire&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-unit-files ====&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Authentication&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; is required to manage system service or unit files.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Authenticating&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; as: mort&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Password:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;==== AUTHENTICATION COMPLETE ====&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Failed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; to unmask unit: File &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;pipewire.service: Read-only file system&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hmm. Maybe it’s not just &lt;code&gt;pipewire&lt;&#x2F;code&gt; – what about &lt;code&gt;wireplumber&lt;&#x2F;code&gt;?&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ll&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;wireplumber.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - root root 1970-01-01 00:00 &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;wireplumber.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That’s a red-herring – this is a &lt;em&gt;user&lt;&#x2F;em&gt; service, so let’s look for our user units:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ll&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxrwxr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 default.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 graphical-session-pre.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxrwxr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 graphical-session.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 sockets.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 sway-session.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 emacs.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;emacs.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gammastep.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gammastep.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gnome-keyring.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gnome-keyring.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gpg-agent-ssh.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent-ssh.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gpg-agent.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gpg-agent.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 kanshi.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;kanshi.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 kbfs.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;kbfs.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 keybase.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;keybase.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire-pulse.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire-pulse.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire-pulse.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire-pulse.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 sway-session.target&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;sway-session.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 swayidle.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;swayidle.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 swayosd.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;swayosd.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 tray.target&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;tray.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Hmm. &lt;code&gt;wireplumber&lt;&#x2F;code&gt; is missing. Try enabling it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; enable wireplumber&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Created&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; symlink &amp;#39;&#x2F;home&#x2F;mort&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&amp;#39; → &amp;#39;&#x2F;nix&#x2F;store&#x2F;3jk8py96bwnn0sgl1r0dwr0vif4cvivw-wireplumber-0.5.12&#x2F;share&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&amp;#39;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Created&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; symlink &amp;#39;&#x2F;home&#x2F;mort&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;pipewire-session-manager.service&amp;#39; → &amp;#39;&#x2F;home&#x2F;mort&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&amp;#39;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Created&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; symlink &amp;#39;&#x2F;home&#x2F;mort&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;pipewire.service.wants&#x2F;wireplumber.service&amp;#39; → &amp;#39;&#x2F;nix&#x2F;store&#x2F;3jk8py96bwnn0sgl1r0dwr0vif4cvivw-wireplumber-0.5.12&#x2F;share&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&amp;#39;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Unit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;3jk8py96bwnn0sgl1r0dwr0vif4cvivw-wireplumber-0.5.12&#x2F;share&#x2F;systemd&#x2F;user&#x2F;wireplumber.service is added as a dependency to a non-existent unit pipewire.service.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Unit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;3jk8py96bwnn0sgl1r0dwr0vif4cvivw-wireplumber-0.5.12&#x2F;share&#x2F;systemd&#x2F;user&#x2F;wireplumber.service is added as a dependency to a non-existent unit pipewire.service.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Oho! That did something.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ll&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxrwxr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 default.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 graphical-session-pre.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxrwxr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 graphical-session.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:54 pipewire.service.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 sockets.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 sway-session.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 emacs.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;emacs.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gammastep.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gammastep.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gnome-keyring.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gnome-keyring.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gpg-agent-ssh.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent-ssh.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gpg-agent.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 gpg-agent.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 kanshi.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;kanshi.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 kbfs.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;kbfs.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 keybase.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;keybase.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire-pulse.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire-pulse.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire-pulse.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire-pulse.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:54 pipewire-session-manager.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;home&#x2F;mort&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-04-11 15:08 pipewire.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;xir78j1r5bk42jjxsszjwfx93sjc0d93-pipewire-1.4.1&#x2F;share&#x2F;systemd&#x2F;user&#x2F;pipewire.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 sway-session.target&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;sway-session.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 swayidle.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;swayidle.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 swayosd.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;swayosd.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 11:31 tray.target&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;vgn3nh0sij9gazgf5cjq7j7bvnwr8bnk-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;tray.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:54 wireplumber.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;3jk8py96bwnn0sgl1r0dwr0vif4cvivw-wireplumber-0.5.12&#x2F;share&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I also noticed that some of those symlinks were dangling, so I removed them:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:user&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pipewire-pulse.service pipewire-pulse.socket pipewire.service pipewire.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:user&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ll&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxrwxr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 default.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 graphical-session-pre.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxrwxr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 graphical-session.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:54 pipewire.service.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 sockets.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;drwxr-xr-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 sway-session.target.wants&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 emacs.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;emacs.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 gammastep.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gammastep.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 gnome-keyring.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gnome-keyring.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 gpg-agent-ssh.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent-ssh.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 gpg-agent.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 gpg-agent.socket&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;gpg-agent.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 kanshi.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;kanshi.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 kbfs.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;kbfs.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 keybase.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;keybase.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:54 pipewire-session-manager.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;home&#x2F;mort&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 sway-session.target&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;sway-session.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 swayidle.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;swayidle.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 swayosd.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;swayosd.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:55 tray.target&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;prhy3gb8fhy6yrjrpq98v6biy9zwg9y1-home-manager-files&#x2F;.config&#x2F;systemd&#x2F;user&#x2F;tray.target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lrwxrwxrwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; - mort users 2025-12-22 14:54 wireplumber.service&lt;&#x2F;span&gt;&lt;span&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;3jk8py96bwnn0sgl1r0dwr0vif4cvivw-wireplumber-0.5.12&#x2F;share&#x2F;systemd&#x2F;user&#x2F;wireplumber.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, check statuses and restart things as needed:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:user&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; status pipewire&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;●&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pipewire.service - PipeWire Multimedia Service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     Loaded:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; loaded&lt;&#x2F;span&gt;&lt;span&gt; (&#x2F;etc&#x2F;systemd&#x2F;user&#x2F;pipewire.service;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; enabled&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; preset:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ignored&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    Drop-In:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;6sqgdcfscsq254xdq93sv0hjjyv0dz1i-user-units&#x2F;pipewire.service.d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;             └─overrides.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     Active:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; active&lt;&#x2F;span&gt;&lt;span&gt; (running) since Mon 2025-12-22 14:57:29 GMT;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 6s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ago&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Invocation:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 6c08e0e9e0de494aa8f7491011d8d514&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;TriggeredBy:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ● pipewire.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   Main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; PID:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 42345&lt;&#x2F;span&gt;&lt;span&gt; (pipewire)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;      Tasks:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt; (limit:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 37987&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     Memory:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 8M&lt;&#x2F;span&gt;&lt;span&gt; (peak:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 8.2M&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;        CPU:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 50ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     CGroup:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;user.slice&#x2F;user-1000.slice&#x2F;user@1000.service&#x2F;session.slice&#x2F;pipewire.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;             └─42345&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;334afxah19b3hr6ll93pfxlcyhhh2vws-pipewire-1.4.9&#x2F;bin&#x2F;pipewire&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Dec&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 22&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 14:57:29 greyjay systemd[3323]: Started PipeWire Multimedia Service.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:user&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; restart pipewire-pulse&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:user&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; status pipewire-pulse&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;●&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pipewire-pulse.service - PipeWire PulseAudio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     Loaded:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; loaded&lt;&#x2F;span&gt;&lt;span&gt; (&#x2F;etc&#x2F;systemd&#x2F;user&#x2F;pipewire-pulse.service;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; enabled&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; preset:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ignored&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    Drop-In:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;6sqgdcfscsq254xdq93sv0hjjyv0dz1i-user-units&#x2F;pipewire-pulse.service.d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;             └─overrides.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     Active:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; active&lt;&#x2F;span&gt;&lt;span&gt; (running) since Mon 2025-12-22 14:57:46 GMT;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 4s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ago&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Invocation:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 46833e7c144a4b608ff829fe0c644594&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;TriggeredBy:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ● pipewire-pulse.socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   Main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; PID:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 42442&lt;&#x2F;span&gt;&lt;span&gt; (pipewire-pulse)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;      Tasks:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span&gt; (limit:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 37987&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     Memory:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 2.7M&lt;&#x2F;span&gt;&lt;span&gt; (peak:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 3M&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;        CPU:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 24ms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     CGroup:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;user.slice&#x2F;user-1000.slice&#x2F;user@1000.service&#x2F;session.slice&#x2F;pipewire-pulse.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;             └─42442&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;334afxah19b3hr6ll93pfxlcyhhh2vws-pipewire-1.4.9&#x2F;bin&#x2F;pipewire-pulse&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Dec&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 22&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 14:57:46 greyjay systemd[3323]: Started PipeWire PulseAudio.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That seemed to fix things anyway.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-aliases&quot;&gt;
&lt;p&gt;Note that this is pasted from my terminal so you may need &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;blob&#x2F;main&#x2F;bash&#x2F;dot-bash_aliases&quot;&gt;my shell
aliases&lt;&#x2F;a&gt;
if you just want to cut’n’paste, not that I recommend it
particularly. &lt;a href=&quot;#fr-aliases-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 15</title>
        <published>2026-01-17T00:00:00+00:00</published>
        <updated>2026-01-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w15/"/>
        <id>https://mort.io/blog/sabbatical-diary-w15/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w15/">&lt;p&gt;That feels like it was a relatively productive week :)&lt;&#x2F;p&gt;
&lt;p&gt;I interviewed a couple of Ph.D. candidates—good luck!&lt;&#x2F;p&gt;
&lt;p&gt;I obtained a short extension to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;edgeless-project.eu&#x2F;&quot;&gt;EU EDGELESS&lt;&#x2F;a&gt;
project to allow us to spend up the remaining funds and complete all the work.&lt;&#x2F;p&gt;
&lt;p&gt;I extracted myself from Ramblr: &lt;a href=&quot;&#x2F;blog&#x2F;extracting-rambling&#x2F;&quot;&gt;downloaded my existing
trips&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;pramblr&quot;&gt;wrote a script to generate nice
visualisations&lt;&#x2F;a&gt;, and &lt;a href=&quot;&#x2F;tracks&#x2F;&quot;&gt;integrated it into this
website&lt;&#x2F;a&gt;. More polishing to follow, of both the visualisations and the
integration, but it feels like a decent start.&lt;&#x2F;p&gt;
&lt;p&gt;And finally! I actually got round to writing some funding proposal-related text
for the work we’re seeking to do relating to the “Digital Plant Room” and making
existing buildings more energy efficient.&lt;&#x2F;p&gt;
&lt;p&gt;Plenty more to do, but that feels like it wasn’t a bad week in the end.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Extracting ramblings</title>
        <published>2026-01-15T00:00:00+00:00</published>
        <updated>2026-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/extracting-rambling/"/>
        <id>https://mort.io/blog/extracting-rambling/</id>
        
        <content type="html" xml:base="https://mort.io/blog/extracting-rambling/">&lt;p&gt;Over a number of years—in fact, my word, decades—recorded my GPS tracks and
taken photos when I go walking.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-walking-1&quot;&gt;&lt;a href=&quot;#fn-walking&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; Over the years I’ve used a range of
apps with associated cloud services to capture and render this data,
predominantly EveryTrail and (until recently) Ramblr (who I think may have
bought EveryTrail or been bought by whoever bought EveryTrail).&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-platform-1&quot;&gt;&lt;a href=&quot;#fn-platform&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I moved off EveryTrail a decade ago because, if I recall correctly, it went a
bit rubbish: it was slow, unreliable, the website sucked and so on. I extracted
my trails and did nothing with them—they just sat there on my laptop of the
moment.&lt;&#x2F;p&gt;
&lt;p&gt;I then switched to Ramblr but have found over the last year or two that it is
also becoming &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Enshittification&quot;&gt;enshittified&lt;&#x2F;a&gt; :(
Specifically, the app is becoming less reliable on iOS in terms of obtaining and
maintaining a GPS fix and the website is now frankly appalling in terms of
design and performance. At the same time they’ve reduced the features available
to free tier users and started trying to push me toward a pay-for tier.&lt;&#x2F;p&gt;
&lt;p&gt;So the time had come to move off Ramblr too. I found a basic “record my GPS
track” app that did little more than that, and certainly did not support
publishing tracks to a cloud service or similar. Which then left two other
problems: how to extract ~185 tracks from Ramblr, and how to usefully display
them with any associated photos.&lt;&#x2F;p&gt;
&lt;p&gt;I’ll deal with the latter point in a separate post but first: how to extract my
data from Ramblr. What follows was what I did for Ramblr specifically, but the
general approach is probably more widely applicable. I did this in Firefox,
similar capabilities exist in other major browsers. Begin by logging into the
website &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ramblr.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;ramblr.com&#x2F;&lt;&#x2F;a&gt; and turn on &lt;code&gt;Settings&lt;&#x2F;code&gt; &amp;gt; &lt;code&gt;Web Developer Tools&lt;&#x2F;code&gt; and
select the &lt;code&gt;Network&lt;&#x2F;code&gt; tab.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;obtain-a-list-of-trip-ids&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#obtain-a-list-of-trip-ids&quot; aria-label=&quot;Anchor link for: obtain-a-list-of-trip-ids&quot;&gt;Obtain a list of &lt;code&gt;trip_ids&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;We need to capture a list of the URLs corresponding to each track, or “trip” as
Ramblr calls them. I did so by visiting &lt;code&gt;My Archive&lt;&#x2F;code&gt;, selecting the second page
of trips and then examining the &lt;code&gt;Responses&lt;&#x2F;code&gt; tab. It turned out to be
‘https:&#x2F;&#x2F;www.ramblr.com&#x2F;trip&#x2F;search&#x2F;mysearchTrip_1767801082017’. Right-click on
the URL and select &lt;code&gt;Copy Value&lt;&#x2F;code&gt; &amp;gt; &lt;code&gt;Copy as cURL&lt;&#x2F;code&gt;. Paste that into a terminal and
execute to verify—you should see some JSON content being fetched. This is what
the base &lt;code&gt;My Archive&lt;&#x2F;code&gt; page renders to give you each page listing your trips.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;https:&#x2F;&#x2F;www.ramblr.com&#x2F;trip&#x2F;search&#x2F;mysearchTrip_1767790586587&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; POST&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;User-Agent: Mozilla&#x2F;5.0 (X11; Linux x86_64; rv:146.0) Gecko&#x2F;20100101 Firefox&#x2F;146.0&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept: application&#x2F;json, text&#x2F;javascript, *&#x2F;*; q=0.01&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Language: en-GB,en;q=0.5&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Encoding: gzip, deflate, br, zstd&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Content-Type: application&#x2F;x-www-form-urlencoded; charset=UTF-8&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;X-Requested-With: XMLHttpRequest&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Origin: https:&#x2F;&#x2F;www.ramblr.com&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Connection: keep-alive&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Referer: https:&#x2F;&#x2F;www.ramblr.com&#x2F;web&#x2F;mymap&#x2F;trip&#x2F;38704&#x2F;1125687&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cookie: cq_language=english; cq_session=a93967til7hr...; cq_latlng=...; _ga_...; _ga=...; cq_RamblrCustomer=jEOh...; cq_RainierUser=aPWx...; cq_RainierPresence=aPWx...; cq_presence=eSa8...; mainParam=&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Dest: empty&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Mode: cors&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Site: same-origin&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Pragma: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cache-Control: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  --data-raw&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;text_srch=&amp;amp;activity=&amp;amp;difficulty=&amp;amp;distance_st=&amp;amp;distance_ed=&amp;amp;sort=10&amp;amp;bounds=&amp;amp;page=2&amp;amp;mode=1&amp;amp;user_id=&amp;amp;user_uid=38704&amp;amp;unit=1&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To get the full list then requires a bit of command line scripting and
experimentation to confirm which parameter needs to be replaced to fetch each
page of the &lt;code&gt;My Archive&lt;&#x2F;code&gt; tab, e.g.,&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;seq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1 14&lt;&#x2F;span&gt;&lt;span&gt;) ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  PAGE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$p&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -v --no-clobber -o&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; trips.json &amp;#39;https:&#x2F;&#x2F;www.ramblr.com&#x2F;trip&#x2F;search&#x2F;mysearchTrip_1767790586587&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -X&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; POST&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;User-Agent: Mozilla&#x2F;5.0 (X11; Linux x86_64; rv:146.0) Gecko&#x2F;20100101 Firefox&#x2F;146.0&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept: application&#x2F;json, text&#x2F;javascript, *&#x2F;*; q=0.01&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Language: en-GB,en;q=0.5&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Encoding: gzip, deflate, br, zstd&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Content-Type: application&#x2F;x-www-form-urlencoded; charset=UTF-8&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;X-Requested-With: XMLHttpRequest&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Origin: https:&#x2F;&#x2F;www.ramblr.com&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Connection: keep-alive&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Referer: https:&#x2F;&#x2F;www.ramblr.com&#x2F;web&#x2F;mymap&#x2F;trip&#x2F;38704&#x2F;1125687&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cookie: cq_language=english; cq_session=a93967til7hr...; cq_latlng=...; _ga_...; _ga=...; cq_RamblrCustomer=jEOh...; cq_RainierUser=aPWx...; cq_RainierPresence=aPWx...; cq_presence=eSa8...; mainParam=&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Dest: empty&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Mode: cors&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Site: same-origin&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Pragma: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cache-Control: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  --data-raw&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;text_srch=&amp;amp;activity=&amp;amp;difficulty=&amp;amp;distance_st=&amp;amp;distance_ed=&amp;amp;sort=10&amp;amp;bounds=&amp;amp;page=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$PAGE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;amp;mode=1&amp;amp;user_id=&amp;amp;user_uid=38704&amp;amp;unit=1&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That results in a set of files named &lt;code&gt;trips.json&lt;&#x2F;code&gt;, &lt;code&gt;trips.json.1&lt;&#x2F;code&gt;,
&lt;code&gt;trips.json.2&lt;&#x2F;code&gt; and so on. Finally, process those and extract the trip IDs so we
can subsequently fetch each one:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; trips.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; jq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;.result.trip_list[].trip_id&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; uniq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; trip_ids&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;fetching-each-trip&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#fetching-each-trip&quot; aria-label=&quot;Anchor link for: fetching-each-trip&quot;&gt;Fetching each trip&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Next we need the URL that will allow us to fetch a single trip. Find that by
clicking on a track and then the &lt;code&gt;Download GPX&lt;&#x2F;code&gt; button. In the web developer
tools &lt;code&gt;Network&lt;&#x2F;code&gt; tab spot the resulting URL—in this case
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ramblr.com&#x2F;gpx&#x2F;downloadGPX&#x2F;TRIP_ID?v=1767801576157&quot;&gt;https:&#x2F;&#x2F;www.ramblr.com&#x2F;gpx&#x2F;downloadGPX&#x2F;TRIP_ID?v=1767801576157&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, we iterate over the list of trip IDs to download each GPX track:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; trip_ids&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; | while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.gpx &amp;quot;https:&#x2F;&#x2F;www.ramblr.com&#x2F;gpx&#x2F;downloadGPX&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;?v=1767801576157&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;   \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;User-Agent: Mozilla&#x2F;5.0 (X11; Linux x86_64; rv:146.0) Gecko&#x2F;20100101 Firefox&#x2F;146.0&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept: text&#x2F;html,application&#x2F;xhtml+xml,application&#x2F;xml;q=0.9,*&#x2F;*;q=0.8&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Language: en-GB,en;q=0.5&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;   -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Encoding: gzip, deflate, br, zstd&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Connection: keep-alive&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Referer: https:&#x2F;&#x2F;www.ramblr.com&#x2F;web&#x2F;mymap&#x2F;trip&#x2F;38704&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cookie: cq_language=english; cq_latlng=...; _ga_...=GS2.1....; _ga=GA1.1....; cq_RamblrCustomer=jEOh...; cq_RainierUser=aPWx...; cq_RainierPresence=aPWx...; cq_presence=eSa8...; mainParam=; cq_session=e4po...&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Upgrade-Insecure-Requests: 1&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Dest: iframe&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Mode: navigate&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Site: same-origin&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Priority: u=4&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Pragma: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cache-Control: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;TE: trailers&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And, if you want the KML which includes more metadata and photo thumbnails:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; trip_ids&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; | while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; i&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;https:&#x2F;&#x2F;www.ramblr.com&#x2F;gpx&#x2F;downloadKML&#x2F;$i?v=1767803311189&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;User-Agent: Mozilla&#x2F;5.0 (X11; Linux x86_64; rv:146.0) Gecko&#x2F;20100101 Firefox&#x2F;146.0&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept: text&#x2F;html,application&#x2F;xhtml+xml,application&#x2F;xml;q=0.9,*&#x2F;*;q=0.8&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Language: en-GB,en;q=0.5&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Accept-Encoding: gzip, deflate, br, zstd&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Connection: keep-alive&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Referer: https:&#x2F;&#x2F;www.ramblr.com&#x2F;web&#x2F;mymap&#x2F;trip&#x2F;38704&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cookie: cq_language=english; cq_latlng=...; _ga_...=GS2.1....; _ga=GA1.1....; cq_RamblrCustomer=jEOh...; cq_RainierUser=aPWx...; cq_RainierPresence=aPWx...; cq_presence=eSa8...; mainParam=; cq_session=e4po...&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Upgrade-Insecure-Requests: 1&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Dest: iframe&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Mode: navigate&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Sec-Fetch-Site: same-origin&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Priority: u=4&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Pragma: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Cache-Control: no-cache&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;    -H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;TE: trailers&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And voila! You should have the GPX and&#x2F;or KML tracks corresponding to each of
your trips in Ramblr. Often a very similar process for extracting data from
other hosted platforms: examine the page in web developer tools, find the
relevant URL to fetch, work out the relevant parameters, and do some command
line scripting to iterate.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-walking&quot;&gt;
&lt;p&gt;Something that I enjoy doing and wish I did more. &lt;a href=&quot;#fr-walking-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-platform&quot;&gt;
&lt;p&gt;Changes may also have occurred because I switch platforms more
often than some, for devices and laptops, mixing between iOS,
Android, Windows, Linux. Currently Linux and iOS. Maybe a Linux
phone will be in my future, who knows. &lt;a href=&quot;#fr-platform-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Pinning packages</title>
        <published>2026-01-12T00:00:00+00:00</published>
        <updated>2026-01-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/pinning-pkgs/"/>
        <id>https://mort.io/blog/pinning-pkgs/</id>
        
        <content type="html" xml:base="https://mort.io/blog/pinning-pkgs/">&lt;p&gt;I run NixOS for the time being, usually tracking &lt;code&gt;unstable&lt;&#x2F;code&gt;. As a result, I have
from time to time found myself wanting to pin a package to a particular (older)
version because a package update doesn’t work, or at least doesn’t work for me.&lt;&#x2F;p&gt;
&lt;p&gt;Given what I understand NixOS’ intention to be—encapsulation of state,
eschewing the convenience of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Filesystem_Hierarchy_Standard&quot;&gt;Filesystem Hierarchy Standard
(FHS)&lt;&#x2F;a&gt; for a layout
that allows multiple versions of the same package to exist alongside each
other—I always assumed this would be fairly straightforward. Just specify the
version of the package rather than accepting the default from the channel, and
off you go with all dependencies neatly installed alongside whatever else there
is.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately not. And the amount of half-written, possibly once working, now
incomplete or just wrong hints at solutions that are out there is something I
have found infuriating.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-seriously-1&quot;&gt;&lt;a href=&quot;#fn-seriously&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I needed to do this again last week because something happened with the latest
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pipewire.pages.freedesktop.org&#x2F;wireplumber&#x2F;&quot;&gt;&lt;code&gt;wireplumber&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. And this
time I managed to make it work, so again, recording it here for future-me and
anyone else who might find it useful.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-noting-1&quot;&gt;&lt;a href=&quot;#fn-noting&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Setup is one that I think is reasonably common: I have a Nix &lt;em&gt;flake&lt;&#x2F;em&gt; that
declares a set of systems; each &lt;em&gt;system&lt;&#x2F;em&gt; references a per-machine set of
modules; each &lt;em&gt;module&lt;&#x2F;em&gt; then pulls in a configuration that installs and
configures some packages in the usual way.&lt;&#x2F;p&gt;
&lt;p&gt;So my laptop’s &lt;code&gt;default.nix&lt;&#x2F;code&gt; now contains the following two &lt;code&gt;let&lt;&#x2F;code&gt; declarations
specifying the &lt;code&gt;nixpkgs&lt;&#x2F;code&gt; repository version with the correct (in this case,
previous) &lt;code&gt;wireplumber&lt;&#x2F;code&gt; package plus the package itself within that repository.
The declarations that then cause &lt;code&gt;wireplumber&lt;&#x2F;code&gt; to be installed then just have to
override the &lt;code&gt;wireplumber.package&lt;&#x2F;code&gt; to use the pinned one just declared.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  inputs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  lib&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  options&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;let&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  wireplumber_0_5_12_pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;builtins&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;fetchTree {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;github&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    owner&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;nixos&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;nixpkgs&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    rev&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;871b9fd269ff6246794583ce4ee1031e1da71895&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }) {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; inherit&lt;&#x2F;span&gt;&lt;span&gt; (pkgs)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt; system&lt;&#x2F;span&gt;&lt;span&gt;; };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  wireplumber_0_5_12&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; wireplumber_0_5_12_pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;wireplumber;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  services&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;pipewire&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    wireplumber&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      package&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; wireplumber_0_5_12;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  system&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;stateVersion&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;24.05&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To get the repo details, I initially used
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lazamar.co.uk&#x2F;nix-versions&#x2F;?channel=nixpkgs-unstable&amp;amp;package=wireplumber&quot;&gt;https:&#x2F;&#x2F;lazamar.co.uk&#x2F;nix-versions&#x2F;?channel=nixpkgs-unstable&amp;amp;package=wireplumber&lt;&#x2F;a&gt;
but that seems only up-to-date to wireplumber 0.5.10, whereas the previous
version should be 0.5.12.&lt;&#x2F;p&gt;
&lt;p&gt;So to find the correct repo revision, I went back to
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;search.nixos.org&#x2F;packages?channel=25.11&amp;amp;query=wireplumber&quot;&gt;https:&#x2F;&#x2F;search.nixos.org&#x2F;packages?channel=25.11&amp;amp;query=wireplumber&lt;&#x2F;a&gt;
to find the latest stable version, clicked on the &lt;em&gt;Source&lt;&#x2F;em&gt; link to take me to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;blob&#x2F;nixos-25.11&#x2F;pkgs&#x2F;development&#x2F;libraries&#x2F;pipewire&#x2F;wireplumber.nix#L89&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;blob&#x2F;nixos-25.11&#x2F;pkgs&#x2F;development&#x2F;libraries&#x2F;pipewire&#x2F;wireplumber.nix#L89&lt;&#x2F;a&gt;,
realized that was in 25.11 so visited &lt;code&gt;Releases&#x2F;Tags&lt;&#x2F;code&gt; &amp;gt; &lt;code&gt;Tags&lt;&#x2F;code&gt; &amp;gt; &lt;code&gt;25.11&lt;&#x2F;code&gt; which
linked to
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;commit&#x2F;871b9fd269ff6246794583ce4ee1031e1da71895&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;commit&#x2F;871b9fd269ff6246794583ce4ee1031e1da71895&lt;&#x2F;a&gt;—giving
me the commit ref to use above.&lt;&#x2F;p&gt;
&lt;p&gt;Probably, &lt;em&gt;surely&lt;&#x2F;em&gt;, easier ways to do this, but this way seemed to work for me.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-seriously&quot;&gt;
&lt;p&gt;Seriously, if it’s so simple that you start your suggestion with
“Just do something like …”, how about you post something a bit
like a minimal working example? Or at least a reasonably complete
fragment? It’s as bad as paper reviewers that baldly state “this
work is not novel” without providing any pointers to the
earlier work that invalidates the novelty. &lt;a href=&quot;#fr-seriously-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-noting&quot;&gt;
&lt;p&gt;Though, noting my comment above, with no guarantees that it will work
for you, now or ever, or that I’ll keep it up-to-date. This is a
blog, of sorts, not a manual. &lt;a href=&quot;#fr-noting-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 14</title>
        <published>2026-01-09T00:00:00+00:00</published>
        <updated>2026-01-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w14/"/>
        <id>https://mort.io/blog/sabbatical-diary-w14/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w14/">&lt;p&gt;The calendar year started with some sysadmin work. Had to &lt;a href=&quot;&#x2F;blog&#x2F;eduroam-update&#x2F;&quot;&gt;get devices
reconnected to &lt;code&gt;eduroam&lt;&#x2F;code&gt; and &lt;code&gt;Internal-CL&lt;&#x2F;code&gt; Wi-Fi
networks&lt;&#x2F;a&gt; which was happily quite straightforward.&lt;&#x2F;p&gt;
&lt;p&gt;Research work was primarily getting a bit more seriously started on &lt;a href=&quot;&#x2F;blog&#x2F;sabbatical-diary-w6-9&#x2F;&quot;&gt;unexpected
work mentioned previously&lt;&#x2F;a&gt; looking at digital
support for HVAC control—a better “Digital Plant Room” if you will.&lt;&#x2F;p&gt;
&lt;p&gt;I also did some recreational coding around various family duties which was nice
:) I used to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;everytrail.com&#x2F;&quot;&gt;EveryTrail&lt;&#x2F;a&gt; to record GPS tracks
while out walking. This became &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.alltrails.com&#x2F;&quot;&gt;AllTrails&lt;&#x2F;a&gt; and (at
the time, not used it in years) got worse and probably wanted me to start
paying. About a decade ago I switched to
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ramblr.com&#x2F;web&#x2F;main&quot;&gt;ramblr&lt;&#x2F;a&gt;—but unfortunately that has also
degraded over time, with their website setup and app bit-rotting as far as I
could tell, while also reducing the free functionality and forcing users towards
their paid service.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-enshittification-1&quot;&gt;&lt;a href=&quot;#fn-enshittification&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So I decided the time had come to extricate myself. Due to the aforementioned
bit-rot of the &lt;em&gt;ramblr&lt;&#x2F;em&gt; app, some time ago I had found a reasonable if
comparatively basic iOS app for recording GPS tracks, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apps.apple.com&#x2F;us&#x2F;app&#x2F;gps-tracker-pro&#x2F;id984920064&quot;&gt;GPS-Tracker
Pro&lt;&#x2F;a&gt;,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-stalker-1&quot;&gt;&lt;a href=&quot;#fn-stalker&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; but
wanted some way to display and host the tracks online nicely with photos
included. It ended up being straightforward to automatically extract the ~188
tracks from &lt;em&gt;ramblr&lt;&#x2F;em&gt;, I’d already got those from Everytrails when I switched
away from it, and GPS-Tracker Pro makes it straightforward enough to share GPX
and KML tracks out to e.g., cloud storage.&lt;&#x2F;p&gt;
&lt;p&gt;So I’m now partway through a simple Python script to visualise them using
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;gpxplotter&#x2F;&quot;&gt;GPXPlotter&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;folium&#x2F;&quot;&gt;Folium&lt;&#x2F;a&gt;. Much more straightofrward so far
than I thought it might be. More to follow—it turns out coding is fun and I
enjoy it, so I plan to do more… :)&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-enshittification&quot;&gt;
&lt;p&gt;I believe the cool kids are now calling this
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Enshittification&quot;&gt;enshittification&lt;&#x2F;a&gt;. &lt;a href=&quot;#fr-enshittification-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-stalker&quot;&gt;
&lt;p&gt;Rather worryingly, reading that page today I see that the first
rating review appears to be from someone who used it to stalk their
ex-, apparently by getting a private investigator to install it on
their phone. That’s bad. Don’t do that. I only use it to record my
own tracks, obviously. &lt;a href=&quot;#fr-stalker-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Updating `eduroam`</title>
        <published>2026-01-06T00:00:00+00:00</published>
        <updated>2026-01-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/eduroam-update/"/>
        <id>https://mort.io/blog/eduroam-update/</id>
        
        <content type="html" xml:base="https://mort.io/blog/eduroam-update/">&lt;p&gt;The University recently rolled its public certificate for
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;eduroam.org&#x2F;&quot;&gt;&lt;code&gt;eduroam&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and the old one was dropped a couple of days
ago. So double-checking that all devices still worked resulted in some fiddling
to make it so. Twice over because the local preferred Department Wi-Fi network
is &lt;code&gt;Internal-CL&lt;&#x2F;code&gt; for which I can use the same credentials.&lt;&#x2F;p&gt;
&lt;p&gt;My phone (iOS 26) was in a weird state. First off, due to having not turned off
“iCloud Passwords &amp;amp; Keychain” it turned out to have shared the credentials I
gave to my iPad. I do not want this—we can generate our own credentials, and I
generate them per-device deliberately—so that had to be turned off:
&lt;code&gt;Settings &amp;gt; Apple Account &amp;gt; iCloud &amp;gt; Saved to iCloud ... See All &amp;gt; Passwords &amp;amp; Keychain &amp;gt; Sync this iPhone&lt;&#x2F;code&gt; = &lt;code&gt;OFF&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Then I could forget and then rejoin &lt;code&gt;eduroam&lt;&#x2F;code&gt; using my usual credentials worked
just fine. But I couldn’t connect at all to &lt;code&gt;Internal-CL&lt;&#x2F;code&gt;—I wasn’t even
prompted for a username&#x2F;password. Also couldn’t remove it or forget it: it
showed as a “managed network” in &lt;code&gt;Settings &amp;gt; Wi-Fi &amp;gt; Edit&lt;&#x2F;code&gt;. So visited
&lt;code&gt;Settings &amp;gt; General &amp;gt; Device &amp;amp; VPN Management&lt;&#x2F;code&gt; which showed &lt;code&gt;Internal-CL&lt;&#x2F;code&gt; as a
“device profile”. Removed that, and then reconnected using the usual credentials
and all was well.&lt;&#x2F;p&gt;
&lt;p&gt;My laptop runs NixOS so I often have to do things like this by hand. This time,
rather than faffing with &lt;code&gt;nmtui&lt;&#x2F;code&gt; I thought I’d have a go from the command-line
as I’ve &lt;a href=&quot;&#x2F;blog&#x2F;wifi-password&#x2F;&quot;&gt;recently found&lt;&#x2F;a&gt; &lt;a href=&quot;&#x2F;blog&#x2F;re-connecting&#x2F;&quot;&gt;it to work
well&lt;&#x2F;a&gt;. Building off &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;service&#x2F;wifi&#x2F;connect-to-eduroam&#x2F;other-devices#server&quot;&gt;the manual instructions from
UIS&lt;&#x2F;a&gt;
plus &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;optimista&#x2F;803bbca64ae92dacab7a37e2977f1804&quot;&gt;a relevant
gist&lt;&#x2F;a&gt;, the
following seems to work:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; connection add type wifi con-name &amp;#39;NAME&amp;#39; ssid &amp;#39;SSID&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ipv4.method auto 802-1x.eap peap 802-1x.phase2-auth mschapv2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  802-1x.identity &amp;#39;USERNAME&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  802-1x.password &amp;#39;PASSWORD&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  wifi-sec.key-mgmt wpa-eap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…setting &lt;code&gt;NAME&lt;&#x2F;code&gt;=&lt;code&gt;SSID&lt;&#x2F;code&gt; to be &lt;code&gt;eduroam&lt;&#x2F;code&gt; or &lt;code&gt;Internal-CL&lt;&#x2F;code&gt;, and &lt;code&gt;USERNAME&lt;&#x2F;code&gt; and
&lt;code&gt;PASSWORD&lt;&#x2F;code&gt; to be my usual network credentials.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 13</title>
        <published>2026-01-04T00:00:00+00:00</published>
        <updated>2026-01-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w13/"/>
        <id>https://mort.io/blog/sabbatical-diary-w13/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w13/">&lt;p&gt;Nothing of note done, work-wise, for the last week or so. Hey, it was the
holidays. Which meant a lot of driving around, and I find it difficult to do
much other than think and sing along to the tunes while I’m driving.&lt;&#x2F;p&gt;
&lt;p&gt;I did get a chance to watch and listen to a link my mum sent me a while ago
though to a film from the BBC series &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.bbc.co.uk&#x2F;programmes&#x2F;b00tgz5d&quot;&gt;In Their Own Words: British
Novelists&lt;&#x2F;a&gt;, linked from
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.openculture.com&#x2F;2012&#x2F;01&#x2F;jrr_tolkien_in_his_own_words.html&quot;&gt;https:&#x2F;&#x2F;www.openculture.com&#x2F;2012&#x2F;01&#x2F;jrr_tolkien_in_his_own_words.html&lt;&#x2F;a&gt;. As it
was Tolkien’s anniversary yesterday (he was born 3 January 1892), it seemed an
appropriate moment to link it here.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-title-1&quot;&gt;&lt;a href=&quot;#fn-title&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The following quote from the man particularly resonated:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well it is meant to be escapist. Because I use escapism in its proper sense,
as of a man getting out of prison.&lt;br&gt;
&lt;em&gt;&lt;div align=&quot;right&quot;&gt;J.R.R. Tolkien&lt;&#x2F;div&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I also enjoyed the distinction drawn between &lt;em&gt;allegory&lt;&#x2F;em&gt; and &lt;em&gt;application&lt;&#x2F;em&gt;,
noting that Shakespeare is mostly application rather than allegory. (This may be
obvious to those who are students of literature, but that ain’t me!)&lt;&#x2F;p&gt;
&lt;p&gt;Merry New Year!&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-title&quot;&gt;
&lt;p&gt;Some may also note the nod to Tolkien in the title of this blog :) &lt;a href=&quot;#fr-title-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Weeks 11---12 &#x2F; Month 3</title>
        <published>2025-12-28T00:00:00+00:00</published>
        <updated>2025-12-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w11-12/"/>
        <id>https://mort.io/blog/sabbatical-diary-w11-12/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w11-12/">&lt;p&gt;Another two weeks gone, and suddenly we’re at the end of the Calendar
Year.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-year-1&quot;&gt;&lt;a href=&quot;#fn-year&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Not an idle two weeks but not the most productive either. A lot of personal
stuff—collecting the eldest from University, Christmas preparations and the
like.&lt;&#x2F;p&gt;
&lt;p&gt;Some M.Phil. and Ph.D. application processing and candidate interviewing.
Knowledge transfer from Amjad before he leaves. Made some corrections to &lt;a href=&quot;&#x2F;blog&#x2F;emacs-eglot&#x2F;&quot;&gt;a past
blog post about Emacs &lt;code&gt;eglot&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. A bit of time spent trying
to get moving the two potential research projects that I didn’t anticipate:
starting to fill out a funding application for one, chasing the University over
some blocked industrial funding for the other.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-funding-1&quot;&gt;&lt;a href=&quot;#fn-funding&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Initial meetings about the M.Phil. research project I’m supervising this year.
Not strictly necessary due to the sabbatical, but the topic is bang on the
second of the two research projects mentioned above. Building on Amjad’s work,
the project will extend in two directions. First, determine whether his results
can be ported to the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kernel.org&#x2F;doc&#x2F;html&#x2F;next&#x2F;scheduler&#x2F;sched-ext.html&quot;&gt;&lt;code&gt;sched_ext&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, a
scheduler class where behaviours can be written using BPF. Second, for added
&lt;del&gt;pain&lt;&#x2F;del&gt;excitement, do it on a Raspberry Pi as an example of a small(-ish) edge
device with a different architecture.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-year&quot;&gt;
&lt;p&gt;… vs Academic Year, which always begins on 1 October of course. As
does the Michaelmas Term. Which is of course not the Full Term. Because
Full Term is shorter than Term. Naturally. &lt;a href=&quot;#fr-year-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-funding&quot;&gt;
&lt;p&gt;I remain constantly amazed at how bad our processes around pursuing
and landing research funding are, from any funder really. &lt;a href=&quot;#fr-funding-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Re-connecting Wi-Fi</title>
        <published>2025-12-27T00:00:00+00:00</published>
        <updated>2025-12-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/re-connecting/"/>
        <id>https://mort.io/blog/re-connecting/</id>
        
        <content type="html" xml:base="https://mort.io/blog/re-connecting/">&lt;p&gt;Having gone home to visit my parents for Christmas, I am pleasantly surprised to
find that their village has finally acquired fibre broadband. As it’s always
been a mobile signal blackspot—typically I find it hovers somewhere between
&lt;em&gt;No signal&lt;&#x2F;em&gt; and &lt;em&gt;E&lt;&#x2F;em&gt;, occasionally claiming &lt;em&gt;3G&lt;&#x2F;em&gt; or &lt;em&gt;4G&lt;&#x2F;em&gt;, although I am told that
most of those indicators are a lie—it is nice to have &amp;gt;100Mb&#x2F;s and, above all,
a stable connection.&lt;&#x2F;p&gt;
&lt;p&gt;One unintended, if easy to fix, side effect is that their Wi-Fi access point
changed. The SSID was ported over but the old passphrase was insufficiently long
for the new model so it had to change. After about a minute of wondering why I
couldn’t connect, I realized what was going on and fired up &lt;code&gt;nmtui&lt;&#x2F;code&gt; to change
the passphrase.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-also-1&quot;&gt;&lt;a href=&quot;#fn-also&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;sup&gt;,&lt;&#x2F;sup&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-dad-1&quot;&gt;&lt;a href=&quot;#fn-dad&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; Unfortunately the colour scheme for
the &lt;em&gt;Modify connection&lt;&#x2F;em&gt; page was illegible to me. So I finally read the man
pages for &lt;code&gt;nmcli&lt;&#x2F;code&gt; to do it from the command line.&lt;&#x2F;p&gt;
&lt;p&gt;Herewith the crib in case anyone else other than future-me will find it useful.
No need for &lt;code&gt;sudo&lt;&#x2F;code&gt; in my case as I’m in the &lt;code&gt;networkmanager&lt;&#x2F;code&gt; group.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# set the passphrase for existing wireless network (&amp;quot;connection&amp;quot;) NAME to PASSPHRASE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; connection modify &amp;#39;NAME&amp;#39; wifi-sec.psk &amp;#39;PASSPHRASE&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# create a new connection NAME on SSID with PASSPHRASE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; connection add type wifi&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      con-name &amp;#39;NAME&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      ssid &amp;#39;SSID&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      802-11-wireless-security.key-mgmt wpa-psk&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      wifi-sec.psk &amp;#39;PASSPHRASE&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# change to the network NAME you just created&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; connection up &amp;#39;NAME&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-also&quot;&gt;
&lt;p&gt;And to add the 2.4GHz specific Wi-Fi network that was created to
support the new solar panel inverter installation because the inverter
is too far away in signal terms from the access point for 5GHz to
reach. &lt;a href=&quot;#fr-also-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-dad&quot;&gt;
&lt;p&gt;And, of course, once my dad had remembered that it had indeed changed
and furthermore, what the new one was. &lt;a href=&quot;#fr-dad-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bowlees &amp; High Force</title>
        <published>2025-12-15T00:00:00+00:00</published>
        <updated>2025-12-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2025-bowlees-and-high-force/"/>
        <id>https://mort.io/tracks/2025-bowlees-and-high-force/</id>
        
        <summary type="html">&lt;p&gt;A short walk from Bowlees past Low Force to High Force and back, the two Forces
in question being waterfalls. Wet underfoot—there had clearly been a lot of
rain recently and my shoes turned out to leak slightly—but not nearly as wet
on my head as I’d feared.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 10</title>
        <published>2025-12-14T00:00:00+00:00</published>
        <updated>2025-12-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w10/"/>
        <id>https://mort.io/blog/sabbatical-diary-w10/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w10/">&lt;p&gt;An odd week that. About 10 reference letters submitted throughout the week, the
latest about 30 minutes ago. Remember: a student is for life, not just a degree.
There was also a police statement to make following an unpleasant interaction on
a train. Apparently photos, CCTV and AI will all be involved seeking the
individual in question. Here’s hoping.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fl pd1&quot;&gt;&lt;img src=&quot;defence-in-progress.webp&quot; class=&quot;fl pd1&quot; alt=&quot;The PhD defence in progress; yours truly on the right, furthest from the candidate&quot; width=&quot;360&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;PhD defence in progress.x&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;However, the main event was the one it started with: the viva &lt;a href=&quot;&#x2F;blog&#x2F;sabbatical-diary-w6-9&#x2F;&quot;&gt;previously
mentioned&lt;&#x2F;a&gt; at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tudelft.nl&#x2F;en&#x2F;&quot;&gt;TU
Delft&lt;&#x2F;a&gt;. That was good fun: my first viva abroad
(indeed, my first outside England). People had told me it was different, being a
public defence, and it was: much &lt;a href=&quot;&#x2F;blog&#x2F;phd-viva&#x2F;&quot;&gt;more formal than ours&lt;&#x2F;a&gt; with
much wearing of &lt;em&gt;paraphernalia&lt;&#x2F;em&gt; (their word not mine :) doffing of caps (er,
doctors’ bonnets anyway), and so forth.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;success.webp&quot; class=&quot;fr pd1&quot; alt=&quot;Post-defence selfie by the supervisor showing yours truly and the candidate.&quot; width=&quot;320&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;Post-defence selfie by the supervisor showing yours truly and the candidate.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;It was only when it finished that I finally realized why: the viva wasn’t just
the viva but also incorporated the graduation ceremony. Probably a good thing
that I didn’t take literally the part of the instructions where it said I could
wear whatever was customary at my own institution for a viva (shorts?
T-shirt?)—more appropriate would’ve been to wear what as customary for
graduation. Which I did.&lt;&#x2F;p&gt;
&lt;p&gt;That was followed by two days of admissions interviewing. Technically I didn’t
need to do any this year due to the sabbatical but (&lt;em&gt;i&lt;&#x2F;em&gt;) we were back up to
about 40—45 being interviewed so I thought I should help and (&lt;em&gt;ii&lt;&#x2F;em&gt;)
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;~djw1005&#x2F;&quot;&gt;Damon&lt;&#x2F;a&gt; who has taken over as DOS while I’m
on sabbatical very kindly did several days interviewing for me last year while
he was on sabbatical. So there was at least a moral debt, now hopefully paid, at
least in part.&lt;&#x2F;p&gt;
&lt;p&gt;Next: writing. No, really this time. Honest.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Displaying Wi-Fi configuration</title>
        <published>2025-12-09T00:00:00+00:00</published>
        <updated>2025-12-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/wifi-password/"/>
        <id>https://mort.io/blog/wifi-password/</id>
        
        <content type="html" xml:base="https://mort.io/blog/wifi-password/">&lt;p&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-late-1&quot;&gt;&lt;a href=&quot;#fn-late&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;At the start of the month, I was away at the final &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;edgeless-project.eu&#x2F;&quot;&gt;EU EDGELESS
project&lt;&#x2F;a&gt; plenary meeting. As this was hosted by an
industrial partner rather than a University &lt;code&gt;eduroam&lt;&#x2F;code&gt; was of no use to me—I
had to use the local guest Wi-Fi.&lt;&#x2F;p&gt;
&lt;p&gt;This was fine in fact—but I was pleasantly surprised to encounter a rather
neat Linux networking CLI tool feature I’d not come across before.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;qr-code.webp&quot; class=&quot;fr pd1&quot; alt=&quot;A QR code encoding Wi-Fi network credentials.&quot; width=&quot;240&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;A QR code encoding Wi-Fi network credentials.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;I needed to share details with a colleague who arrived after the meeting
started. Turns out that, rather than having to copy them in by hand, all I
needed to do was run &lt;code&gt;nmcli&lt;&#x2F;code&gt; with appropriate options to get the SSID and
password on &lt;code&gt;stdout&lt;&#x2F;code&gt; &lt;strong&gt;plus&lt;&#x2F;strong&gt; a handy QR code &lt;em&gt;also on &lt;code&gt;stdout&lt;&#x2F;code&gt;&lt;&#x2F;em&gt; for my
colleague to point their camera-ful devices at.&lt;&#x2F;p&gt;
&lt;p&gt;Neat.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:~&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; nmcli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; device wifi show-password&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;SSID:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; WIFI Kepler2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Security:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; WPA&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Password:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; F72SUjf0QdT4NzPB52&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-late&quot;&gt;
&lt;p&gt;Ok, so this was actually posted on 27 December 2025 but is dated 9
December 2025 because I wrote it then, got distracted, and forgot to
commit. Doh. &lt;a href=&quot;#fr-late-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Weeks 6---9 &#x2F; Month 2</title>
        <published>2025-12-08T00:00:00+00:00</published>
        <updated>2025-12-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w6-9/"/>
        <id>https://mort.io/blog/sabbatical-diary-w6-9/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w6-9/">&lt;p&gt;Hmm. So that was a blogging hiatus, not for any particularly good reason – just
a little busier than expected with a little less time in front of a computer
than needed.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;roman-well.webp&quot; class=&quot;fr pd1&quot; alt=&quot;A top-down shot of a covered, backlit well in a Lancaster pub floor, apparently Roman&quot; width=&quot;300&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;A covered well in a Lancaster pub floor, apparently Roman.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;Spent the time reading dissertations and then carrying out Ph.D. vivas – one at
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.lancaster.ac.uk&#x2F;scc&#x2F;&quot;&gt;Lancaster University&lt;&#x2F;a&gt;, one at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.imperial.ac.uk&#x2F;design-engineering&#x2F;&quot;&gt;Imperial
College&lt;&#x2F;a&gt;. Currently en route to
the third, at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tudelft.nl&#x2F;tbm&#x2F;ess&#x2F;&quot;&gt;TU Delft&lt;&#x2F;a&gt;. Having done Ph.D.
vivas at a rate of slightly less than one every ~2 years since doing my own,
this has been a bit of a burst load. I think I might need to slow it back down
again!&lt;&#x2F;p&gt;
&lt;p&gt;We wrote and submitted a rebuttal&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-rebuttal-1&quot;&gt;&lt;a href=&quot;#fn-rebuttal&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; for our ASPLOS 2026 submission on
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2508.15703&quot;&gt;Amjad’s excellent work&lt;&#x2F;a&gt;. I largely managed to
manage my temper while doing so—it’s rare I get a set of paper reviews without
at least one of them saying something I consider enraging, and this set was no
exception.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-reviews-1&quot;&gt;&lt;a href=&quot;#fn-reviews&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; Inevitably it made no difference—onwards and upwards to
OSDI. This is starting to feel like the &lt;a href=&quot;&#x2F;blog&#x2F;happy-day&#x2F;&quot;&gt;Unikernels ASPLOS’13
paper&lt;&#x2F;a&gt;, which I shall choose to treat as a good omen, for now
at least.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fl pd1&quot;&gt;&lt;img src=&quot;electric-pylon.webp&quot; class=&quot;fl pd1&quot; alt=&quot;A moody electric pylon looking towards some office buildings&quot; width=&quot;300&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;A moody electric pylon looking towards some office buildings.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;Took part in the final plenary meeting for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;edgeless-project.eu&#x2F;&quot;&gt;EU
EDGELESS&lt;&#x2F;a&gt; project, which was fun.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Gennevilliers&quot;&gt;Gennevilliers&lt;&#x2F;a&gt; may not be the most
picturesque part of Paris—though the electric pylons did have a slightly
Eiffel Tower-ish feel at times—but I enjoyed having dinner in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;restaurants-de-france.fr&#x2F;fr&#x2F;au-rendez-vous-des-chauffeurs-gennevilliers-1981692.html&quot;&gt;the most French
truck-stop&lt;&#x2F;a&gt;
I’ve ever been into.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-truckstop-1&quot;&gt;&lt;a href=&quot;#fn-truckstop&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;lentil-stew.webp&quot; class=&quot;fr pd1&quot; alt=&quot;A delicious lentil stew with some smoked sausages floating&quot; width=&quot;300&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;A delicious lentil stew with some smoked sausages floating.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;I also managed to (finally!) nail a complete draft of that writing I mentioned.
Time to start circulating for feedback.&lt;&#x2F;p&gt;
&lt;p&gt;Somewhat unexpected work came along: some initially promising interest in
picking up some of the work we originally did for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pages.cdbb.uk&#x2F;&quot;&gt;CDBB&lt;&#x2F;a&gt;
but targeted specifically at in-building heating and energy optimisation.
Several useful conversations already, looking forward to taking this further
through December and January. Will be interesting to see where we get to.&lt;&#x2F;p&gt;
&lt;p&gt;Less unexpected, though not anticipated, was that I won £14,000 from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tech.cam.ac.uk&#x2F;&quot;&gt;the
School&lt;&#x2F;a&gt; to take Amjad’s work further with the
intent to complete on some industrial funding proposals currently in discussion.
Unfortunately&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-amjad-1&quot;&gt;&lt;a href=&quot;#fn-amjad&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; at the same time Amjad managed to land a role elsewhere so
we’re now in handover mode. C’est la vie.&lt;&#x2F;p&gt;
&lt;p&gt;Next: finally make a start on the two research proposals originally planned, and
get the one on Amjad’s work that’s in development through to completion. And to
emit some of the posts currently trapped, half-written, in the pipeline.&lt;&#x2F;p&gt;
&lt;p&gt;We’ll see.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-rebuttal&quot;&gt;
&lt;p&gt;A pretty good rebuttal if I do say so myself. &lt;a href=&quot;#fr-rebuttal-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-reviews&quot;&gt;
&lt;p&gt;I’m quite sure many of my reviews engender similar responses in
those authors unfortunate enough to have their papers reviewed by me. It seems
impossible to avoid—I’m not trying to get at anyone in particular here! &lt;a href=&quot;#fr-reviews-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-truckstop&quot;&gt;
&lt;p&gt;I will confess that I haven’t been into many. But still. It was a very
nice lentil stew indeed, ! &lt;a href=&quot;#fr-truckstop-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-amjad&quot;&gt;
&lt;p&gt;…for me, not for him! &lt;a href=&quot;#fr-amjad-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 5</title>
        <published>2025-11-07T00:00:00+00:00</published>
        <updated>2025-11-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w5/"/>
        <id>https://mort.io/blog/sabbatical-diary-w5/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w5/">&lt;p&gt;Another week gone, a little more done. Finally (albeit too slowly) progressing
some industrial funding through the system to go alongside the small grant
application of last week. Some other paperwork done.&lt;&#x2F;p&gt;
&lt;p&gt;Polished this website a little as a reward—see the shiny new &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brailleinstitute.org&#x2F;freefont&#x2F;&quot;&gt;Atkinson
Hyperlegible font&lt;&#x2F;a&gt; for extra
readability. I started using it for all my windowing and editing setup so
thought I’d push it out here too. Maybe I’ll tweak the colour scheme one day too
:)&lt;&#x2F;p&gt;
&lt;p&gt;Apart from that, external work completed, and jolly interesting it was too;
continued reading the Ph.D. dissertations that I’m examining—three to do
before Christmas; reviewed Eurosys’26 paper submissions. Nothing too exciting
really but progress of a sort on a couple of fronts, so not too bad.&lt;&#x2F;p&gt;
&lt;p&gt;Next: writing.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Back to my Roots</title>
        <published>2025-11-05T00:00:00+00:00</published>
        <updated>2025-11-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/back-to-my-roots/"/>
        <id>https://mort.io/blog/back-to-my-roots/</id>
        
        <content type="html" xml:base="https://mort.io/blog/back-to-my-roots/">&lt;p&gt;This is another one of those that’s largely documenting something for myself,
but I’m sharing it in case others find it useful. And because
self-aggrandisement is what it’s all about these days amirite?&lt;&#x2F;p&gt;
&lt;p&gt;I recently had issues because my NixOS installation ran out of space in the root
partition wherein lies &lt;code&gt;&#x2F;nix&#x2F;store&#x2F;&lt;&#x2F;code&gt;, the read-only filesystem containing the
Nix store. It’s a pain when this runs out of space because then upgrading gets
tricky—due to rollback support, there’s a general tendency to need enough
space for at least all the new stuff in the new version &lt;em&gt;in addition&lt;&#x2F;em&gt; to the old
versions.&lt;&#x2F;p&gt;
&lt;p&gt;I’d done all the usual garbage collection to try to free up as much space as
possible—but still not enough free. What to do? This had used to work so I
figured it was probably something to do with some content that should be being
garbage collected but wasn’t—I’ve had that problem before when playing around
with flakes. Some searching around showed that the solution was actually
relatively straightforward.&lt;&#x2F;p&gt;
&lt;p&gt;First, find the roots – these are linked in &lt;code&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;gcroots&lt;&#x2F;code&gt; – then
resolve them and use &lt;code&gt;nix path-info --closure-size&lt;&#x2F;code&gt; to list all the closures
with their real sizes. Something like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;var&#x2F;nix&#x2F;gcroots&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; l&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -readable&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  res&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;res&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;readlink&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;) $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; path-info&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --closure-size -sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$res&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -h -k3,3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This gave me the following (line numbers added after the fact):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;default-1-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   0.3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   0.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;per-user&#x2F;mort&#x2F;channels-2-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;57904rflsfh46y7fxi62rzc7sidc9vmq-user-environment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   0.3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   0.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;per-user&#x2F;root&#x2F;channels-117-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;fnlgy7im4rcd4ssh8xxy0kcr3aac7paf-user-environment&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   0.8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	 394.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; MiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;home&#x2F;mort&#x2F;.cache&#x2F;nix&#x2F;flake-registry.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;pc6y12ccrlvmgfbp0rs34cbj8mbsyyvk-flake-registry.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   7.3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   7.3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;home&#x2F;mort&#x2F;.local&#x2F;state&#x2F;nix&#x2F;profiles&#x2F;home-manager-425-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;p8y1zr968ajjnva0whznygvqv09fvdd2-home-manager-generation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  17.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  14.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;home&#x2F;mort&#x2F;.local&#x2F;state&#x2F;home-manager&#x2F;gcroots&#x2F;current-home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;kmb5w2qymnnhqv3wz3k1nw0psp2qqgmx-home-manager-generation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  17.6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   3.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;7&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;system-931-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;sinifrppd8m6kah30wywc27adyzqhgzy-nixos-system-greyjay-25.11.20251028.08dacfc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  18.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   8.4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;8&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;run&#x2F;booted-system&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;sinifrppd8m6kah30wywc27adyzqhgzy-nixos-system-greyjay-25.11.20251028.08dacfc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  18.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   8.4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;run&#x2F;current-system&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;sinifrppd8m6kah30wywc27adyzqhgzy-nixos-system-greyjay-25.11.20251028.08dacfc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  18.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   8.4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;10&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;per-user&#x2F;mort&#x2F;profile-1167-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;6fc897c236g7yjpz467plxmzp5ycx87w-profile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  66.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   3.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first three lines under &lt;code&gt;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&lt;&#x2F;code&gt; are small and channel-state
related; the fourth is also tiny and something flake-related. Lines 8 and 9  beginning
&lt;code&gt;&#x2F;run&#x2F;&lt;&#x2F;code&gt; are the currently running system so leave them alone; the match of the underlying path with that of line 7 shows that 931 is the currently running generation.&lt;&#x2F;p&gt;
&lt;p&gt;However, lines 5 and 6 are suspicious:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;home&#x2F;mort&#x2F;.local&#x2F;state&#x2F;nix&#x2F;profiles&#x2F;home-manager-425-link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;p8y1zr968ajjnva0whznygvqv09fvdd2-home-manager-generation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  17.5&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  14.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;home&#x2F;mort&#x2F;.local&#x2F;state&#x2F;home-manager&#x2F;gcroots&#x2F;current-home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;nix&#x2F;store&#x2F;kmb5w2qymnnhqv3wz3k1nw0psp2qqgmx-home-manager-generation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	  17.6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KiB&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	   3.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;These look like dead roots from random rebuilds, tryouts, whatever. And the
first one is big at over 14GiB. So just delete it and re-run garbage
collection:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;.local&#x2F;state&#x2F;nix&#x2F;profiles&#x2F;home-manager-425-link&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --gc&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; nix-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --gc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nixos-rebuild&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; switch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Lo and behold! suddenly I have about 15GiB extra free. Happy days :)&lt;&#x2F;p&gt;
&lt;p&gt;In the end, I tweaked that script to the following (logically) one-liner;
recorded here so I can copy’n’paste it again in future:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;fd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -t&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; l . &#x2F;nix&#x2F;var&#x2F;nix&#x2F;gcroots&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; xargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; readlink&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; | while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; link&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  printf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;%s &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $link&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  test&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $link&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; nix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; path-info&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -Ssh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $link&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;\t&amp;quot; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -h -t&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -k3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; uniq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot; &amp;quot; &amp;quot;\t&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 4 &#x2F; Month 1</title>
        <published>2025-11-02T00:00:00+00:00</published>
        <updated>2025-11-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w4/"/>
        <id>https://mort.io/blog/sabbatical-diary-w4/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w4/">&lt;p&gt;Well, that was a slightly slower week: it was school half-term so I had the
children for three days.&lt;&#x2F;p&gt;
&lt;p&gt;I did manage to finally finish&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; polishing my Emacs
&lt;a href=&quot;&#x2F;blog&#x2F;treesitting-emacs&#x2F;&quot;&gt;Tree-sitter&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;blog&#x2F;emacs-eglot&#x2F;&quot;&gt;Eglot&lt;&#x2F;a&gt; though.
Hopefully someone finds that useful, even if only future-me.&lt;&#x2F;p&gt;
&lt;p&gt;I also finally did a “proper” sabbatical thing and submitted a proposal for some
(small, local) funding to continue developing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2508.15703&quot;&gt;Amjad’s excellent
work&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I’m travelling doing some external work this coming week in London, so I think
I’ll use some of the travel time to push the writing I said I’d do through to
completion so I can move on to more “proper” sabbatical work: developing
research funding proposals. And maybe if it all goes well I’ll even allow myself
some light coding as well – configuration polishing is all very well but it’s
not really the same!&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;For now. Polishing configuration is never finished of course. A living
breathing thing and all that. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>E(pi)glot-tal start</title>
        <published>2025-10-29T00:00:00+00:00</published>
        <updated>2025-10-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/emacs-eglot/"/>
        <id>https://mort.io/blog/emacs-eglot/</id>
        
        <content type="html" xml:base="https://mort.io/blog/emacs-eglot/">&lt;p&gt;Following on from an earlier post about &lt;a href=&quot;&#x2F;blog&#x2F;treesitting-emacs&#x2F;&quot;&gt;Tree-sitter&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;manual&#x2F;html_node&#x2F;eglot&#x2F;index.html&quot;&gt;Eglot&lt;&#x2F;a&gt; is
the Emacs &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;microsoft.github.io&#x2F;language-server-protocol&#x2F;&quot;&gt;Language Server Protocol
(LSP)&lt;&#x2F;a&gt; client. Being also
now included in Emacs from v29, it works well with
&lt;a href=&quot;&#x2F;blog&#x2F;treesitting-emacs&#x2F;&quot;&gt;Tree-sitter&lt;&#x2F;a&gt;, integrating servers that can provide
rich semantic analysis and tooling for a wide range of languages.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;basic-eglot-configuration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#basic-eglot-configuration&quot; aria-label=&quot;Anchor link for: basic-eglot-configuration&quot;&gt;Basic Eglot configuration&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I split my Emacs configuration for Eglot across some default configuration plus
language specific modes, as far as possible. Default configuration first:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; eglot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (setq-default eglot-workspace-configuration ...) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; ...but see below&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :custom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (eglot-send-changes-idle-time &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0.5&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (eglot-extend-to-xref &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (eglot-managed-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; eglot-inlay-hints-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (prog-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;lambda&lt;&#x2F;span&gt;&lt;span&gt; ()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;unless&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span&gt; major-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;emacs-lisp-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       (eglot-ensure))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (before-save&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;lambda&lt;&#x2F;span&gt;&lt;span&gt; ()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (eglot-managed-p)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         (eglot-format))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :bind&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (:map&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   eglot-mode-map&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-c c a&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; eglot-code-actions)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-c c o&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; eglot-code-actions-organize-imports)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-c c r&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; eglot-rename)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-c c f&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; eglot-format)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This sets up Eglot to run for all programming modes (&lt;code&gt;prog-mode&lt;&#x2F;code&gt;) except
&lt;code&gt;emacs-lisp-mode&lt;&#x2F;code&gt; because there is no LSP for that, it being rather integral to
Emacs itself! I will also configure it for a few non-programming modes in other
relevant &lt;code&gt;use-package&lt;&#x2F;code&gt; stanzas. Finally, I configure calling Eglot’s (language
specific) format function before saving, and a few useful key-bindings. See
below for &lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;emacs-eglot&#x2F;#workspace-configuration&quot;&gt;workspace configuration&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I also add &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jdtsmith&#x2F;eglot-booster&quot;&gt;&lt;code&gt;eglot-booster&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as that
enables Eglot to use the &lt;code&gt;emacs-lsp-booster&lt;&#x2F;code&gt; wrapper which should speed up LSP
server interactions:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; eglot-booster&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :vc (:url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;https:&#x2F;&#x2F;github.com&#x2F;jdtsmith&#x2F;eglot-booster&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :after eglot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config (eglot-booster-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;configuring-for-specific-languages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#configuring-for-specific-languages&quot; aria-label=&quot;Anchor link for: configuring-for-specific-languages&quot;&gt;Configuring for specific languages&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;simple-toml-and-bash&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#simple-toml-and-bash&quot; aria-label=&quot;Anchor link for: simple-toml-and-bash&quot;&gt;Simple: TOML and Bash&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Configuring for a particular language is then relatively straightforward for
some. For example, for TOML I use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tombi-toml.github.io&#x2F;tombi&#x2F;&quot;&gt;Tombi&lt;&#x2F;a&gt;
in the tree-sitter TOML mode, &lt;code&gt;toml-ts-mode&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; toml-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook eglot-ensure &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; not a `prog-mode` so not set by the global default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :init (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;major-mode-remap-alist &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;((toml-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; toml-ts-mode)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;eglot-server-programs &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(toml-ts-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;tombi&amp;quot; &amp;quot;lsp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This replaces the default &lt;code&gt;toml-mode&lt;&#x2F;code&gt; with the tree-sitter &lt;code&gt;toml-ts-mode&lt;&#x2F;code&gt;, and
ensures the Tombi TOML language server is running when in that mode.&lt;&#x2F;p&gt;
&lt;p&gt;Bash is similarly straightforward using the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bash-lsp&#x2F;bash-language-server&quot;&gt;&lt;code&gt;bash-language-server&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; bash-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :ensure&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; nil&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; ;; as there&amp;#39;s no package to install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :custom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (tab-width &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (sh-basic-offset &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;major-mode-remap-alist &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(bash-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; bash-ts-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;major-mode-remap-alist &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(sh-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; bash-ts-mode)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This stops &lt;code&gt;use-package&lt;&#x2F;code&gt; complaining that there is no &lt;code&gt;bash-ts-mode&lt;&#x2F;code&gt; package,
sets tabs to be just two spaces for both &lt;code&gt;shfmt&lt;&#x2F;code&gt; and &lt;code&gt;indent-for-tab-command&lt;&#x2F;code&gt;
(YMMV), and remaps the default &lt;code&gt;bash-&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;sh-&lt;&#x2F;code&gt; modes to use this &lt;code&gt;bash-ts-mode&lt;&#x2F;code&gt;. I
don’t need to set &lt;code&gt;eglot-server-programs&lt;&#x2F;code&gt; in this case because the
pre-configured default is set to use &lt;code&gt;bash-language-server&lt;&#x2F;code&gt; appropriately.&lt;&#x2F;p&gt;
&lt;p&gt;I did try using the &lt;code&gt;:initializationOptions&lt;&#x2F;code&gt; option when starting the
&lt;code&gt;bash-language-server&lt;&#x2F;code&gt; as follows:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;:config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(add-to-list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;eglot-server-programs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(bash-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;bash-language-server&amp;quot; &amp;quot;start&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    :initializationOptions&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (:backgroundAnalysisMaxFiles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;     0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; ;; turn off background analysis of directory tree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     :shfmt (:binaryNextLine&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :caseIndent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :simplifyCode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :spaceRedirects&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…but unfortunately it seems that &lt;code&gt;bash-language-server&lt;&#x2F;code&gt; doesn’t respect this
option, so it needs to be set in &lt;code&gt;eglot-workspace-configuration&lt;&#x2F;code&gt; (see below).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;slightly-more-complex-nix&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#slightly-more-complex-nix&quot; aria-label=&quot;Anchor link for: slightly-more-complex-nix&quot;&gt;Slightly more complex: Nix&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Nix is a little more complex as I would like to use the (non-preconfigured
default) &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;nixd&quot;&gt;&lt;code&gt;nixd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; LSP server and
configure it to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixfmt&quot;&gt;&lt;code&gt;nixfmt&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for formatting.
In this case I do so by passing in &lt;code&gt;:initializationOptions&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; nix-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.nix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;eglot-server-programs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;((nix-mode nix-ts-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;     .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;nixd&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      &amp;quot;--semantic-tokens&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      &amp;quot;--inlay-hints&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :initializationOptions (:nixd (:formatting.command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;nixfmt&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As with &lt;code&gt;bash-ts-mode&lt;&#x2F;code&gt;, this remaps the default &lt;code&gt;nix-mode&lt;&#x2F;code&gt; to &lt;code&gt;nix-ts-mode&lt;&#x2F;code&gt;, but
then goes on to specify the language server command line to run, and an
initialisation option to use &lt;code&gt;nixfmt&lt;&#x2F;code&gt; for formatting.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;more-complex-python-latex-typst&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#more-complex-python-latex-typst&quot; aria-label=&quot;Anchor link for: more-complex-python-latex-typst&quot;&gt;More complex: Python, LaTeX, Typst&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Python is more complex as I use &lt;code&gt;ruff&lt;&#x2F;code&gt; for formatting but it doesn’t support
much beyond that at present so I use
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.basedpyright.com&#x2F;latest&#x2F;&quot;&gt;basedpyright&lt;&#x2F;a&gt; for type hinting and the
rest. After installing the NixOS &lt;code&gt;basedpyright&lt;&#x2F;code&gt;, &lt;code&gt;ruff&lt;&#x2F;code&gt;, and
&lt;code&gt;python313Packages.python-lsp-server&lt;&#x2F;code&gt; packages, this results in:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; python-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :ensure&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; nil&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :after (eglot reformatter)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :preface&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;  ;; per https:&#x2F;&#x2F;ddavis.io&#x2F;blog&#x2F;python-emacs-4&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (reformatter-define&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   dd&#x2F;ruff-format&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   :program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;ruff&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; ;; &amp;quot;uvx&amp;quot; with &amp;quot;ruff&amp;quot; as an arg doesn&amp;#39;t work because dynamic linking on NixOS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   :args&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; `&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;format&amp;quot; &amp;quot;--stdin-filename&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ,&lt;&#x2F;span&gt;&lt;span&gt;buffer-file-name &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;-&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (reformatter-define&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   dd&#x2F;ruff-sort&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   :program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;ruff&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   :args&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   `&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;check&amp;quot; &amp;quot;--select&amp;quot; &amp;quot;I&amp;quot; &amp;quot;--fix&amp;quot; &amp;quot;--stdin-filename&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ,&lt;&#x2F;span&gt;&lt;span&gt;buffer-file-name &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;-&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ((python-base-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; dd&#x2F;ruff-format-on-save-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (python-base-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; dd&#x2F;ruff-sort-on-save-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;major-mode-remap-alist &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(python-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; python-ts-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;eglot-server-programs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;((python-mode python-ts-mode) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;basedpyright-langserver&amp;quot; &amp;quot;--stdio&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This essentially does three things: defines two &lt;code&gt;reformatter&lt;&#x2F;code&gt; functions using
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;ruff&#x2F;&quot;&gt;&lt;code&gt;ruff&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, one to reformat the code and the other
to sort imports; and sets
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.basedpyright.com&#x2F;latest&#x2F;&quot;&gt;&lt;code&gt;basedpyright&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as the language server
to use, by shadowing the default entries for Python in &lt;code&gt;eglot-server-programs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I also turn on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;z80dev&#x2F;uv-mode&quot;&gt;&lt;code&gt;uv-mode&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as I use
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;astral-sh&#x2F;uv&quot;&gt;&lt;code&gt;uv&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for all Python package management:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; uv-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :after (eglot python-base-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook (python-base-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; uv-mode-auto-activate-hook))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, for the purposes of this blog post, for document processing I use LaTeX
historically and am now trying to use typst. LaTeX first using the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emacs-languagetool&#x2F;eglot-ltex-plus&quot;&gt;&lt;code&gt;eglot-ltex-plus&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
server:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; eglot-ltex-plus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :vc (:url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;https:&#x2F;&#x2F;github.com&#x2F;emacs-languagetool&#x2F;eglot-ltex-plus&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; :rev :newest)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :custom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (eglot-ltex-plus-server-path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;   &amp;quot;&#x2F;nix&#x2F;store&#x2F;3ihx8s39rl2d5by5wabcg3i4rcm3kns3-ltex-ls-plus-18.6.0&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (eglot-ltex-plus-communication-channel &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;stdio))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; latex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :ensure auctex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.tex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; latex-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.latex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; latex-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.bibtex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; bibtex-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ((LaTeX-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; LaTeX-math-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (LaTeX-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; turn-on-reftex)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (LaTeX-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; TeX-fold-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-emacs&#x2F;blob&#x2F;main&#x2F;init.el#L739&quot;&gt;my &lt;code&gt;init.el&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for
&lt;code&gt;latex&lt;&#x2F;code&gt; package configuration details.&lt;&#x2F;p&gt;
&lt;p&gt;Finally finally, &lt;code&gt;typst&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; typst-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :after (eglot reformatter)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.typ&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :preface&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (reformatter-define &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; XXX hack to autoformat on save as eglot-format doesn&amp;#39;t work&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   typst-reformat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   :program&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;typstyle&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   :args&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; `&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;--line-width&amp;quot; &amp;quot;120&amp;quot; &amp;quot;--indent-width&amp;quot; &amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook ((typst-ts-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; eglot-ensure) (typst-ts-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; typst-reformat-on-save-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;eglot-server-programs &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt;(typst-ts-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;tinymist&amp;quot; &amp;quot;lsp&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;filladapt-token-table &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&#x2F;[ ][^:]+:&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; bullet) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;defun&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; typst-ts-tinymist-preview&lt;&#x2F;span&gt;&lt;span&gt; ()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    &amp;quot;Run `tinymist preview` on the current file.&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (interactive)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; ((file (buffer-file-name)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;compile&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;tinymist preview %s&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; (shell-quote-argument file)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (user-error &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;Buffer is not visiting a file&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :bind (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-c C-x&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; . #&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;typst-ts-tinymist-preview)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :bind (:map typst-ts-mode-map (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-c C-c&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; typst-ts-tmenu)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Both of the above have to set various other options as well as configuring Eglot.&lt;&#x2F;p&gt;
&lt;p&gt;But wait! There’s more! Specifically, for &lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;emacs-eglot&#x2F;#simple-toml-and-bash&quot;&gt;Bash&lt;&#x2F;a&gt;,
&lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;emacs-eglot&#x2F;#more-complex-python-latex-typst&quot;&gt;LaTeX&lt;&#x2F;a&gt;, and
&lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;emacs-eglot&#x2F;#more-complex-python-latex-typst&quot;&gt;Python&lt;&#x2F;a&gt;, I need to provide a default
&lt;em&gt;workspace configuration&lt;&#x2F;em&gt; to set some sensible options.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;workspace-configuration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#workspace-configuration&quot; aria-label=&quot;Anchor link for: workspace-configuration&quot;&gt;Workspace configuration&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This took me a little while to figure out. LSP servers assume a per-project
“workspace”, apparently normally set from the project’s configuration file
(either editor-independent but language-specific, or the Emacs specific but
language-independent &lt;code&gt;.dir-locals.el&lt;&#x2F;code&gt;). As a now only occasional coder I prefer
to set a global default and mostly rely on that.&lt;&#x2F;p&gt;
&lt;p&gt;However, the extra little fillip here is that you &lt;strong&gt;can’t&lt;&#x2F;strong&gt; set it locally in a
buffer – and that includes via a major-mode hook (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;joaotavora&#x2F;eglot&#x2F;discussions&#x2F;876&quot;&gt;discussed
here&lt;&#x2F;a&gt;). I investigated
using the &lt;code&gt;:initializationOptions&lt;&#x2F;code&gt; argument when setting &lt;code&gt;eglot-server-programs&lt;&#x2F;code&gt;
so that I could keep all language-specific configuration together, but that
appears to be supported by only some language servers :( So, for example, the
&lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;emacs-eglot&#x2F;#slightly-more-complex-nix&quot;&gt;nixd&lt;&#x2F;a&gt; example uses it to configure use of &lt;code&gt;nixfmt&lt;&#x2F;code&gt;
for formatting and it seems to work fine, but the equivalent for both Bash and
Python did not.&lt;&#x2F;p&gt;
&lt;p&gt;So, I ended up just setting it in the Eglot configuration stanza using
&lt;code&gt;setq-default&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; eglot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (setq-default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   eglot-workspace-configuration&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;     ;; sh&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     :bashIde&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     (:backgroundAnalysisMaxFiles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;      0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; ;; turn off background analysis of directory tree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :shfmt (:binaryNextLine&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :caseIndent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :simplifyCode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :spaceRedirects&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;     ;; ltex-ls-plus, giving grammar, spell checking for latex, markdown, etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     :ltex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     (:language&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      &amp;quot;en-GB&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :additionalRules (:enablePickyRules&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt; :motherTongue&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;en-GB&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :completionEnabled&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;     ;; python&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     :basedpyright (:disableOrganizeImports&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     :basedpyright.analysis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     (:typeCheckingMode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      &amp;quot;all&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :autoImportCompletions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :inlayHints (:callArgumentNamesMatching&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      :useTypingExtensions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;     ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The final little nugget that I had to figure out to make the above work was what
is the magic string that identifies the server so that it will process the
correct configuration blob when it’s sent. Turns out this really is just a magic
string and I needed to peruse docs and ultimately source to find it. So for
example, for &lt;code&gt;bash-language-server&lt;&#x2F;code&gt; it turns out to be &lt;code&gt;bashIde&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Possibly good general places to start looking are in the &lt;code&gt;*EGLOT*&lt;&#x2F;code&gt; logs from the
server, your &lt;code&gt;*MESSAGES*&lt;&#x2F;code&gt; buffer, the server test for processing
&lt;code&gt;onDidChangeConfigration&lt;&#x2F;code&gt; or (if one exists, and it probably does given the
prevalence of LSPs in VSCode-land) in the &lt;code&gt;vscode-client&lt;&#x2F;code&gt; packaging, or some
suitable declaration – in the case of &lt;code&gt;bash-language-server&lt;&#x2F;code&gt;, this turns out to
be setting the variable
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bash-lsp&#x2F;bash-language-server&#x2F;blob&#x2F;main&#x2F;server&#x2F;src&#x2F;server.ts#L25&quot;&gt;&lt;code&gt;CONFIGURATION_SECTION&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway. That mostly concludes my Emacs polishing. For now. Probably.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 3</title>
        <published>2025-10-27T00:00:00+00:00</published>
        <updated>2025-10-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w3/"/>
        <id>https://mort.io/blog/sabbatical-diary-w3/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w3/">&lt;p&gt;Not much to say this week – largely more of the same. &lt;a href=&quot;&#x2F;blog&#x2F;treesitting-emacs&#x2F;&quot;&gt;Blogged about
&lt;code&gt;tree-sitter&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and (written, &lt;del&gt;to be published
shortly&lt;&#x2F;del&gt;now published!) &lt;a href=&quot;&#x2F;blog&#x2F;emacs-eglot&#x2F;&quot;&gt;&lt;code&gt;eglot&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, configuring both for an
increasing number of languages.&lt;&#x2F;p&gt;
&lt;p&gt;Also continued trying to land some small funding for continuing
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cst.cam.ac.uk&#x2F;people&#x2F;aati2&quot;&gt;Amjad’s&lt;&#x2F;a&gt; excellent work. Following
meticulous characterisation of Linux’s process scheduler, his Ph.D. developed an
alternative approach that enables a 30% smaller cluster to satisfy the same
“serverless” workload.&lt;&#x2F;p&gt;
&lt;p&gt;Serverless computing is a popular style of cloud computing enabling customers to
ignore all application deployment details, instead encapsulating their
application – most commonly using “container” technology – so the platform can
take responsibility for providing the necessary resources for it to run, scaling
resources up and down in response to changes in demand. Providers typically
provision resources as a shared cluster of (physical or virtual) machines,
orchestrated using a cluster orchestrator based on the popular Kubernetes
orchestrator. That orchestrator is then responsible for running encapsulated
application code, ensuring each job is allocated sufficient resources.&lt;&#x2F;p&gt;
&lt;p&gt;The cluster’s machines typically run Linux, and so it is Linux’s kernel
scheduler that is responsible for running a machine’s allocated jobs. That
scheduler’s behaviour is taken for granted by the plethora of work that has
sought to improve cluster performance. Unfortunately, close examination of
cluster performance results showed significant discrepancies when compared to
the intended behaviour – current practice masks these discrepancies by
over-provisioning the cluster.&lt;&#x2F;p&gt;
&lt;p&gt;Meticulous examination of the results and the Linux kernel scheduler code
revealed that the behaviour of a particular core data structure in conjunction
with treatment of multi-core processors causes overheads to increase
disproportionately as demand increases. This increase in overheads is especially
prominent with serverless workloads due to their particular characteristics, and
causes the cluster orchestrator makes ever poorer job placement decisions. The
net effect is that, in practice, clusters must be significantly over-provisioned
to achieve acceptable performance.&lt;&#x2F;p&gt;
&lt;p&gt;This thesis reports how meticulous measurement revealed and unpicked this
problem, and describes and evaluates a set of relatively small – just a few
hundred lines of code – but critical changes in Linux’s kernel scheduler in
mitigation. The final outcome is that these mitigations allow an identical and
representative serverless workload to be supported by a cluster comprising 30%
fewer machines.&lt;&#x2F;p&gt;
&lt;p&gt;See our arXiv paper, “&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2508.15703&quot;&gt;Mitigating context switching in densely packed Linux
clusters with Latency-Aware Group Scheduling&lt;&#x2F;a&gt;”
for more details :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tree-sitting Emacs</title>
        <published>2025-10-20T00:00:00+00:00</published>
        <updated>2025-10-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/treesitting-emacs/"/>
        <id>https://mort.io/blog/treesitting-emacs/</id>
        
        <content type="html" xml:base="https://mort.io/blog/treesitting-emacs/">&lt;p&gt;First, some background that it took me longer than I would’ve hoped to piece
together.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tree-sitter.github.io&#x2F;tree-sitter&#x2F;&quot;&gt;Tree-sitter&lt;&#x2F;a&gt; is “a parser generator
tool and an incremental parsing library”. What does that mean in pratice? It is
a thing which, when paired with a grammar, parses your source code and enables
syntax highlighting, code folding, and so on. Syntactic manipulations. It comes
with a domain specific language (DSL) for writing grammars and so, happily, many
languages are already supported. It is also, as of Emacs 29, included out of the
box.&lt;&#x2F;p&gt;
&lt;p&gt;On the other hand, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;manual&#x2F;html_node&#x2F;eglot&#x2F;Quick-Start.html&quot;&gt;Eglot&lt;&#x2F;a&gt;, also included out of the box since Emacs 29,
provides the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;microsoft.github.io&#x2F;language-server-protocol&#x2F;&quot;&gt;Language Server Protocol (LSP)&lt;&#x2F;a&gt; interaction. This supports
semantic rather than syntactic markup: inline hints, invocation of code
formatters, and so on. More on that next.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nixos-packages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#nixos-packages&quot; aria-label=&quot;Anchor link for: nixos-packages&quot;&gt;NixOS packages&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I am of course also using NixOS, with flakes and Home Manager, so it took a bit
of faffing about to get this all working but I think I got there in the end.
First, the NixOS runes needed to install relevant Emacs packages:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;programs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  package&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;emacs-gtk;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  extraPackages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    epkgs:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; with&lt;&#x2F;span&gt;&lt;span&gt; epkgs; ([&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;      # ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      tree-sitter-langs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      (treesit-grammars&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;with-grammars (p: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-dockerfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-elisp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-markdown&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-markdown-inline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-nix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-ocaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-python&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-rust&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-toml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-typst&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tree-sitter-yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You could use the &lt;code&gt;treesit-grammars.with-all-grammars&lt;&#x2F;code&gt; package instead of the
final expression that selects specific grammars, but I found that package did
not include all the grammars I actually wanted, hence doing it by hand. It is
also in principle possible to allow the Emacs &lt;code&gt;treesit-auto&lt;&#x2F;code&gt; package to download
and install grammars on demand. Grammars are first sought in
&lt;code&gt;treesit-extra-load-path&lt;&#x2F;code&gt; – in my case a gnarly and ever evolving Nix path,
currently
&lt;code&gt;&#x2F;nix&#x2F;store&#x2F;4p4rfax61q9z6c5wj7ahnb8hjq8pa11g-emacs-packages-deps&#x2F;lib&#x2F;&lt;&#x2F;code&gt;. If they
are not found there, they are next looked for in
&lt;code&gt;${user-emacs-directory}&#x2F;tree-sitter&#x2F;&lt;&#x2F;code&gt; with &lt;code&gt;${user-emacs-directory}&lt;&#x2F;code&gt; resolving
in my case to &lt;code&gt;~&#x2F;.emacs.d&lt;&#x2F;code&gt;. &lt;code&gt;treesit-auto&lt;&#x2F;code&gt; places them in the latter location.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, the &lt;code&gt;emacs-lsp-booster&lt;&#x2F;code&gt; package claims to speed things up, so why
not:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;packages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; = with&lt;&#x2F;span&gt;&lt;span&gt; pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;span&gt; [ emacs-lsp-booster ]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;emacs-configuration&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#emacs-configuration&quot; aria-label=&quot;Anchor link for: emacs-configuration&quot;&gt;Emacs configuration&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This was a bit fiddly but not too bad in the end. First install packages
comprising the tree-sitter grammars, an auto-installer for missing grammars, and
enabling code folding via tree-sitter:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; tree-sitter-langs &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; grammar bundle&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :after tree-sitter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :custom (global-tree-sitter-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; treesit-auto &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; auto-install missing grammars&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :after tree-sitter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config (global-treesit-auto-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; treesit-fold &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; enable code folding based on tree-sitter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :vc (:url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;https:&#x2F;&#x2F;github.com&#x2F;emacs-tree-sitter&#x2F;treesit-fold&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config (treesit-fold-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :bind&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-`&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; treesit-fold-toggle)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-€&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; treesit-fold-close-all) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; I remap S-` to € using `keyd` so can&amp;#39;t use C-S-`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;M-C-€&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; treesit-fold-open-all)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, configure the &lt;code&gt;-ts-&lt;&#x2F;code&gt; version for each relevant major &lt;code&gt;-mode&lt;&#x2F;code&gt;, e.g., for
Dockerfile and Nix:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; dockerfile-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;Dockerfile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;major-mode-remap-alist &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;((docker-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; docker-ts-mode))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; nix-ts-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :mode&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.nix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config (add-to-list &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;major-mode-remap-alist &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;((nix-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; nix-ts-mode))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…and so on. The examples above do two things: set the file glob pattern to
which the major mode will apply, and remap the “default” major mode
&lt;code&gt;LANGUAGE-mode&lt;&#x2F;code&gt; to the new tree-sitter major mode, &lt;code&gt;LANGUAGE-ts-mode&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;microsoft.github.io&#x2F;language-server-protocol&#x2F;&quot;&gt;LSP&lt;&#x2F;a&gt; support via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;manual&#x2F;html_node&#x2F;eglot&#x2F;Quick-Start.html&quot;&gt;Eglot&lt;&#x2F;a&gt; then requires installing any necessary language servers
and configuring them. More on that next.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Week 2</title>
        <published>2025-10-18T00:00:00+00:00</published>
        <updated>2025-10-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w2/"/>
        <id>https://mort.io/blog/sabbatical-diary-w2/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w2/">&lt;p&gt;As predicted, this week was some Emacs configuration polishing interspersed with
some writing using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;typst.app&#x2F;&quot;&gt;&lt;code&gt;typst&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. I quite like &lt;code&gt;typst&lt;&#x2F;code&gt; I think
– it seems pretty capable, it’s pretty sensible, and it’s certainly easier to
read than LaTeX. And there’s even &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;imaginarytext.ca&#x2F;posts&#x2F;2024&#x2F;pandoc-typst-tutorial&#x2F;&quot;&gt;runes
available&lt;&#x2F;a&gt; to invoke
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pandoc.org&#x2F;&quot;&gt;&lt;code&gt;pandoc&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to allow production of body text in Markdown, to
be rendered using &lt;code&gt;typst&lt;&#x2F;code&gt; as the backend. The piece of writing in question
didn’t go as fast as I wanted, but it did start in earnest. Which is, at least,
a start :)&lt;&#x2F;p&gt;
&lt;p&gt;First cut at configuration polishing is also now done I think – now into
tweaking and refining as the different packages actually get used. Probably the
biggest improvement noticed so far is the use of
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;minad&#x2F;jinx&quot;&gt;&lt;code&gt;jinx&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; the “enchanted spell checker” which does
seem considerably better than the various &lt;code&gt;ispell&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;hunspell&lt;&#x2F;code&gt; incantation
packages I’ve historically used:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; jinx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :diminish jinx-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook (emacs-startup &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; global-jinx-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :bind ((&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; jinx-correct) (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-M-$&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; jinx-languages))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (vertico-multiform-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (add-to-list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;vertico-multiform-categories&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;   &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(jinx grid (vertico-grid-annotate &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span&gt;) (vertico-count &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span&gt;))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;:config&lt;&#x2F;code&gt; block integrates it with the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;minad&#x2F;vertico&quot;&gt;&lt;code&gt;vertico&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; vertical completion system that
I’ve recently started using; simply remove if you don’t use that. This did also
require the NixOS package to be installed already:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  programs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;extraPackages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; epkgs:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; with&lt;&#x2F;span&gt;&lt;span&gt; epkgs; ([ jinx ])&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The biggest visible change though was finally getting an auto-formatter for my
elisp code, specifically
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-emacs&#x2F;blob&#x2F;main&#x2F;init.el&quot;&gt;&lt;code&gt;init.el&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; configured:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;use-package&lt;&#x2F;span&gt;&lt;span&gt; elisp-autofmt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :commands (elisp-autofmt-mode elisp-autofmt-buffer)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  :hook (emacs-lisp-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; elisp-autofmt-mode))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ensuring it is applied to &lt;code&gt;init.el&lt;&#x2F;code&gt; simply required adding the (currently empty,
might become configuration in future apparently) flag file
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-emacs&#x2F;blob&#x2F;main&#x2F;.elisp-autofmt&quot;&gt;&lt;code&gt;.elisp-autofmt&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to
my &lt;code&gt;~&#x2F;.emacs.d&#x2F;&lt;&#x2F;code&gt;, and adding the following trailer to my
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-emacs&#x2F;blob&#x2F;f06fc8fb9c280e11a8ddd8548ad245c8eba71484&#x2F;init.el#L1349-L1351&quot;&gt;&lt;code&gt;init.el&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; Local variables:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; elisp-autofmt-load-packages-local: (&amp;quot;use-package&amp;quot; &amp;quot;use-package-core&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; end:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The other big change has been moving to &lt;code&gt;tree-sitter&lt;&#x2F;code&gt; and &lt;code&gt;eglot&lt;&#x2F;code&gt; for language
support, but that’ll be a longer post so more on that later.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sabbatical Diary: Weeks 0 &amp; 1</title>
        <published>2025-10-10T00:00:00+00:00</published>
        <updated>2025-10-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sabbatical-diary-w1/"/>
        <id>https://mort.io/blog/sabbatical-diary-w1/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sabbatical-diary-w1/">&lt;p&gt;Well, the sabbatical began. Your protagonist set off with a song in his heart
and the freedom to roam. And all that.&lt;&#x2F;p&gt;
&lt;p&gt;So what did I do? Well, initially I spent some time finishing up the handful of
things I hadn’t managed to do before 1 October came along. Tedious but probably
inevitable. If I forgot something you were waiting for, sorry – you may need to
remind me…!&lt;&#x2F;p&gt;
&lt;p&gt;I then finally gave up on trying out new &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vscodium.com&#x2F;&quot;&gt;ed&lt;&#x2F;a&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zed.dev&#x2F;&quot;&gt;it&lt;&#x2F;a&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lap.dev&#x2F;lapce&#x2F;&quot;&gt;or&lt;&#x2F;a&gt;s – I
suspect the problem was largely me not them to be honest – and spent some
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-emacs&quot;&gt;updating my emacs configuration&lt;&#x2F;a&gt; because
giving one’s tools a clean and polish occasionally seems a worthwhile thing plus
it eased me into a life of not attending committee meetings. Having done that
for a while, I rewarded myself by finishing off &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&quot;&gt;a little bit of Python code I
have called &lt;code&gt;bibtox&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; for processing my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;publications&quot;&gt;BibTeX
files&lt;&#x2F;a&gt; so I can keep them well-formatted
as well as produce HTML output for &lt;a href=&quot;&#x2F;research&#x2F;&quot;&gt;this website&lt;&#x2F;a&gt;. And I finally got
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;typst.app&#x2F;&quot;&gt;&lt;code&gt;typst&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; installed, began to learn how to use it at least a little bit,
and started writing. I also spent a few days travelling connected to some external work.&lt;&#x2F;p&gt;
&lt;p&gt;So– perhaps not the most spectacularly interesting first week. But I made a
start. So there’s that. The plan for week 2 is to finish polishing my configuration and probably blog about at least some of the updates – emacs has moved on since I last looked – and then do some writing in earnest. Let’s see how I get on :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>All Change!</title>
        <published>2025-10-02T00:00:00+00:00</published>
        <updated>2025-10-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/all-change/"/>
        <id>https://mort.io/blog/all-change/</id>
        
        <content type="html" xml:base="https://mort.io/blog/all-change/">&lt;p&gt;New (academic) year, new responsibilities. Or more precisely, far fewer
responsibilities :)&lt;&#x2F;p&gt;
&lt;p&gt;I’m on sabbatical for this academic year&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; and, as a result, have been
required to give up almost all the various roles I’ve had over the past few
years. I keep being – or perhaps more precisely, revert to being – a
professor, of course, I’ll remain a Fellow of Christ’s College, and I’m allowed
to remain on the University Council.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; I’ll also retain external roles, like
my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ipco.org.uk&#x2F;&quot;&gt;IPCO&lt;&#x2F;a&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ipco.org.uk&#x2F;who-we-are&#x2F;technology-advisory-panel&#x2F;&quot;&gt;TAP&lt;&#x2F;a&gt; membership.&lt;&#x2F;p&gt;
&lt;p&gt;However, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;univ&#x2F;so&#x2F;&quot;&gt;University rules&lt;&#x2F;a&gt; mean that I
have to give up all teaching, admin and College Officer roles – everything
that’s not research basically. I’m allowed to supervise Ph.D. students and
remain on University Council, and that’s pretty much it.&lt;&#x2F;p&gt;
&lt;p&gt;So I’m not planning to supervise any Part II&#x2F;Part III&#x2F;M.Phil. projects, I won’t
be lecturing, Directing Studies, or supervising. Whatever will I do with
myself… Well, more on that later perhaps – I do have ideas if not yet actual
plans :)&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;I did notice one stupidity in the rules around sabbatical in the course of
applying for this one. I had always assumed sabbatical leave accrued at one
term in every seven (it does, cf. the sabbath), and that you could never
accrue more than one year (~ three terms) leave. But it turns out that’s not
quite correct – the actual rule is that &lt;em&gt;reckonable terms&lt;&#x2F;em&gt; (those that
count toward sabbatical leave – so six reckonable terms gets you one term
of sabbatical leave) expire after six years. In my case I hit an edge case
as a result of having taken two terms sabbatical leave back in 2021 (Lent
and Easter terms 2021 to be precise). During periods of sabbatical leave,
the clock keeps ticking to expire reckonable terms already accrued. The
result was that when I came to apply for this year’s sabbatical leave, I was
actually two reckonable terms short – they’d fallen off the end due to the
expiry clock not stopping while I was on leave in 2021. Fortunately, while
HR wanted me to ask my Faculty to “mortgage” two future reckonable terms,
there was another route: the Faculty Board can just declare that they’re
going to count the expired terms anyway. And, happily, they did. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;I also remain a member of most of the various committees of Council that
I’m on, though I’m exempted from attending meetings. By which it turns out
is meant &lt;em&gt;forbidden&lt;&#x2F;em&gt; from attending meetings. &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A wander around Vienna</title>
        <published>2025-09-16T00:00:00+00:00</published>
        <updated>2025-09-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2025-vienna/"/>
        <id>https://mort.io/tracks/2025-vienna/</id>
        
        <summary type="html">&lt;p&gt;I visited Vienna to participate in a workshop about end-to-end encryption and
such things, run by the EU Fundamental Rights Agency (FRA). As I took the train
to get there (Cambridge &amp;gt; St Pancras &amp;gt; Amsterdam &amp;gt; Vienna (overnight)) and
arrived at about 09.30 for the workshop to start at about noon, I walked from
the station.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Systematising the obvious</title>
        <published>2025-09-12T00:00:00+00:00</published>
        <updated>2025-09-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/research-matrix/"/>
        <id>https://mort.io/blog/research-matrix/</id>
        
        <content type="html" xml:base="https://mort.io/blog/research-matrix/">&lt;p&gt;Ok, so this is one of those that comes about because I found myself saying the
same thing to different people a couple of times within a week or so. Which I
usually think means I should probably write it down.&lt;&#x2F;p&gt;
&lt;p&gt;I had been talking with Ph.D. students about selecting research topics, doing
research, and what is interesting subsequently to report in papers. In doing so
I recalled some advice that was given to me during my Ph.D. — so I’m not taking
credit for this, though I can’t recall who specifically said it to me like this
first; possibly Ralph Becket. What follows is of course scoped to computer
systems research as far as I’m concerned, though it may well apply more broadly.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;img src=&quot;research-matrix.jpg&quot; class=&quot;fr pd1&quot; alt=&quot;A plain whiteboard sketch of the matrix described in the main text&quot; width=&quot;480&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;figcaption&gt;A whiteboard sketch of the obvious&#x2F;successful matrix.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;p&gt;Anyway, to the point. I have sometimes found it useful to think about research
topics and their results as placed along two axes, each of which I split into
two categories. The first axis might be labelled &lt;em&gt;obviousness&lt;&#x2F;em&gt; with the two
categories labelled “&lt;em&gt;obviously…&lt;&#x2F;em&gt;” and “&lt;em&gt;non-obviously…&lt;&#x2F;em&gt;”.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; The second
axis might be labelled &lt;em&gt;success&lt;&#x2F;em&gt; with the two categories “&lt;em&gt;…works&lt;&#x2F;em&gt;” and
“&lt;em&gt;…doesn’t work&lt;&#x2F;em&gt;”. Finally, I put an indicator in each quadrant as to the
desirability of work in that quadrant – shown in the picture as ticks (the more
ticks, the more desirable), or crosses (undesirable).&lt;&#x2F;p&gt;
&lt;p&gt;Considering each of the quadrants then, we have in order of desirability:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;non-obviously works&lt;&#x2F;strong&gt;: Bingo! This is when you’ve done something that
people didn’t think would work but it turns out you had sufficient insight,
skill, luck, resources, or whatever to make it work. Reporting this sort of
work is happy times – fame, glory, riches, the prize. No, wait, that’s not
right. Oh yes — you get a good published paper. Nice.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;obviously works&lt;&#x2F;strong&gt;: The bulk of published research in my experience.
Certainly not bad, and definitely contributing to knowledge. But not really
surprising — unlikely to create that elusive “wow! that’s cool!” feeling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;non-obviously doesn’t work&lt;&#x2F;strong&gt;: Far too little of this sort of thing is
published in my opinion. I feel quite pleased when I manage work like this
because I don’t need to care quite so much as I used to about getting papers
accepted and I find the process and outcome interesting. But it is sometimes
hard to get this work out there as it often seems too easy for reviewers to
focus on the fact the thing didn’t work rather than considering the
contribution you’ve made by showing that everyone else’s intuitions are
wrong. Sad but mildly self-righteous times ensue.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;obviously doesn’t work&lt;&#x2F;strong&gt;: No-one cares. Tends to get a big “yeah? and?
idiot” from reviewers. I wouldn’t usually bother except as a personal
learning exercise.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;In retrospect, I realise that the more natural word here would have been
&lt;em&gt;surprisingly&lt;&#x2F;em&gt;. Sigh. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Orating honours</title>
        <published>2025-09-05T00:00:00+00:00</published>
        <updated>2025-09-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/orating-honors/"/>
        <id>https://mort.io/blog/orating-honors/</id>
        
        <content type="html" xml:base="https://mort.io/blog/orating-honors/">&lt;p&gt;This is a bit of a niche one but – here in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cam.ac.uk&#x2F;&quot;&gt;Cambridge&lt;&#x2F;a&gt;
we have a number of quaint &#x2F; historic &#x2F; weird &#x2F; cool (take your pick)
traditions. One that I think is at the quite cool end is that, when we award
honorary degrees, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;glossary.lib.cam.ac.uk&#x2F;term&#x2F;orator&quot;&gt;University
Orator&lt;&#x2F;a&gt; writes and delivers an
oration introducing the honorand and explaining why they’re getting the degree.
In Latin. And, occasionally, also with fragments in Greek and Sindarin.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-elvish-1&quot;&gt;&lt;a href=&quot;#fn-elvish&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
And when I say “delivers”, I really mean “performs” based on what I saw when in
the audience for the honorary degree ceremony this year for the first time.&lt;&#x2F;p&gt;
&lt;p&gt;Happily, as we’re not totally behind the times, English translations are also
provided, in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.reporter.admin.cam.ac.uk&#x2F;&quot;&gt;the Reporter&lt;&#x2F;a&gt; naturally.
And I decided to take a look back through some as I thought some of the ones I
saw this year were pretty good. And as it was a slow Sunday afternoon, I went
back as far as the online Reporter allowed. And here are the results – a list
of links to all of the oration texts that are online, with some honorands called
out where I thought they were particularly cool or interesting or
moving,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-moving-1&quot;&gt;&lt;a href=&quot;#fn-moving&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; or I’d heard of the recipient.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-culture-1&quot;&gt;&lt;a href=&quot;#fn-culture&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Enjoy?&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Year&lt;&#x2F;th&gt;&lt;th&gt;Honorands&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2024-25&#x2F;weekly&#x2F;6791&#x2F;section7.shtml#heading2-12&quot;&gt;2025&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stormzy&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2023-24&#x2F;weekly&#x2F;6747&#x2F;section4.shtml#heading2-9&quot;&gt;2024&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Kip Thorne&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2022-23&#x2F;weekly&#x2F;6706&#x2F;6706.pdf#page=22&quot;&gt;2023&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2021-22&#x2F;weekly&#x2F;6664&#x2F;6664.pdf#page=17&quot;&gt;2022&lt;&#x2F;a&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-absentia-1&quot;&gt;&lt;a href=&quot;#fn-absentia&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;td&gt;&lt;td&gt;Roger Penrose • Simon Schama&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2020&lt;&#x2F;td&gt;&lt;td&gt;no ceremony due to the COVID-19 pandemic so none conferred&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2018-19&#x2F;weekly&#x2F;6553&#x2F;section5.shtml#heading2-14&quot;&gt;2019&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Doreen Lawrence • Jane Goodall&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2017-18&#x2F;weekly&#x2F;6512&#x2F;section7.shtml#heading2-16&quot;&gt;2018&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Borys • Michael Edwards&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2016-17&#x2F;weekly&#x2F;6471&#x2F;section8.shtml#heading2-22&quot;&gt;2017&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stephanie Shirley • Sophie Wilson • Manuel Castells&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2015-16&#x2F;weekly&#x2F;6431&#x2F;section9.shtml#heading2-48&quot;&gt;2016&lt;&#x2F;a&gt; [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2015-16&#x2F;weekly&#x2F;6431&#x2F;6431-CambridgeHonoraryDegrees-2016.pdf&quot;&gt;pdf&lt;&#x2F;a&gt;]&lt;&#x2F;td&gt;&lt;td&gt;Keith Peters • Jonny Ive&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2014-15&#x2F;weekly&#x2F;6392&#x2F;section7.shtml#heading2-23&quot;&gt;2015&lt;&#x2F;a&gt; [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2014-15&#x2F;weekly&#x2F;6392&#x2F;6392-CambridgeHonoraryDegrees-2015.pdf&quot;&gt;pdf&lt;&#x2F;a&gt;]&lt;&#x2F;td&gt;&lt;td&gt;Julia Neuberger • Neil Macgregor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2013-14&#x2F;weekly&#x2F;6353&#x2F;section6.shtml#heading2-18&quot;&gt;2014&lt;&#x2F;a&gt; [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2013-14&#x2F;weekly&#x2F;6353&#x2F;6353-Honorary-Degrees-June2014.pdf&quot;&gt;pdf&lt;&#x2F;a&gt;]&lt;&#x2F;td&gt;&lt;td&gt;Albie Sachs • Yusuf Hamied • Martin Rees • Ian Mckellan&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2012-13&#x2F;weekly&#x2F;6315&#x2F;Cambridge_Honorary_Degree_Congregation_2013.pdf&quot;&gt;2013&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Hilary Mantel&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2011-12&#x2F;weekly&#x2F;6273&#x2F;hon_degrees_2012.pdf&quot;&gt;2012&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Peter Higgs • Alfred Brendel&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2010-11&#x2F;weekly&#x2F;6231&#x2F;hon_degs_2011.pdf&quot;&gt;2011&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2009-10&#x2F;weekly&#x2F;6195&#x2F;section12.shtml#heading2-49&quot;&gt;2010&lt;&#x2F;a&gt; [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2009-10&#x2F;weekly&#x2F;6195&#x2F;honorary_degrees.pdf&quot;&gt;pdf&lt;&#x2F;a&gt;]&lt;&#x2F;td&gt;&lt;td&gt;Andrew Wiles • Evelyn Glennie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2008-09&#x2F;weekly&#x2F;6156&#x2F;25.html&quot;&gt;2009&lt;&#x2F;a&gt; [&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2008-09&#x2F;weekly&#x2F;6156&#x2F;acta.pdf&quot;&gt;pdf&lt;&#x2F;a&gt;]&lt;&#x2F;td&gt;&lt;td&gt;The Aga Khan • Melinda Gates • Bill Gates • Shirley Williams • William Broecker [ global warming ] • Amartya Sen&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2007-08&#x2F;weekly&#x2F;6117&#x2F;29.html&quot;&gt;2008&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;John Sentamu&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2006-07&#x2F;weekly&#x2F;6080&#x2F;20.html&quot;&gt;2007&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Hans Blix • Ann Cotton • Onora O’Neill • Nicholas Stern&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2005-06&#x2F;weekly&#x2F;6043&#x2F;26.html&quot;&gt;2006&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2004-05&#x2F;weekly&#x2F;6006&#x2F;23.html&quot;&gt;2005&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2003-04&#x2F;weekly&#x2F;5968&#x2F;34.html&quot;&gt;2004&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Robert Horvitz • Quentin Blake • John Dankworth • Cleo Laine&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2002-03&#x2F;weekly&#x2F;5930&#x2F;28.html&quot;&gt;2003&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Alan Macdiarmid • John Sulston • John Adams&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2001-02&#x2F;weekly&#x2F;5891&#x2F;15.html&quot;&gt;2002&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2000-01&#x2F;weekly&#x2F;5851&#x2F;45.html&quot;&gt;2001&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sydney Brenner • Mamphela Ramphele • Margaret Atwood&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;1999-2000&#x2F;weekly&#x2F;5817&#x2F;17.html&quot;&gt;2000&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;1998-99&#x2F;weekly&#x2F;5781&#x2F;25.html&quot;&gt;1999&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Desmond Tutu • Gordon Moore • Miriam Rothschild&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;1997-98&#x2F;weekly&#x2F;5744&#x2F;4.html&quot;&gt;1998&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;Aung San Suu Kyi (in absentia!) • Barbara Castle • Helmut Kohl • Aaron Klug&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;…and there, sadly, the Reporter online record ends.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-elvish&quot;&gt;
&lt;p&gt;Elvish to those not well versed in Tolkien. I once posted to
&lt;code&gt;rec.arts.sf.tolkien&lt;&#x2F;code&gt;. Just saying. &lt;a href=&quot;#fr-elvish-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-moving&quot;&gt;
&lt;p&gt;Seriously. See, for example, those for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2018-19&#x2F;weekly&#x2F;6553&#x2F;section5.shtml#heading2-14&quot;&gt;Doreen
Lawrence&lt;&#x2F;a&gt;
or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.admin.cam.ac.uk&#x2F;reporter&#x2F;2013-14&#x2F;weekly&#x2F;6353&#x2F;6353-Honorary-Degrees-June2014.pdf&quot;&gt;Yusuf
Hamied&lt;&#x2F;a&gt;. &lt;a href=&quot;#fr-moving-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-culture&quot;&gt;
&lt;p&gt;I am not particularly well-versed in culture, being mostly a geek of
sorts. Whatevs. &lt;a href=&quot;#fr-culture-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-absentia&quot;&gt;
&lt;p&gt;Included celebration of those conferred in absentia in 2021 due to
COVID-19. &lt;a href=&quot;#fr-absentia-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Resizing swap partition on NixOS</title>
        <published>2025-08-13T00:00:00+00:00</published>
        <updated>2025-08-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/resize-swap/"/>
        <id>https://mort.io/blog/resize-swap/</id>
        
        <content type="html" xml:base="https://mort.io/blog/resize-swap/">&lt;p&gt;I recently decided that I had over-egged the pudding and allocated too much
space to my swap partition (mounted as &lt;code&gt;&#x2F;tmp&lt;&#x2F;code&gt;) under NixOS. At the same time, it
had got to the point where I was bouncing off the ceiling a little with the
other two partitions, &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; and &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; (wherein lives the Nix store).&lt;&#x2F;p&gt;
&lt;p&gt;I tried &lt;code&gt;gparted&lt;&#x2F;code&gt; first for a handy GUI but got nowhere due to (I think) Wayland:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix profile install nixpkgs#gparted.out&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gparted&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;localuser:root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; being added to access control list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Error&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; executing command as another user: No authentication agent found.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;localuser:root&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; being removed from access control list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo gparted&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Invalid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; MIT-MAGIC-COOKIE-1 key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;gpartedbin:360533&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; Gtk-WARNING&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; **&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;: 19:19:25.626: cannot open display: :0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So the obvious solution was to reduce the size of the swap partition and
increase the other two. However, doing this for my setup – a LUKS-encrypted
device partitioned using Logical Volume Manager (LVM) – turned out to be a
little less obvious than it might have been, and searching the interwebs turned
up several not quite correct answers, I thought I’d make a note here.&lt;&#x2F;p&gt;
&lt;p&gt;NB. Don’t pay too much attention to the sizes of partitions below: I cribbed
these notes from shell history but re-ran some commands to get the output as I’d
already closed that shell so they may not be entirely coherent. The commands
should be right though.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Find your partition names using &lt;code&gt;lvscan&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo lvscan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  ACTIVE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;            &amp;#39;&#x2F;dev&#x2F;vg0&#x2F;home&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; [&amp;lt;729.61&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB] inherit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  ACTIVE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;            &amp;#39;&#x2F;dev&#x2F;vg0&#x2F;nixos&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; [94.00&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB] inherit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  ACTIVE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;            &amp;#39;&#x2F;dev&#x2F;vg0&#x2F;nixos-swap&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; [16.00&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB] inherit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Normally I would then just use &lt;code&gt;lvreduce&lt;&#x2F;code&gt; – but that fails on the swap partition:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo lvreduce&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -r --size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 12GiB &#x2F;dev&#x2F;vg0&#x2F;nixos-swap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  File&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; system swap found on vg0&#x2F;nixos-swap.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  File&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; system size&lt;&#x2F;span&gt;&lt;span&gt; (16.00&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;span&gt;) is larger than the requested size (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;12.00&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; GiB&lt;&#x2F;span&gt;&lt;span&gt;).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  File&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; system reduce is required and not supported&lt;&#x2F;span&gt;&lt;span&gt; (swap).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So instead…&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Delete the swap partition and recreate to the desired size (16GB in my case):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lvremove &#x2F;dev&#x2F;vg0&#x2F;nixos-swap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lvcreate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -L&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 16G&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nixos-swap vg0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkswap &#x2F;dev&#x2F;vg0&#x2F;nixos-swap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; swapon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;vg0&#x2F;nixos-swap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Reallocate the now available space to other partitions:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# `&#x2F;home` is easy: extend logical volume and resize the filesystem at in one go:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo lvextend&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -r -L&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; +16G &#x2F;dev&#x2F;vg0&#x2F;home&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# however, can&amp;#39;t resize the root filesystem as part of the `lvextend` because it&amp;#39;s read-only.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# instead, find the relevant filesystem:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; df&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -Th&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Filesystem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;                                             Type  Size  Used Avail Use% Mounted on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;dev&#x2F;disk&#x2F;by-uuid&#x2F;8dd0d118-375f-4e8b-84bc-1a05b68889b7&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ext4   92G   66G   22G  76% &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# ...and then manually resize it after extending the logical volume:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo lvextend&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -L&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; +12G &#x2F;dev&#x2F;vg0&#x2F;nixos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo resize2fs &#x2F;dev&#x2F;disk&#x2F;by-uuid&#x2F;8dd0d118-375f-4e8b-84bc-1a05b68889b7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;And that’s it. Swap partition is reduced in size, and the space is reallocated
to the other two partitions, &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; and &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Re-key-remapping</title>
        <published>2025-07-26T00:00:00+00:00</published>
        <updated>2025-07-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/keymapping-reprise/"/>
        <id>https://mort.io/blog/keymapping-reprise/</id>
        
        <content type="html" xml:base="https://mort.io/blog/keymapping-reprise/">&lt;p&gt;As all right-minded people must, I remap the historic, redundant, absurd
&lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt; key&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; to be a more conveniently accessible current, useful, sleek
&lt;code&gt;CTRL&lt;&#x2F;code&gt; (control) key on any given keyboard. I also do some other minor mods to
assist retention of the little sanity I still have – as I get older and more
decrepit, it gets harder for me to handle change. Deal with it.&lt;&#x2F;p&gt;
&lt;p&gt;I &lt;a href=&quot;&#x2F;blog&#x2F;elcapitan-maps&#x2F;&quot;&gt;used&lt;&#x2F;a&gt; &lt;a href=&quot;&#x2F;blog&#x2F;mess-with-my-keyboard&#x2F;&quot;&gt;to do this&lt;&#x2F;a&gt; &lt;a href=&quot;&#x2F;blog&#x2F;setup-new-laptop&#x2F;&quot;&gt;on
my Macbook&lt;&#x2F;a&gt; using a tool called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;karabiner-elements.pqrs.org&#x2F;&quot;&gt;Karabiner
Elements&lt;&#x2F;a&gt;. But now I’m on Linux, that’s
not a thing. So I use the excellent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rvaiya&#x2F;keyd&quot;&gt;&lt;code&gt;keyd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; instead. The UK Thinkpad keyboard
being a lot less daft in design than the UK Macbook keyboard, the modifications
are also much smaller, which is nice.&lt;&#x2F;p&gt;
&lt;p&gt;However the canonical First Modification, &lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt; to &lt;code&gt;CONTROL&lt;&#x2F;code&gt; remains the
key one. For added convenience, given I rarely need to “tap” &lt;code&gt;CTRL&lt;&#x2F;code&gt; I also make a
tap on the &lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt; key into an &lt;code&gt;ESC&lt;&#x2F;code&gt; (escape). And there the fun starts.&lt;&#x2F;p&gt;
&lt;p&gt;It turns out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rvaiya&#x2F;keyd&quot;&gt;&lt;code&gt;keyd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; recommended way to achieve this is with the
configuration stanza&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[main]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;capslock = overload(capslock, esc)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…which is mostly fine and has worked well for me for some time. But I realised
I was getting increasingly irritated that I seemed to get spurious &lt;code&gt;ESC&lt;&#x2F;code&gt; key
presses when using &lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt; as &lt;code&gt;CTRL&lt;&#x2F;code&gt;. &lt;code&gt;sudo keyd monitor&lt;&#x2F;code&gt; and it became clear
that the semantics of the &lt;code&gt;overload()&lt;&#x2F;code&gt; function weren’t quite as I thought. From
&lt;code&gt;man keyd&lt;&#x2F;code&gt;,&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;overload(&amp;lt;layer&amp;gt;, &amp;lt;action&amp;gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Activates the given layer while held and executes &amp;lt;action&amp;gt; on tap.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I had assumed this meant that &lt;code&gt;&amp;lt;action&amp;gt;&lt;&#x2F;code&gt; did not execute if the assigned key was
held, but it doesn’t quite: it seems that a tap is deemed to have occurred if
the key is not &lt;em&gt;chorded&lt;&#x2F;em&gt;. So sometimes, being a bit slow, when I hold &lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt;
thinking I want to chord and thus have it treated as &lt;code&gt;CTRL&lt;&#x2F;code&gt; but then realise I
don’t and I just let go, I still get an &lt;code&gt;ESC&lt;&#x2F;code&gt; generated – even if it was a
second or two that I was holding it down for.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So I read a bit more of the manpage can came across the &lt;code&gt;timeout&lt;&#x2F;code&gt; function&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;timeout(&amp;lt;action 1&amp;gt;, &amp;lt;timeout&amp;gt;, &amp;lt;action 2&amp;gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    If the key is held in isolation for more than &amp;lt;timeout&amp;gt; ms, activate the&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    second action, if the key is held for less than &amp;lt;timeout&amp;gt; ms or another key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    is struck before &amp;lt;timeout&amp;gt; ms expires, execute the first action.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    E.g.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    timeout(a, 500, layer(control))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Will cause the assigned key to behave as control if it is held for more than&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    500 ms.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…used as &lt;code&gt;capslock = timeout(esc, 250, layer(control))&lt;&#x2F;code&gt; but that turns out
also not to be quite right. In the end, it looks like the right answer is
&lt;code&gt;overloadt2&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;overloadt(&amp;lt;layer&amp;gt;, &amp;lt;action&amp;gt;, &amp;lt;timeout&amp;gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Identical to overload, but only activates the layer if the bound key is held&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    for &amp;lt;timeout&amp;gt; milliseconds. This is mainly useful for overloading keys which&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    are commonly struck in sequence (e.g letter keys).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Note that this will add a visual delay when typing, since overlapping keys&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    will be queued until the timeout expires or the bound key is released.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;overloadt2(&amp;lt;layer&amp;gt;, &amp;lt;action&amp;gt;, &amp;lt;timeout&amp;gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Identical to overloadt, but additionally resolves as a hold in the event of&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    an intervening key tap.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The end result is the following stanza in my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt;
configuration:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;keyd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;  keyboards&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    ids&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;*&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;    settings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      main&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;        # capslock -&amp;gt; (held) ctrl, (tap) ESC&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        capslock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;overloadt2(control, esc, 150)&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        rightalt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;leftalt&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;      shift&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;        grave&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;G-4&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # S-` -&amp;gt; €&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  };&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;timeout&lt;&#x2F;code&gt; of 150ms feels “about right” at this point – 100ms was borderline
not enough, and 200ms was definitely annoyingly long.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Not to be confused with the elegant, historic, radical &lt;code&gt;RUN&#x2F;STOP&lt;&#x2F;code&gt; key of course. C64 FTW! &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;Honestly, sometimes I really am that slow. I’m old see? &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Whither AI?</title>
        <published>2025-07-05T00:00:00+00:00</published>
        <updated>2025-07-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/whither-ai/"/>
        <id>https://mort.io/blog/whither-ai/</id>
        
        <content type="html" xml:base="https://mort.io/blog/whither-ai/">&lt;p&gt;I am hardly the first person to comment&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; on this – I am given to understand
AI has been a topic of some interest to many for a few years now. I’m sure I’ve
seen, and possibly even &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.me.uk&#x2F;@mort&quot;&gt;re-tooted&lt;&#x2F;a&gt; things about
it in fact. I’m afraid I just don’t keep up.&lt;&#x2F;p&gt;
&lt;p&gt;But recent experiences reviewing for a couple of systems&#x2F;networking venues has
led me to feel I need to ask: &lt;strong&gt;WHY&lt;&#x2F;strong&gt;? More pointedly, why does the following
seem like good motivation for a research paper?&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;There is a complex and important task that currently requires considerable
expertise to carry out because it is important to be precise and get it
right.&lt;&#x2F;li&gt;
&lt;li&gt;The task in question can be described imprecisely using natural language by
non-experts.&lt;&#x2F;li&gt;
&lt;li&gt;AI (inevitably, some large-language model) can take that natural language
description and, after training, produce some output that is stochastically
like unto what an expert might produce given the same underlying problem,
having brought to bear their expertise.&lt;&#x2F;li&gt;
&lt;li&gt;Thus we build an AI that can take the non-expert’s imprecise description and
show that sometimes the output it produces is not so wrong as to fail some
&lt;em&gt;ad hoc&lt;&#x2F;em&gt; tests of utility that we introduce.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Based on things I’ve recently reviewed “not so wrong” above means “error rate of
no more than 25—30% when taking expertly generated natural language prompts as
input”. Which is to say, probably not the sorts of input prompt that a
non-expert might produce.&lt;&#x2F;p&gt;
&lt;p&gt;Network configuration and management is the domain I’ve seen this argument made
in most recently. Which seems quite strange to me because I always thought that
a 25% error rate in configuring, e.g., your enterprise network security
perimeter would be bad. But apparently not if it’s done by an AI.&lt;&#x2F;p&gt;
&lt;p&gt;More generally, why do we want to build tools that allow untrained experts to do
a job when mistakes are high impact, it requires a trained expert to detect
those mistakes, and those tools &lt;em&gt;by design&lt;&#x2F;em&gt; only produce statistically valid
output? An error rate of once in a blue moon is categorically worse than a zero
error rate if the error involved can leave your entire digital estate open to
compromise.&lt;&#x2F;p&gt;
&lt;p&gt;If the big issue here is that experts sometimes make typos when editing the
configuration files, maybe building some domain-specific languages or better
user interfaces or verification techniques or other tooling would be a better
way to help them not do that than replacing them with tools that &lt;strong&gt;by design&lt;&#x2F;strong&gt;
are only ever probably about right.&lt;&#x2F;p&gt;
&lt;p&gt;So please stop justifying your AI application research by saying simply that it
allows non-experts to carry out expert work! I’m much more likely to be
convinced by uses of AI that make experts &lt;em&gt;more productive&lt;&#x2F;em&gt; – though don’t get
me started on how to measure productivity because I don’t know except via means
which are expensive and time consuming, and it really seems that very few people
can be bothered doing that.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Ok fine. I admit it. This is a rant. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Artificial Intelligence, but at what cost?</title>
        <published>2025-05-15T00:00:00+00:00</published>
        <updated>2025-05-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/sermonising/"/>
        <id>https://mort.io/blog/sermonising/</id>
        
        <content type="html" xml:base="https://mort.io/blog/sermonising/">&lt;p&gt;Our inestimable and most excellent Chaplain, Revd Dr Helen Orchard, likes to
have a theme for the Sunday evensong services for the term. Back in Michaelmas
2023 it was … AI. I said I’d help find someone to give a sermon from a
technical perspective but then signally failed to do so (sorry!). So in the end
I said I’d do it, even though AI is not my thing and I’d never given a sermon
before. Or, for that matter, attended evensong. Take the opportunities offered
and all that.&lt;&#x2F;p&gt;
&lt;p&gt;I realised this week that, although a few people at the time had asked for
copies, I’d also done nothing about that (I am nothing if not consistently
rubbish). So here’s the text, more or less as given, on 15 October 2023. Note
that the golden eagle I mount is a rather fine lectern in our Chapel (pictured).
Nothing more salacious than that. Filthy minds.&lt;&#x2F;p&gt;
&lt;p&gt;Three editorial notes given that it’s been over a year and a half since I gave
this (my! how time flies…):&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;I allude to this but should be clear: the neural network is not the only
technological approach to producing AI – several others exist and are both
useful and used, machine learning being one that’s particularly productive in
recent years. However the most hyped was and still seems to be various forms
of neural network so that’s what I focused on.&lt;&#x2F;li&gt;
&lt;li&gt;I refer to “static datasets” because the versions of ChatGPT at the time were
trained infrequently on a given dataset of the moment. Training updates now
seem much more frequent (perhaps weekly), user context is maintained
throughout a chat session, and user feedback sought at the end. So while it’s
still technically true that the datasets involved are static, it’s much less
noticeable.&lt;&#x2F;li&gt;
&lt;li&gt;The example of “God save the” worked particularly because this was only about
a year after Queen Elizabeth II died, so “queen” was likely still the
instinctive response of many.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Finally, just in case it’s not clear – I tend toward the sceptical end
regarding AI. Potentially a useful tool in some circumstances but all claims
about AGI are nonsense and the singularity won’t happen because of the machines.
Human stupidity on the other hand seems without bound. And always follow the
money.&lt;&#x2F;p&gt;
 &lt;figure class=&quot;fi fr pd1&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;www.christs.cam.ac.uk&#x2F;facilities&#x2F;chapel&quot;&gt;&lt;img src=&quot;Christ&#x27;s College Chapel 6.jpg&quot; class=&quot;fr pd1&quot; alt=&quot;A photograph of a fine golden-coloured lectern, the head of which is an eagle&quot; width=&quot;480&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;figcaption&gt;&lt;a href=&#x27;https:&#x2F;&#x2F;www.christs.cam.ac.uk&#x2F;sites&#x2F;default&#x2F;files&#x2F;inline-images&#x2F;Christ%27s%20College%20Chapel%206.jpg&#x27;&gt;A photograph of a fine golden-coloured lectern, the head of which is an eagle&lt;&#x2F;a&gt;.&lt;&#x2F;figcaption&gt;&lt;&#x2F;figure&gt;
&lt;blockquote&gt;
&lt;p&gt;As I mount the golden eagle for the first time, I should say that I am not
normally given to preaching – though my children might disagree with that
statement – but as the theme this term is Artificial Intelligence, Helen
asked me to speak to you about that from the perspective of a computer
scientist. Unless you catch me in a pub after a couple of pints, I am also not
given to philosophising, so I will limit myself to the physical reality of
&lt;em&gt;Artificial Intelligence&lt;&#x2F;em&gt;, or &lt;em&gt;AI&lt;&#x2F;em&gt;. Specifically, what is it and what does it
cost. I will use AIs that generate text as examples, as these so-called &lt;em&gt;Large
Language Models&lt;&#x2F;em&gt; have been the focus of considerable interest in recent
months, but the same basic mechanisms and problems apply to AIs used to
generate images, music, videos and so on.&lt;&#x2F;p&gt;
&lt;p&gt;First, what is it. AI is a catch-all term for a set of technologies that
attempt to replicate whatever we call “intelligence”. Computer scientists,
cognitive psychologists and mathematicians have worked on these various
technologies for decades, but the current vogue is very much for a particular
set of mathematical techniques that try to produce brain-like behaviour by
modelling inter-connected neurons.&lt;&#x2F;p&gt;
&lt;p&gt;Each neuron is stimulated by one or more input signals which it combines to
produce an output signal with some probability. The outputs of some neurons
are connected to the inputs of some other neurons, creating an enormous
network. The effect in our brains might be that an input signal “I want a
biscuit” results in an output signal that causes us to move an arm to pick up
a biscuit. In a modern “generative AI”, the input might be a sentence or
paragraph or two of text, and the resulting output might be an image or a
sequence of words.&lt;&#x2F;p&gt;
&lt;p&gt;As a simple example of what I mean, if I asked you to give the next few words
in the phrase starting “God save the” you might say “king send him
victorious”. You have just performed inference using your own language model,
generating some likely output text given three words of input. I’ll come back
to that example later.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I said the inputs were combined to produce the output with some probability,
but how exactly? The process for combining inputs involves a set of parameters
that are determined by finding the values that give the best fit some a priori
data. This is known as training if you’re an AI specialist, or parameter
fitting if you’re a statistician.&lt;&#x2F;p&gt;
&lt;p&gt;A simple analogy: you may recall that a straight line is defined by two
parameters, its slope and any point on the line. If you had a set of two
dimensional data points that you thought were straightforwardly related, you
might try to discover that relationship by drawing the best straight line you
could through them; but which particular line would you think was the best? A
reasonable choice might be the one that minimised the total distance from the
line to each point. For an AI the maths is a little more complex, but that’s
basically what happens: training finds the parameter values that give the best
fit to a large set of training data.&lt;&#x2F;p&gt;
&lt;p&gt;So that’s a modern AI: a statistical model that, when stimulated by one or
more inputs, produces outputs with some probability. The inputs might be words
or images or some other thing, and the outputs might be words or images or
some other thing. The underlying model might be wrapped up by other models
that, for example, try to filter out undesirable outputs or provide for
different ways of consuming inputs.&lt;&#x2F;p&gt;
&lt;p&gt;It is the sheer scale that makes this work: your brain has perhaps 100 billion
neurons each of which might connect to 10,000 other neurons for a total of
perhaps one million billion connections, whereas an AI such as a recent
version of ChatGPT might have 175 billion parameters but each connected to
just hundreds of others. The underlying mathematics has been known for
decades; it is the combination of massive training datasets and the enormous
computational resources of the cloud that have enabled us to build these AIs.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Second, ignoring the hysteria around so-called Artificial General Intelligence
and The Singularity, what costs do these AIs incur?&lt;&#x2F;p&gt;
&lt;p&gt;To return to the example I used, I said that you might have completed the
phrase “God save the” with the words “king send him victorious”. In some sense
that is the “correct” completion. But perhaps some of you would have initially
thought “queen send her victorious”. And I have at least one friend who would
naturally respond “queen and her fascist regime”.&lt;&#x2F;p&gt;
&lt;p&gt;Human experience is varied and personal – the training process I described
typically uses large static datasets collected by scraping the Internet. While
the resulting AI can be configured not always to produce identical outputs
given identical inputs, the training process does naturally lead to a kind of
homogenisation. Simplistically, if your group is not represented in that
training dataset, its experience will not be represented in the AI and thus
will not be reproduced in the output. Worse, if the training data contains
misrepresentations or attacks on your group, the AI will by default capture
and perpetuate them, already observed to be a particular problem for women,
Jews, and many minorities.&lt;&#x2F;p&gt;
&lt;p&gt;Further, I mentioned that training data is scraped from the Internet – but as
the musical Avenue Q famously put it, “the Internet is for porn”. A lot of
that text is rather fantastical and describes actions generally unacceptable
in polite society, so the companies producing and operating AIs try to create
guardrails by building other models that filter offensive outputs generated by
their AIs – but how do you train such a model? You need to start with
examples of offensive output that are labelled as such so that you can train a
model to differentiate between what is offensive and what is inoffensive. But
creating that labelled data involves human labour. For example, OpenAI were
reported as outsourcing this activity to workers in Kenya paid less than $2
per day to label perhaps 200 paragraphs per day of offensive input text with
the type of offensiveness: rape, torture, incest, and so on. Unpleasant and
psychologically damaging work.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;There are also more practical problems posed by the resources used to create
and operate AIs. In particular, energy and water.&lt;&#x2F;p&gt;
&lt;p&gt;It takes a lot of computation to train and operate a large popular AI –
OpenAI reported about three and a half thousand petaflops-per-second-days in
2020 to train their GPT model, where a petaflop represents a million billion
computations. That is, about 10 years of a computer running at one petaflop
per second. For comparison, your phone might achieve 0.1% of that performance.
But as the bumper sticker has it, the cloud is just someone else’s computer –
in the case of a training run for a large AI model, several hundred thousand
computers in a datacenter. For example, Microsoft’s Iowa datacenter was built
out for training models for OpenAI and has 285,000 standard processor cores
and 10,000 GPUs (more powerful and power-hungry processors that you might be
familiar with using if you’re a gamer).&lt;&#x2F;p&gt;
&lt;p&gt;This means CO&lt;sub&gt;2&lt;&#x2F;sub&gt; from the energy to power the computers plus water to
cool them. How much? Well, estimates computed for earlier, smaller, models put
the CO&lt;sub&gt;2&lt;&#x2F;sub&gt; footprint of a single training run at roughly the same as a
round-trip flight from New York to San Francisco. Once trained, individual
queries are comparatively cheap – but ChatGPT experienced the fastest ever
growth of an Internet service. Earlier this year it was estimated as serving
hundreds of millions of queries per day resulting in power consumption of
perhaps 1 gigawatt-hour each day – the equivalent of 33,000 American
households.&lt;&#x2F;p&gt;
&lt;p&gt;As for water, Microsoft has reported that its global water usage increased 34%
from 2021 to 2022; Google’s increased 20% in the same period, but from a
higher baseline. The increase is believed to be substantially due to training
and operating AI. A group from University of California at Riverside estimate
that each “conversation” with ChatGPT uses, directly and indirectly, about a
pint of water – and this generally needs to be clean drinking water that will
not leave residues that clog systems. The month before GPT-4 training was
completed, Microsoft’s Iowa datacenters consumed 11.5 million gallons, about
6% of the district’s drinking water. The amounts vary based on season and
location of the datacenter but it seems clear that water consumption is very
substantial and could impact local communities and ecosystems. And of course,
there is a tension here: cheap and green solar energy improves the carbon
footprint but the associated higher temperatures usually also worsens the
water footprint as more cooling is required.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So there’s a view of AI – an impressive set of mathematical and computational
techniques that can recreate some human behaviours to some extent in some
circumstances, at significant practical and moral cost. My own view is
threefold.&lt;&#x2F;p&gt;
&lt;p&gt;First, using the phrase “Artificial Intelligence” to describe these
technologies, rather than something less emotive such as Computationally
Intensive Statistics, inevitably generates a very strong hype cycle, and we
are currently at a point in that cycle where a welcome degree of scepticism is
starting to come in and people are more actively questioning what exactly
these technologies can and can’t do.&lt;&#x2F;p&gt;
&lt;p&gt;Second, we have largely proceeded to date without concern for any of the costs
I discussed earlier, and – also welcome – that is changing: the costs are
significant and we cannot ignore them.&lt;&#x2F;p&gt;
&lt;p&gt;Third, there are interesting legal and economic tussles taking place as to who
owns the training data, who owns the weights – that is, the AIs – produced,
and by whom and how should AIs be regulated. In particular, it is notable that
many companies are claiming that there is a need for regulatory barriers to be
introduced – but those are the companies that have already reached a scale
where they can overcome those barriers, so such barriers will serve only to
keep newcomers out of the marketplace, entrenching the existing power of “big
tech” (OpenAI, Google, Microsoft, Amazon, Meta, etc).&lt;&#x2F;p&gt;
&lt;p&gt;Finally, as I used the word hysteria earlier to describe hyped fears of
Artificial General Intelligence and the Singularity – &lt;strong&gt;please&lt;&#x2F;strong&gt; be sceptical
of anyone claiming that as a serious existential risk, &lt;strong&gt;particularly&lt;&#x2F;strong&gt; if
they are associated with aforementioned “big tech”! I view most of that
discourse as a “dead cat” strategy, an attempt to distract from the current
harms they are causing today by pointing to vague, nebulous, yet potentially
infinite future harms. For more about the quite startling beliefs of many of
those sounding those alarms, I recommend reading about the TESCREAL set of
ideologies – Transhumanism, Extropianism, Singularitarianism, Cosmism,
Rationalism, Effective Altruism, Longtermism.&lt;&#x2F;p&gt;
&lt;p&gt;Thank-you.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;References&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;background&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#background&quot; aria-label=&quot;Anchor link for: background&quot;&gt;Background&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;“Language Models are Few-Shot Learners”, OpenAI, 2020.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2005.14165&quot;&gt;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2005.14165&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;“On the Dangers of Stochastic Parrots: Can Language Models Be Too Big?”,
Bender et al, FAcct’21. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;3442188.3445922&quot;&gt;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;3442188.3445922&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;“The Internet is for porn”, Stephanie D’Abruzzo &amp;amp; Rick Lyon, Avenue Q.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;genius.com&#x2F;Stephanie-dabruzzo-and-rick-lyon-the-internet-is-for-porn-lyrics&quot;&gt;https:&#x2F;&#x2F;genius.com&#x2F;Stephanie-dabruzzo-and-rick-lyon-the-internet-is-for-porn-lyrics&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;hidden-work&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hidden-work&quot; aria-label=&quot;Anchor link for: hidden-work&quot;&gt;Hidden Work&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;“OpenAI Used Kenyan Workers on Less Than $2 Per Hour to Make ChatGPT Less
Toxic”, Time.com, 2023,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;time.com&#x2F;6247678&#x2F;openai-chatgpt-kenya-workers&#x2F;&quot;&gt;https:&#x2F;&#x2F;time.com&#x2F;6247678&#x2F;openai-chatgpt-kenya-workers&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;“Behind the secretive work of the many, many humans helping to train AI”,
NPR, 2023.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.npr.org&#x2F;2023&#x2F;06&#x2F;26&#x2F;1184392406&#x2F;behind-the-secretive-work-of-the-many-many-humans-helping-to-train-ai&quot;&gt;https:&#x2F;&#x2F;www.npr.org&#x2F;2023&#x2F;06&#x2F;26&#x2F;1184392406&#x2F;behind-the-secretive-work-of-the-many-many-humans-helping-to-train-ai&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;energy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#energy&quot; aria-label=&quot;Anchor link for: energy&quot;&gt;Energy&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;“Energy and Policy Considerations for Deep Learning in NLP”, Strubell et al,
2019. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;1906.02243&quot;&gt;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;1906.02243&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;“Training a single AI model can emit as much carbon as five cars in their
lifetimes”, MIT Technology Review, 2019.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.technologyreview.com&#x2F;2019&#x2F;06&#x2F;06&#x2F;239031&#x2F;training-a-single-ai-model-can-emit-as-much-carbon-as-five-cars-in-their-lifetimes&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.technologyreview.com&#x2F;2019&#x2F;06&#x2F;06&#x2F;239031&#x2F;training-a-single-ai-model-can-emit-as-much-carbon-as-five-cars-in-their-lifetimes&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;water&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#water&quot; aria-label=&quot;Anchor link for: water&quot;&gt;Water&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;“Artificial intelligence technology behind ChatGPT was built in Iowa — with a
lot of water”, AP News, 2023.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apnews.com&#x2F;article&#x2F;chatgpt-gpt4-iowa-ai-water-consumption-microsoft-f551fde98083d17a7e8d904f8be822c4&quot;&gt;https:&#x2F;&#x2F;apnews.com&#x2F;article&#x2F;chatgpt-gpt4-iowa-ai-water-consumption-microsoft-f551fde98083d17a7e8d904f8be822c4&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;“A.I. tools fueled a 34% spike in Microsoft’s water consumption, and one city
with its data centers is concerned about the effect on residential supply”,
Fortune, 2023.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fortune.com&#x2F;2023&#x2F;09&#x2F;09&#x2F;ai-chatgpt-usage-fuels-spike-in-microsoft-water-consumption&#x2F;&quot;&gt;https:&#x2F;&#x2F;fortune.com&#x2F;2023&#x2F;09&#x2F;09&#x2F;ai-chatgpt-usage-fuels-spike-in-microsoft-water-consumption&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;“Making AI Less “Thirsty”: Uncovering and Addressing the Secret Water
Footprint of AI Models“, Pengfei Li et al, 2023.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2304.03271&quot;&gt;https:&#x2F;&#x2F;arxiv.org&#x2F;abs&#x2F;2304.03271&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rusty Nu POSIX</title>
        <published>2025-05-07T00:00:00+00:00</published>
        <updated>2025-05-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/nu-posix/"/>
        <id>https://mort.io/blog/nu-posix/</id>
        
        <content type="html" xml:base="https://mort.io/blog/nu-posix/">&lt;p&gt;A slight delay to this post, but happily I now have no more lecturing to do
until 2027&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; :)&lt;&#x2F;p&gt;
&lt;p&gt;I switched a year or two ago to using NixOS as my daily driver following about
15 years as an increasingly irritated MacOS user. Shortly before I had become
interested in Rust as a systems programming language that seemed to marry
several things I like about OCaml with several other desirable things from C and
Python.&lt;&#x2F;p&gt;
&lt;p&gt;I then more recently observed something that I thought was interesting: there
seem to be a &lt;strong&gt;lot&lt;&#x2F;strong&gt; of recent replacements of what were once completely
standard and changeless POSIX utilities. I’m thinking things like &lt;code&gt;grep&lt;&#x2F;code&gt;,
&lt;code&gt;find&lt;&#x2F;code&gt;, &lt;code&gt;ls&lt;&#x2F;code&gt; and the like that I’ve been using uninterrupted, other than the
occasional quibble over whether it was the original version or the GNU version,
for about 30 years. Indeed, I have already raved (slightly) about
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;just.systems&#x2F;&quot;&gt;&lt;code&gt;just&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as a
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;make&#x2F;manual&#x2F;make.html&quot;&gt;&lt;code&gt;make&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; replacement and its
use with &lt;a href=&quot;&#x2F;blog&#x2F;just-ocaml&#x2F;&quot;&gt;OCaml&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;blog&#x2F;just-latex&#x2F;&quot;&gt;LaTeX&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;NixOS’ declarative configuration meant that I could actually see the list
growing, all in one place – I suspect on other systems I wouldn’t have noticed
in quite the same way because it would’ve been a much more incremental and
diffuse process of change without a clear record of the choices made.&lt;&#x2F;p&gt;
&lt;p&gt;I thus find in my
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;blob&#x2F;main&#x2F;nixos&#x2F;modules&#x2F;home-manager&#x2F;cli.nix#L44-L65&quot;&gt;&lt;code&gt;cli.nix&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
config that describes the CLI tools I expect, to have the following collection:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      nu_posix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        bat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better cat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        bottom&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # btm ~ better top, htop, etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        broot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # interactive directory navigation&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        chafa&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # terminal graphics viewer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ctpv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # terminal file previewer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        cyme&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better `lsusb`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        delta&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better syntax highlighting diff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        dua&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # disk usage, interactively&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        eza&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # improved `ls`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        fd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # `find` replacement&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        fend&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better CLI calculator&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        hexyl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # hex pretty printer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        htop&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # graphical top&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        iotop&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # io top&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        jujutsu&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        just&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # updated gnumake replacement&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        procs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better ps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ripgrep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # rg ~ `grep` replacement&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        sudo-rs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # memory-safe `sudo`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        uutils-coreutils-noprefix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # replaces GNU `coreutils`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        viddy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # better watch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I think that most, if not all, of these are written in Rust: that particular
language community seems to have a real enthusiasm for re-implementing
long-standing tools but better, and I have to say I really appreciate it! When I
say “better” I’m not particularly thinking of esoteric language features or
development ideologies either. I mean better in two very particular senses:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Usability&lt;&#x2F;strong&gt;. Many of the older tools simply did not have great user
interfaces and, when they were ok, they were not built using modern tooling.
As a result getting documentation was somewhere between good and great if
there was a decent &lt;code&gt;man&lt;&#x2F;code&gt;-page, with a range of potential switches for more
short form help or for cases where the &lt;code&gt;man&lt;&#x2F;code&gt;-page was not installed –
whether &lt;code&gt;-h&lt;&#x2F;code&gt;, &lt;code&gt;--help&lt;&#x2F;code&gt;, &lt;code&gt;-help&lt;&#x2F;code&gt;, &lt;code&gt;-?&lt;&#x2F;code&gt;, &lt;code&gt;help&lt;&#x2F;code&gt;, or something else. The
short-form help would, of course, be formatted in arbitrary ways.&lt;&#x2F;p&gt;
&lt;p&gt;The modern Rust-y replacements tend to use
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;clap&#x2F;latest&#x2F;clap&#x2F;&quot;&gt;&lt;code&gt;clap&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as a reasonably standard
command-line parser. As a result, they are remarkably consistent in usage and
format, typically producing something that looks a lot like &lt;code&gt;man&lt;&#x2F;code&gt;-page output
in response to their &lt;code&gt;-h|--help&lt;&#x2F;code&gt; switch. In a world where &lt;code&gt;man&lt;&#x2F;code&gt;-pages are
often an afterthought or, even worse, replaced by &lt;code&gt;info&lt;&#x2F;code&gt; documentation, I
find this invaluable. They are also generally inclined to make greater use of
modern terminal environments – &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;eza-community&#x2F;eza&quot;&gt;&lt;code&gt;eza&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
as a replacement for
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;coreutils&#x2F;manual&#x2F;html_node&#x2F;ls-invocation.html&quot;&gt;&lt;code&gt;ls&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
is a good example of this.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;&#x2F;strong&gt;. Old tools were originally built for old computers in old
languages (largely C) and, whether this is language ideology or just the
practicalities of engineering long-standing widely-used codebases, tended not
to be radically updated.&lt;&#x2F;p&gt;
&lt;p&gt;Rust re-implementations, on the other hand, are from scratch – and Rust’s
memory model appears to make it relatively easy for them to be made
multi-threaded. On modern hardware this seems to make them startlingly higher
performance than the alternatives. Tools I particularly appreciate for this
include &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;fd&quot;&gt;&lt;code&gt;fd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; replacing
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;findutils&#x2F;&quot;&gt;&lt;code&gt;find&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;ripgrep&quot;&gt;ripgrep,
&lt;code&gt;rg&lt;&#x2F;code&gt;,&lt;&#x2F;a&gt; replacing
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;grep&#x2F;&quot;&gt;&lt;code&gt;grep&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Perhaps the most immediate example of the benefits of this that I’ve experienced
is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Byron&#x2F;dua-cli&quot;&gt;&lt;code&gt;dua&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; via &lt;code&gt;dua i&lt;&#x2F;code&gt;. Traditionally, when
trying to clean up an uncomfortably full hard disk I would’ve ended up using
some manual iterative application of either &lt;code&gt;du -hS *&lt;&#x2F;code&gt; or possibly something
like &lt;code&gt;find ... | xargs du&lt;&#x2F;code&gt;. Or possibly written a Python script to do it for me.
And it would’ve taken &lt;em&gt;O&lt;&#x2F;em&gt;(hours) for me to find where the space was being used
and to do something about it. And I would’ve found it tedious and deeply
irritating.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In contrast, &lt;code&gt;dua i&lt;&#x2F;code&gt; gives me a TUI interface to navigate the filesystem from
wherever I run it, the ability to cumulatively mark files and directories for
trashing or immediate deletion, with subdirectory space summaries – and does so
across ~850GB &#x2F; 3 million files in about 10-15 seconds without using any form of
caching, database, or other such thing. As far as I can tell, simply by being
efficient and multi-threaded.&lt;&#x2F;p&gt;
&lt;p&gt;If this is the future, sign me up. (At least for the bits like this that are
good.)&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;…assuming I get back the same courses after my sabbatical that is. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;I’m easily irritated. What can I say. &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Coping and Capping</title>
        <published>2025-04-08T00:00:00+00:00</published>
        <updated>2025-04-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/coping-and-capping/"/>
        <id>https://mort.io/blog/coping-and-capping/</id>
        
        <content type="html" xml:base="https://mort.io/blog/coping-and-capping/">&lt;p&gt;Well that was fun! Quite high up there in the set of things that I never even
considered I might do would’ve been awarding degrees. But by dint of being
President and thus standing in for
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Simon_McDonald%2C_Baron_McDonald_of_Salford&quot;&gt;Simon&lt;&#x2F;a&gt;,
on Saturday I did exactly that.&lt;&#x2F;p&gt;
 &lt;img src=&quot;coped.jpg&quot; class=&quot;fl pd1&quot; alt=&quot;Me, coped and capped in the superman cape and mortarboard&quot; width=&quot;360&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;The University held a Congregation for those being admitted to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cambridgestudents.cam.ac.uk&#x2F;your-course&#x2F;graduation-and-what-next&#x2F;cambridge-ma&quot;&gt;Cambridge
MA&lt;&#x2F;a&gt;
(“Magistri in Artibus” – Master of Arts). Degrees are conferred by the
Chancellor, Vice-Chancellor or nominated deputy. Apparently, typically, for this
one and the main undergraduate congregation in July, that nominated deputy
Vice-Chancellor is usually the Head of House for the College concerned. In this
case, as President at Christ’s is effectively deputy Master (~ Head of House),
it me.&lt;&#x2F;p&gt;
&lt;p&gt;So instead of the usual Batman-style black gown, I got to wear the rather natty
Superman-style &lt;em&gt;cope&lt;&#x2F;em&gt;, hence I was &lt;em&gt;coped&lt;&#x2F;em&gt;. I also got to wear one of the fancy
hats (“square cap” or mortarboard) for the first time, hence I was also
&lt;em&gt;capped&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And as many other officers were also appropriately hatted, and out of respect
to the role would &lt;em&gt;cap&lt;&#x2F;em&gt; me at many available opportunities, the written advice I
received was literally that “officers will cap you – you do not have to cap
back” because the cope makes it difficult to do so.&lt;&#x2F;p&gt;
&lt;p&gt;So, in brief, it seems I coped with being coped and capped but could not cope
with capping while coped. To add to the excitement, I also had to Do Some Latin.
Thankfully it’s a dead language so I assume all it could do was turn in its
grave while I butchered it.&lt;&#x2F;p&gt;
&lt;p&gt;I hope everyone had a good time anyway!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rewarding influence</title>
        <published>2025-04-05T00:00:00+00:00</published>
        <updated>2025-04-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/happy-day/"/>
        <id>https://mort.io/blog/happy-day/</id>
        
        <content type="html" xml:base="https://mort.io/blog/happy-day/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;2025.eurosys.org&#x2F;index.html&quot;&gt;EuroSys 2025&lt;&#x2F;a&gt; was co-located with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asplos-conference.org&#x2F;asplos2025&#x2F;&quot;&gt;ASPLOS
2025&lt;&#x2F;a&gt; this year. Other
commitments meant I (again) couldn’t stay for the whole conference, attending
primarily because &lt;a href=&quot;..&#x2F;tdis-accepted&#x2F;&quot;&gt;two students had papers in the TDIS
workshop&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
 &lt;img src=&quot;stage.jpg&quot; class=&quot;fl pd1&quot; alt=&quot;A photograph of me in a yellow t-shirt receiving the award&quot; width=&quot;480&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;But happily I &lt;em&gt;was&lt;&#x2F;em&gt; able to stay for the first day of the conference –
“happily” not only because it gave me a chance to catch up with some old friends
I hadn’t seen in a decade or more, but also because &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;2451116.2451167&quot;&gt;the Mirage unikernels
paper&lt;&#x2F;a&gt; which appeared at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;asplos13.rice.edu&#x2F;&quot;&gt;ASPLOS
2013&lt;&#x2F;a&gt; won one of two &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asplos-conference.org&#x2F;asplos2025&#x2F;awards&#x2F;&quot;&gt;ASPLOS 2025 Influential Papers
awards&lt;&#x2F;a&gt; :)&lt;&#x2F;p&gt;
&lt;p&gt;This is obviously very flattering – typically doing research is necessarily its
own reward because the work can seem fruitless much of the time. Even when a
paper gets written and submitted it will most likely be rejected – I think
EuroSys this year reported something like a 12% acceptance rate, so rejection is
&lt;em&gt;a priori&lt;&#x2F;em&gt; the most likely outcome. Finally, if the paper does finally get
accepted, it will most likely sink without trace – perhaps a brief flurry of
interest for a few months or so, the paper gets cited a few times, and then it
fades away. This seems inevitable in a reasonably fast moving field that is also
growing at pace – EuroSys had ~160 attendees in 2006, growing to ~330 in the 10
years to 2016, but hitting ~1100 this year; while submissions grew from ~200 in
2019 to 696 this year.&lt;&#x2F;p&gt;
 &lt;img src=&quot;official.jpg&quot; class=&quot;fr pd1&quot; alt=&quot;A photograph of the certificate&quot; width=&quot;320&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;
&lt;p&gt;So to win an award recognising that others feel a paper actually had some
influence is rare, and makes me very happy :) At the same time, it reinforces a
couple of lessons that I really should’ve internalised by now.&lt;&#x2F;p&gt;
&lt;p&gt;The first is that papers inevitably get better for thoughtful considered
feedback from experts a step or several away from the work – so drafts should
be produced in plenty of time and distributed to anyone who’s willing to take
the time for feedback. In the case of this paper the previous failed submission
to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.usenix.org&#x2F;conference&#x2F;osdi12&quot;&gt;OSDI 2012&lt;&#x2F;a&gt; had, let’s say, reviews
of mixed quality. But one stood out, from Jon Howell (who signs his reviews so I
know it was him), who gave us a firm “reject” which (in retrospect) was actually
fairly well-deserved but in an incredibly constructive way. To paraphrase him
slightly, the work was interesting but the paper was crap – &lt;em&gt;and here’s how to
rewrite it so it makes sense&lt;&#x2F;em&gt;. We basically did what he said, ASPLOS accepted
it, and the rest is now history. (Over a decade ago, good grief.)&lt;&#x2F;p&gt;
&lt;p&gt;The second is that I simply cannot predict whether any research I’m doing is
actually going to turn out to have any value. The only other equivalent award
I’ve had was an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;infocom2024.ieee-infocom.org&#x2F;awards&quot;&gt;INFOCOM 2024 Test of Time
award&lt;&#x2F;a&gt; for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1109&#x2F;INFCOM.2012.6195845&quot;&gt;our 2012 paper on a
system called &lt;em&gt;Thinkair&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;, about
mobile-code offload from devices to the cloud. That paper had received
considerably more than just one rejection prior to acceptance, and if I recall
my final contribution correctly, I recommended not submitting it to INFOCOM as I
didn’t think we’d done enough to address previous review comments.&lt;&#x2F;p&gt;
&lt;p&gt;Shows what I know. But then, how boring would life be without a little
ignorance… :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Not one but two accepted papers and a Ph.D.</title>
        <published>2025-03-30T00:00:00+00:00</published>
        <updated>2025-03-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/tdis-accepted/"/>
        <id>https://mort.io/blog/tdis-accepted/</id>
        
        <content type="html" xml:base="https://mort.io/blog/tdis-accepted/">&lt;p&gt;As I find myself once more on a train to parts unknown (to me at least), a brief
update :)&lt;&#x2F;p&gt;
&lt;p&gt;The parts unknown in question is Rotterdam, NL (so really quite well-known to
quite a lot of people, just not me) for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;2025.eurosys.org&#x2F;&quot;&gt;EURO&#x2F;SYS
2025&lt;&#x2F;a&gt; (being held jointly with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.asplos-conference.org&#x2F;asplos2025&quot;&gt;ASPLOS
2025&lt;&#x2F;a&gt;, although I can’t stay for
the whole thing unfortunately) and specifically the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tdis.gitlab.io&#x2F;tdis25&#x2F;&quot;&gt;3rd International Workshop
of Testing Distributed Internet of Things Systems
(TDIS)&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Why? Happily the programme committee decided to accept two papers from my
(ex-)students – which is nice :) The two in question are&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;3719159.3721222&quot;&gt;Reckon-ing Kubernetes at the Edge using Emulated
Clusters&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; with Alessandro Sassi
(University of Cambridge &#x2F; Politecnico di Milano) and Christopher Jensen
(University of Cambridge &#x2F; Microsoft Research). This describes Alessandro’s
M.Sc. research project undertaken as a visitor with my group. He built on
Chris’ earlier work on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;3447851.3458739&quot;&gt;Reckon, an emulator setup for examining consensus
system behaviour&lt;&#x2F;a&gt;. Alessandor
extended this to use ContainerNet enabling it to emulate Kubernetes clusters
on a single node, and used this to examine Kubernetes performance in some
edge network scenarios. Source available on GitHub at
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;AleSassi&#x2F;reckon-k8s&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;AleSassi&#x2F;reckon-k8s&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doi.org&#x2F;10.1145&#x2F;3719159.3721221&quot;&gt;LoRaLive: Efficient LoRaWAN Traffic
Generation&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; with Vadim Safronov
(University of Oxford &#x2F; University of Cambridge). This reports a component of
Vadim’s Ph.D. work where he built a system to enable dense deployment LoRaWAN
trace-playback using a minimal number of nodes while respecting legal
constraints on duty cycles. Source available on GitHub at
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LoRaLive&#x2F;LoRaLive&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;LoRaLive&#x2F;LoRaLive&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Both nice tools that we hope might be of community interest!&lt;&#x2F;p&gt;
&lt;p&gt;The Ph.D. in question is Chris Jensen’s – happily he passed his viva on
Thursday just gone, titled “Separating conflict-recovery from failure-recovery
in distributed consensus”, examined by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;timharris.uk&#x2F;&quot;&gt;Tim Harris&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;charap.co&#x2F;&quot;&gt;Aleksey Charapko&lt;&#x2F;a&gt;. Other recent passes include Al-Amjad
Tawfiq Isstaif, titled “Contention-resilient overcommitment for serverless
deployments” and Andrew Jeffery, titled “Modelling orchestration”. The race&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;
is now on for the first to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;techreports&#x2F;&quot;&gt;tech
report&lt;&#x2F;a&gt;…&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;It’s not really a race. That would be weird. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>`nmcli` connection to internal WiFi</title>
        <published>2025-02-14T00:00:00+00:00</published>
        <updated>2025-02-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/internalcl-wifi/"/>
        <id>https://mort.io/blog/internalcl-wifi/</id>
        
        <content type="html" xml:base="https://mort.io/blog/internalcl-wifi/">&lt;p&gt;Using my fancy (?) new(-ish) Linux laptop running &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt;, I
finally had cause to connect to our internal Wi-Fi network. This was not
entirely trivial due to the various configuration options required. So here
goes, for the record, what I did as an aide memoir for me and in case it’s
useful for anyone else…&lt;&#x2F;p&gt;
&lt;p&gt;First, create the connection – the Wi-Fi network in question is named
&lt;code&gt;Internal-CL&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo nmcli connection add type wifi con-name Internal-CL ssid Internal-CL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Connection&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Internal-CL&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; (8f1ddcc9-4b1f-4e5d-9992-522714685eb4) successfully added.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, configure it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo nmcli connection edit Internal-CL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;===&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; nmcli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; interactive connection editor&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;===&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Editing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; existing &amp;#39;802-11-wireless&amp;#39; connection: &amp;#39;Internal-CL&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;help&amp;#39; or &amp;#39;?&amp;#39; for available commands.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;print&amp;#39; to show all the connection properties.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;describe [&amp;lt;setting&amp;gt;.&amp;lt;prop&amp;gt;]&amp;#39; for detailed property description.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;You&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; may edit the following settings: connection, 802-11-wireless&lt;&#x2F;span&gt;&lt;span&gt; (wifi), 802-11-wireless-security (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;wifi-sec&lt;&#x2F;span&gt;&lt;span&gt;), 802-1x, ethtool, match, ipv4, ipv6, hostname, link, tc, proxy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; set 802-1x.eap peap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; set 802-1x.phase2-auth mschapv2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; set 802-1x.identity YOUR-IDENTITY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; set 802-1x.password YOUR-PASSWORD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; set wifi-sec.key-mgmt wpa-eap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; save&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Connection&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Internal-CL&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; (8f1ddcc9-4b1f-4e5d-9992-522714685eb4) successfully updated.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; activate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Monitoring&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; connection activation&lt;&#x2F;span&gt;&lt;span&gt; (press&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; any key to continue&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Connection&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; successfully activated&lt;&#x2F;span&gt;&lt;span&gt; (D-Bus&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; active path: &#x2F;org&#x2F;freedesktop&#x2F;NetworkManager&#x2F;ActiveConnection&#x2F;12&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nmcli&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; quit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Obviously you will need to provide your own values for &lt;code&gt;YOUR-IDENTITY&lt;&#x2F;code&gt; and
&lt;code&gt;YOUR-PASSWORD&lt;&#x2F;code&gt; :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>`just` OCaml</title>
        <published>2025-02-07T00:00:00+00:00</published>
        <updated>2025-02-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/just-ocaml/"/>
        <id>https://mort.io/blog/just-ocaml/</id>
        
        <content type="html" xml:base="https://mort.io/blog/just-ocaml/">&lt;p&gt;In similar vein to a &lt;a href=&quot;&#x2F;blog&#x2F;just-latex&quot;&gt;recent post&lt;&#x2F;a&gt;, I have also started using
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;just.systems&#x2F;&quot;&gt;&lt;code&gt;just&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; when I periodically need to rebuild my
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ocaml.org&#x2F;&quot;&gt;OCaml&lt;&#x2F;a&gt; tool&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&quot;&gt;&lt;code&gt;ocal&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. So
I ended up replacing the old
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;6bb129627f9d1f27ab31cee810013b362ab80067&#x2F;Makefile&quot;&gt;&lt;code&gt;Makefile&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
with a shiny new
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;8ef8631ae5bbe0315e359d725d467e7d0403fd31&#x2F;Justfile&quot;&gt;&lt;code&gt;Justfile&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As it also proved useful in another (more esoteric) tool I wrote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;cst-tools&quot;&gt;for parsing
out exam results for my students so I can paste into email
easily&lt;&#x2F;a&gt;, I thought I’d put it here for the
record. So here it is…&lt;&#x2F;p&gt;
&lt;p&gt;Usual preamble of course:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    @&lt;&#x2F;span&gt;&lt;span&gt;just --list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then set some common variables:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;PWD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; env&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;PWD&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;DOCDIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;_build&#x2F;default&#x2F;_doc&#x2F;_html&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;BUILDDIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;_build&#x2F;install&#x2F;default&#x2F;bin&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then set the target — the tool name, in this case &lt;code&gt;ocal&lt;&#x2F;code&gt; (so named as this is
an OCaml re-implementation of a tool approximating the trad Unix
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Cal_(command)&quot;&gt;&lt;code&gt;cal&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; tool):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;TARGET&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;ocal&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now for the actually useful stuff: some targets. Mostly these just call out to
&lt;code&gt;dune&lt;&#x2F;code&gt; but in a way I find more intuitive.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# build targets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune build @all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# cleanup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;clean&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;clean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# uninstall targets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;uninstall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune uninstall&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# run any tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune runtest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# format sources&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;format&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune fmt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Some compound calls next.&lt;&#x2F;p&gt;
&lt;p&gt;First, before building we might need to install dependencies, so do so in the
time-honoured fashion:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install dependencies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;depends&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    opam install --yes dune-release odoc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    opam install --yes . --deps-only&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, to install I first build ready to install, then symlink the resulting
binary into the right place in my home directory:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install targets&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune build @install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ln -sf &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{PWD}}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{BUILDDIR}}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{TARGET}}&lt;&#x2F;span&gt;&lt;span&gt; ~&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;.local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;bin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To lint all the things, invoke &lt;code&gt;dune&lt;&#x2F;code&gt; twice:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# lint everything&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lint&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune build @lint&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune-release lint&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Similarly, to build the docs, build &lt;em&gt;all&lt;&#x2F;em&gt; the docs:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# build docs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;doc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune build @doc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune build @doc-private&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Try to open the docs on Linux and if that fails, on MacOS:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# open the docs for reading&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;: doc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    handlr open &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{DOCDIR}}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;index.html &lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;||&lt;&#x2F;span&gt;&lt;span&gt; open &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{DOCDIR}}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, tag and create a release; not actually done this in ages so no idea if
&lt;code&gt;dune-release&lt;&#x2F;code&gt; invocations are still a thing, let alone correct!&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# tag and create a release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;release&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune-release tag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dune-release -vv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Largely due to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt; upgrades moving tools into
different locations. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reverse `find`</title>
        <published>2025-02-05T00:00:00+00:00</published>
        <updated>2025-02-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/reverse-find/"/>
        <id>https://mort.io/blog/reverse-find/</id>
        
        <content type="html" xml:base="https://mort.io/blog/reverse-find/">&lt;p&gt;In the last few days I discovered I needed to search back up the filesystem from
&lt;code&gt;$CWD&lt;&#x2F;code&gt; to find the first occurence of a file (specifically, a &lt;code&gt;Justfile&lt;&#x2F;code&gt; but
that’s by-the-by). Got bored of doing it by hand so wrote a
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;bash&#x2F;&quot;&gt;&lt;code&gt;bash&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; shell function; here ’tis:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;rf&lt;&#x2F;span&gt;&lt;span&gt; () {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; D&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;  while !&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; eza&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;               # first, check `$CWD`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;realpath&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&amp;quot;)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ] &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; break&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # stop if we hit `&#x2F;` already&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;..&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;                                     # else, iterate one layer up&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;  done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Invoke as (e.g.,) &lt;code&gt;rf Justfile&lt;&#x2F;code&gt;. Alternatively, as a one-liner:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;F&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;Justfile&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; while !&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; eza&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -l&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:=&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$F&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;realpath $D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$F&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$F&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ] &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$D&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;..&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; done&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; unset&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; D&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>PhD viva, UK style</title>
        <published>2025-01-31T00:00:00+00:00</published>
        <updated>2025-01-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/phd-viva/"/>
        <id>https://mort.io/blog/phd-viva/</id>
        
        <content type="html" xml:base="https://mort.io/blog/phd-viva/">&lt;p&gt;Having recently, happily, had several PhD students completing in short order,
I’ve been approaching external PhD examiners. Occasionally I find myself asking
someone who’s not done any &#x2F; many in the UK previously. As our system – as all
such systems! – is a bit different to those in other parts of the world, I’ve
written a few notes on a couple of occasions about what to expect. So I figured
I might as well publish them.&lt;&#x2F;p&gt;
&lt;p&gt;What follows is my impression &#x2F; understanding based on experience here in the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cst.cam.ac.uk&#x2F;&quot;&gt;Department of Computer Science &amp;amp; Technology&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cam.ac.uk&#x2F;&quot;&gt;Cambridge University&lt;&#x2F;a&gt; ca. 2025. Your Mileage May Vary
anywhen and anywhere else, including anywhere else in the UK – check local
regulations to be sure.&lt;&#x2F;p&gt;
&lt;p&gt;In terms of process, the system here is that candidates submit their complete
dissertation and then undergo a “viva voce” (oral examination). It would be
usual for the viva to take place within 2—3 months of submission. It’s better
(IMO, much better) if it can happen in person but we may still be able to
arrange to do it online in extremis.&lt;&#x2F;p&gt;
&lt;p&gt;There are two examiners:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;em&gt;internal examiner&lt;&#x2F;em&gt; (typically connected to the Department) who ensures
the process is followed properly but may not be a deep expert in the specific
topic, and&lt;&#x2F;li&gt;
&lt;li&gt;The &lt;em&gt;external examiner&lt;&#x2F;em&gt; (from outside the University) who is there as the
subject matter expert.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The viva consists of the two examiners asking the candidate questions about
their dissertation until they’re satisfied; typically this takes at least 2h and
can go longer, though more than 3.5—4h is unusual in my experience.&lt;&#x2F;p&gt;
&lt;p&gt;The examiners are each expected to read the dissertation in detail before the
viva and each write a short (typically 1—2pp) independent report giving their
opinion, outlining any concerns they will have and the resulting
topics&#x2F;questions they will be exploring in the viva, and indicating what their a
priori judgement is in terms of recommendation (roughly: pass&#x2F;pass with
corrections&#x2F;revise &amp;amp; resubmit&#x2F;no Ph.D. but you can have a Masters&#x2F;fail).&lt;&#x2F;p&gt;
&lt;p&gt;The examiners will then typically meet ~30min or so before the viva to discuss
their independent reports and decide on the approach to take in the viva. After
the viva they write a joint report (usually shorter than their independent
reports; perhaps 0.5pp) outlining what happened in the viva, as well as making a
final recommendation and providing (if appropriate) a list of corrections that
must be satisfied for the candidate to pass.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, the University pays a (risibly small) honorarium to the external
examiner for doing the viva plus reasonable expenses.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Fontsizing in LaTeX</title>
        <published>2025-01-24T00:00:00+00:00</published>
        <updated>2025-01-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/fontsizing/"/>
        <id>https://mort.io/blog/fontsizing/</id>
        
        <content type="html" xml:base="https://mort.io/blog/fontsizing/">&lt;p&gt;I recently had colleagues hit an issue that I have hit myself in the past, and
so I finally decided to figure out a fix.&lt;&#x2F;p&gt;
&lt;p&gt;Specifically, when building EPSRC research proposals in LaTeX, getting a
complaint that the font size is non compliant – it should be 11pt Arial, but
the standard LaTeX options generate something slightly smaller, with Adobe
Acrobat and Microsoft tools both reporting a size of 10.45pt or so.&lt;&#x2F;p&gt;
&lt;p&gt;One proposed solution was the to add the following in the preamble:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;latex&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;anyfontsize&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\AtBeginDocument&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\fontsize&lt;&#x2F;span&gt;&lt;span&gt;{11bp}{13.35bp}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\selectfont&lt;&#x2F;span&gt;&lt;span&gt;} &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…but that did not work unfortunately.&lt;&#x2F;p&gt;
&lt;p&gt;After some poking about and staring at output and searching the interwebs, it
appears that this was triggered, at least for me, by the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ctan.org&#x2F;pkg&#x2F;fontspec&quot;&gt;&lt;code&gt;fontspec&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; package that was being used to sort
out fonts and unicode and so on in conjunction with
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;xetex.sourceforge.net&#x2F;&quot;&gt;XeLaTeX&lt;&#x2F;a&gt; as a backend driver.&lt;&#x2F;p&gt;
&lt;p&gt;A key piece of debug logic was to add the following text in a document:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;latex&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;The quick fox --- &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\the\fontdimen&lt;&#x2F;span&gt;&lt;span&gt;6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\font\relax&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…which ensured there was some text and then inserted the font dimesions
according to LaTeX. It did indeed produce the output &lt;code&gt;The quick fox — 9.54147pt&lt;&#x2F;code&gt; when it should’ve been &lt;code&gt;10pt&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The font runes I was using were&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;latex&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;[T1]{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;fontenc&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;lmodern&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;amssymb,amsmath&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;eurosym&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;upquote&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;microtype&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;fontspec&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;xltxtra,xunicode&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\defaultfontfeatures&lt;&#x2F;span&gt;&lt;span&gt;{Mapping=tex-text,Scale=MatchUppercase}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;\renewcommand&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\familydefault&lt;&#x2F;span&gt;&lt;span&gt;}{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\rmdefault&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\setmainfont&lt;&#x2F;span&gt;&lt;span&gt;{Arial}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\setmonofont&lt;&#x2F;span&gt;&lt;span&gt;{Hack Nerd Font}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…and it seemed to be the &lt;code&gt;Scale=MatchUppercase&lt;&#x2F;code&gt; clause that caused the
problem. Further investigation suggested that most of that was actually
copypasta legacy code that was no longer required; replacing with&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;latex&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;\usepackage&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;fontspec&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\setmainfont&lt;&#x2F;span&gt;&lt;span&gt;{Arial}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;\setmonofont&lt;&#x2F;span&gt;&lt;span&gt;{Hack Nerd Font}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…gave the output &lt;code&gt;The quick fox — 10.0pt&lt;&#x2F;code&gt; in Arial as expected. Which was
nice.&lt;&#x2F;p&gt;
&lt;p&gt;I also realised in the course of doing this that &lt;code&gt;xelatex&lt;&#x2F;code&gt; is now deprecated as
a backend, so I have started using the still actively developed
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.luatex.org&#x2F;&quot;&gt;&lt;code&gt;luatex&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; backend driver instead by passing
&lt;code&gt;-lualatex&lt;&#x2F;code&gt; to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mgeier.github.io&#x2F;latexmk.html&quot;&gt;&lt;code&gt;latexmk&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and that has
worked fine so far&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>`just` LaTeX it!</title>
        <published>2025-01-18T00:00:00+00:00</published>
        <updated>2025-01-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/just-latex/"/>
        <id>https://mort.io/blog/just-latex/</id>
        
        <content type="html" xml:base="https://mort.io/blog/just-latex/">&lt;p&gt;I have recently become a fan of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;just.systems&#x2F;&quot;&gt;&lt;code&gt;just&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as a replacement for the venerable
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;make&#x2F;manual&#x2F;make.html&quot;&gt;&lt;code&gt;make&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. I find that nowadays I rarely need the built-in dependency rules
that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;make&#x2F;manual&#x2F;make.html&quot;&gt;&lt;code&gt;make&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; provides. Perhaps more radically, I also rarely need to write my
own as the prevelance of format-specific build tools such as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;cargo&#x2F;&quot;&gt;&lt;code&gt;cargo&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.astral.sh&#x2F;uv&#x2F;&quot;&gt;&lt;code&gt;uv&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ctan.org&#x2F;pkg&#x2F;latexmk&#x2F;&quot;&gt;&lt;code&gt;latexmk&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and the like mean I don’t need to write my own either.&lt;&#x2F;p&gt;
&lt;p&gt;Recently, while writing references and then helping out get submissions for
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;events&#x2F;rossfest&#x2F;&quot;&gt;Rossfest&lt;&#x2F;a&gt; consistently formatted and building cleanly, I found myself
extending my various &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;just.systems&#x2F;&quot;&gt;&lt;code&gt;just&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; targets for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.latex-project.org&#x2F;&quot;&gt;LaTeX&lt;&#x2F;a&gt;. So I thought I’d document
them here.&lt;&#x2F;p&gt;
&lt;p&gt;I always begin my &lt;code&gt;Justfile&lt;&#x2F;code&gt; with the apparently idiomatic “just show me the
targets and associated help text” target:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    @&lt;&#x2F;span&gt;&lt;span&gt;just --list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This seems considerably easier – and more powerful – than the equivalent hack
I used to use in a &lt;code&gt;Makefile&lt;&#x2F;code&gt;!&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;make&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.DEFAULT&lt;&#x2F;span&gt;&lt;span&gt;: help&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.PHONY&lt;&#x2F;span&gt;&lt;span&gt;: help&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;help&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;	@&lt;&#x2F;span&gt;&lt;span&gt;echo &amp;quot;Targets are:&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;	@&lt;&#x2F;span&gt;&lt;span&gt;grep -E &amp;#39;^(^## |[^.#][ a-zA-Z0-9-]+:.*#)&amp;#39; Makefile &lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	| sed -E &amp;#39;s&#x2F;:[[:print:]]+#&#x2F;:&#x2F;;s&#x2F;^([^#])&#x2F;-- \1&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next setup up some useful variables: the command we’ll use (&lt;code&gt;latex&lt;&#x2F;code&gt;) plus
sources (&lt;code&gt;texs&lt;&#x2F;code&gt;) and targets (&lt;code&gt;pdfs&lt;&#x2F;code&gt;), and droppings that might be produced but
not cleaned up by &lt;code&gt;latexmk -[cC]&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;latex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;latexmk -pdf&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;texs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span&gt; [0-9][0-9]-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;.tex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;pdfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; replace&lt;&#x2F;span&gt;&lt;span&gt;(texs, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;.tex&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;.pdf&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;droppings&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;$f.nav $f.snm $f.bbl&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now to actually building and cleaning things; first, individual targets:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# build a PDF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;pdf&lt;&#x2F;span&gt;&lt;span&gt; tgt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    {{latex}} {{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;file_stem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;(tgt)}}&lt;&#x2F;span&gt;&lt;span&gt;.tex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# clean generated files&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;clean&lt;&#x2F;span&gt;&lt;span&gt; tgt:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    {{latex}}&lt;&#x2F;span&gt;&lt;span&gt; -C &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;file_stem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;(tgt)}}&lt;&#x2F;span&gt;&lt;span&gt;.tex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    for f in &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;file_stem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;(tgt)}}&lt;&#x2F;span&gt;&lt;span&gt;; do rm -f &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{droppings}}&lt;&#x2F;span&gt;&lt;span&gt; ; done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(Yes, ok, so it seems a bit silly to have to wrap a &lt;code&gt;for&lt;&#x2F;code&gt; loop around simply to
propagate a variable from the &lt;code&gt;Justfile&lt;&#x2F;code&gt; into the shell. But no matter.)&lt;&#x2F;p&gt;
&lt;p&gt;Next, all available targets:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# build all PDFs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;pdfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    for f in &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{texs}}&lt;&#x2F;span&gt;&lt;span&gt;; do just pdf $f ; done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# clean all PDFs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;clean&lt;&#x2F;span&gt;&lt;span&gt;-pdfs:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    for f in &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{pdfs}}&lt;&#x2F;span&gt;&lt;span&gt;; do just &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;clean&lt;&#x2F;span&gt;&lt;span&gt; $f ; done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, &lt;em&gt;watch&lt;&#x2F;em&gt; a target, rebuilding on save – it may be helpful therefore to
avoid automatically saving the source while in a state in which it will not
successfully build!&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;Just&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# watch a file, rebuilding when saved&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;watch&lt;&#x2F;span&gt;&lt;span&gt; tgt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    while inotifywait -e close_write &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{tgt}}&lt;&#x2F;span&gt;&lt;span&gt;* ; do just pdf &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;{{tgt}}&lt;&#x2F;span&gt;&lt;span&gt; ; done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing `bibtox`</title>
        <published>2025-01-03T00:00:00+00:00</published>
        <updated>2025-01-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/bibtox/"/>
        <id>https://mort.io/blog/bibtox/</id>
        
        <content type="html" xml:base="https://mort.io/blog/bibtox/">&lt;p&gt;After some time using various tools and scripts to format and sort my files of
BibTeX&#x2F;BibLaTeX entries, I finally gave up back in March and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&quot;&gt;wrote one myself
– &lt;code&gt;bibtox&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. This replaced some very nasty
combination of server-side &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&#x2F;blob&#x2F;83eda34bc9e79bd5251b1ae9623b5e905532c599&#x2F;bib2json.py&quot;&gt;Python&lt;&#x2F;a&gt; and in-page &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&#x2F;blob&#x2F;83eda34bc9e79bd5251b1ae9623b5e905532c599&#x2F;papers.coffee&quot;&gt;CoffeeScript&lt;&#x2F;a&gt;, plus a
third-party tool &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;backtracking&#x2F;bibtex2html&quot;&gt;&lt;code&gt;bib2bib&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; I
would run on an ad hoc basis.&lt;&#x2F;p&gt;
&lt;p&gt;Per the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&#x2F;blob&#x2F;main&#x2F;README.md&quot;&gt;README&lt;&#x2F;a&gt;, this
processes either a stream of entries on &lt;code&gt;stdin&lt;&#x2F;code&gt; or a set of files arranged into
sections specified by a simple configuration file. It outputs sorted or
unsorted, either as canonicalised entries or marked up HTML.&lt;&#x2F;p&gt;
&lt;p&gt;And it means that, hopefully, finally, my list of publications on this site is
consistently formatted and sorted. Completeness is, of course, a process rather
than a state so achieving that is left for other times and places.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&#x2F;issues&quot;&gt;Issues&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bibtox&#x2F;pulls&quot;&gt;pull
requests&lt;&#x2F;a&gt; welcome!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Retreat from TUM</title>
        <published>2024-12-18T00:00:00+00:00</published>
        <updated>2024-12-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/tum-retreat/"/>
        <id>https://mort.io/blog/tum-retreat/</id>
        
        <content type="html" xml:base="https://mort.io/blog/tum-retreat/">&lt;p&gt;Ok, ok, I exaggerate – it’s not really that far. But any time I have to set the
alarm for 02.30, it feels like it’s a long long way away!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ce.cit.tum.de&#x2F;cm&#x2F;research-group&#x2F;&quot;&gt;TU Munchen&lt;&#x2F;a&gt; host an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ce.cit.tum.de&#x2F;cm&#x2F;events&#x2F;mir3&#x2F;&quot;&gt;annual
retreat&lt;&#x2F;a&gt;, and thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ce.cit.tum.de&#x2F;cm&#x2F;research-group&#x2F;joerg-ott&#x2F;&quot;&gt;Prof. Joerg
Ott&lt;&#x2F;a&gt; I was invited this
year for the first time. It’s held in TUM’s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.raitenhaslach.tum.de&#x2F;en&#x2F;raitenhaslach&#x2F;home&#x2F;&quot;&gt;Retreat Centre at
Raitenhaslach&lt;&#x2F;a&gt;,
originally a Cistercian monastery which is a lovely location except that it’s a
bus ride from the hotel used and a bus and three trains from the nearest airport
– which is, mildly confusingly,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.salzburg-airport.com&#x2F;en&#x2F;&quot;&gt;Salzburg&lt;&#x2F;a&gt; not
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.munich-airport.com&#x2F;&quot;&gt;Munich&lt;&#x2F;a&gt;. The latter point made me assume that
there would be good directions via public transport from Salzburg, but that
turned out not to be the case. And as Google Maps is, at best, patchy in terms
of public transport coverage in this part of the world – it doesn’t know about
all the buses at least – I thought it might be useful to record the process of
getting there from Cambridge.&lt;&#x2F;p&gt;
 &lt;a href=&quot;https:&#x2F;&#x2F;www.ce.cit.tum.de&#x2F;cm&#x2F;events&#x2F;mir3&#x2F;mir3-2024-10&#x2F;&quot;&gt;&lt;img src=&quot;photo.jpg&quot; class=&quot;fl pd1&quot; alt=&quot;A photograph of the presenter in next to a slide in an ornately
    decorated room&quot; width=&quot;480&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;p&gt;First, to fly to Salzburg or Munich? In the end I picked Salzburg as it was
closer to the retreat centre itself and meant I didn’t need to fly via Heathrow
or Gatwick. As I had to be in Cambridge the night before for family reasons,
picking a closer airport for my very early flight seemed sensible. Unfortunately
this means flying Wizzair UK from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.london-luton.co.uk&#x2F;&quot;&gt;London Luton
Airport&lt;&#x2F;a&gt;, which after just twice flying from
there remains my least favourite UK airport. Given the flight departed at 05.55,
a £77.50 taxi from Cambridge was the only option.&lt;&#x2F;p&gt;
&lt;p&gt;Per Panther’s recommmendation I allowed 70 minutes for the journey, and on my
own recommendation I aimed to arrive ~1.5h before the flight resulting in a taxi
booking for 03.15. Happily when I get in the taxi the driver said it would be
around 45-50 minutes, which was nice. Less happily when I checked in the day
before – using a laptop as neither Safari nor Firefox on iOS was able to
display the boarding pass – I got an automatic email from Wizzair telling me
that I needed to arrive at the airport by 02.15 as the airport was upgrading
their “central search facilities”. After trying to call the airport half a dozen
times but getting trapped in the IVR menus at the inevitable “read the FAQ on
the website” end state, I gave up trying to check if that really was necessary
and decided to risk my original timings.&lt;&#x2F;p&gt;
&lt;p&gt;I did however spot one useful thing: “prebooked security check”. This appears to
be the ability to book, at 15 minute granularity, a security check during peak
hours (03.00-04.30). Given my estimated arrival time of 04.15, that seemed
perfect.
 &lt;img src=&quot;road.jpg&quot; class=&quot;fr pd1&quot; alt=&quot;A photograph of a road being worked&quot; width=&quot;240&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;

As it was also &lt;strong&gt;completely free&lt;&#x2F;strong&gt; requiring nothing more than my
flight number and an email address (not even the one associated with my ticket),
I booked it resulting in an email with a QR code to show to security. This
worked perfectly when I arrived at the airport: show the person on security the
QR code on the phone screen, and they simply jump you past the security queue to
the front. Did I mention this was completely free? Seems a strange system to me
but hey, I’ll take it!&lt;&#x2F;p&gt;
&lt;p&gt;In the end, the public transport worked though there was a short walk at the end
that was longer than I expected – rebuilding a road meant I could get through
but the bus couldn’t! And then the retreat happened – but you can &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ce.cit.tum.de&#x2F;cm&#x2F;events&#x2F;mir3&#x2F;mir3-2024-10&#x2F;&quot;&gt;read about
that elsewhere&lt;&#x2F;a&gt; :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Workshopping, across the universe</title>
        <published>2024-10-02T00:00:00+00:00</published>
        <updated>2024-10-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/workshopping-edgeless/"/>
        <id>https://mort.io/blog/workshopping-edgeless/</id>
        
        <content type="html" xml:base="https://mort.io/blog/workshopping-edgeless/">&lt;p&gt;One of the pleasures of being an academic is to travel to nice places to meet
interesting people, and interesting places to meet nice people. In one of my
first such trips for a few years I recently went to Sweden to participate in the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloudresearch.org&#x2F;workshops&#x2F;17th&#x2F;&quot;&gt;17th Cloud Control Workshop&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
 &lt;a href=&quot;https:&#x2F;&#x2F;cloudresearch.org&#x2F;workshops&#x2F;17th&#x2F;&quot;&gt;&lt;img src=&quot;photo.jpg&quot; class=&quot;fr&quot; alt=&quot;A photograph of the presenter in front of a slide&quot; width=&quot;480&quot; height=&quot;1&quot; loading=&quot;lazy&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;p&gt;I’d previously attended the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloudresearch.org&#x2F;workshops&#x2F;15th&#x2F;&quot;&gt;15th Cloud Control
Workshop&lt;&#x2F;a&gt; shortly before the pandemic
happened, causing the series to pause briefly. This was the reboot, and as
before, it was a great deal of fun: good company, good food, beautiful location.
If you get the chance to go, take it if you can!&lt;&#x2F;p&gt;
&lt;p&gt;The workshop is a really nice mix of keynote presentations – not too many and
not too long at 20 minutes (mostly) – and discussion sessions proposed
beforehand or on site by participants. I gave one of the keynotes, talking about
the challenges posed and opportunities offered by edge computing. Can share
slides on request, or when I decide on a good way to publish them!&lt;&#x2F;p&gt;
&lt;p&gt;I also enjoyed many good discussions and conversations, topped off with a great
BBQ, but two topics stand out. First, a great discussion session organised by
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;anakli.inf.ethz.ch&#x2F;&quot;&gt;Prof. Ana Klimović&lt;&#x2F;a&gt; about serverless computing
which immediately triggered some thoughts about possible followup publications
from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;edgeless-project.eu&#x2F;&quot;&gt;EDGELESS&lt;&#x2F;a&gt;, and collaboration possibilities.&lt;&#x2F;p&gt;
&lt;p&gt;Second, several conversations on a topic I know little about, low-earth orbit
(LEO) satellite networking, and what could be done with it.&lt;&#x2F;p&gt;
&lt;p&gt;For what it’s worth, my thought was whether a LEO constellation plus a little
edge compute could provide a difficult-to-disrupt out-of-band monitoring network
for critical infrastructure like datacenters and power grids: although data
bandwidth is limited and a bit complicated due to the constraints on ground
stations, they have pretty decent cameras, so why not use those to capture and
locally process images of the roofs of large rectangular buildings like
datacenters and the like which could continually display various status data.&lt;&#x2F;p&gt;
&lt;p&gt;Such status information would only need to be locally generated, so it would
take fairly substantial physical disruption of the facility (also presumably
noticeable by camera) to prevent that working. Alternatively, the constellation
(perhaps shared across multiple facilities in different jurisdictions) would
need to be substantially disrupted to prevent it being able to monitor targets.&lt;&#x2F;p&gt;
&lt;p&gt;It was a fun discussion anyway, combining a network technology I knew little
about with possibly interesting applications of edge computing to resiliency.&lt;&#x2F;p&gt;
&lt;p&gt;Postcript: in case you’re curious, the title is a passing reference to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Star_Trekkin%27&quot;&gt;Star
Trekkin’&lt;&#x2F;a&gt;, a fine popular music
single from my youth. Which has a much longer back-story on Wikipedia than I had
anticipated.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Part II Projects</title>
        <published>2024-09-20T00:00:00+00:00</published>
        <updated>2024-09-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/part-ii-projects/"/>
        <id>https://mort.io/blog/part-ii-projects/</id>
        
        <content type="html" xml:base="https://mort.io/blog/part-ii-projects/">&lt;p&gt;Undergraduate final-year (“Part II”) project supervision goes in fits and
starts. After a couple of years of having almost no interest, this year I’ve had
several enquiries and it seems I might end supervising 3–4 projects. So
herewith a record of the things I’ve found myself repeating!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-structure&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#project-structure&quot; aria-label=&quot;Anchor link for: project-structure&quot;&gt;Project structure&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The key thing for the structure of the project is to make sure that there is a
core piece that is (essentially) guaranteed to be deliverable. This is the piece
that you know you can do, and once done and written up, you know you can get an
adequate (if not great) mark. Ensuring this takes the risk out of the project.&lt;&#x2F;p&gt;
&lt;p&gt;On top of this core piece, it’s then usually sensible to build “a few” (2? 3?
4?) extensions which will make the project spicy if done well. You may wish to
phrase these extensions as “for example, extensions might include…” or words
to that effect, to give some wiggle room in the final dissertation. Getting
these done successfully is what should put you in line for a very good mark
rather than a simply adequate mark.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-framing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#project-framing&quot; aria-label=&quot;Anchor link for: project-framing&quot;&gt;Project framing&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;It is also very helpful, particularly if you are aiming for a high mark, to try
to frame the project in terms of &lt;strong&gt;a research question you will answer&lt;&#x2F;strong&gt; rather
than &lt;strong&gt;an artefact you will build&lt;&#x2F;strong&gt;. Often in systems the appropriate way to
answer the research questions we pose will be to build an artefact – but by
framing it in terms of the question you seek to answer, it makes it easier to
write the dissertation as a piece of research rather than a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Small_matter_of_programming&quot;&gt;small matter of
programming&lt;&#x2F;a&gt;.
Empirically, this seems to have an outsize effect on the chances of the
examiners thinking the project difficult and marking accordingly.&lt;&#x2F;p&gt;
&lt;p&gt;It can also be useful to try to be explicit about where your project requires
you to go beyond the CST taught material, particularly from Part IA&#x2F;IB.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-proposal&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#project-proposal&quot; aria-label=&quot;Anchor link for: project-proposal&quot;&gt;Project proposal&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To my mind there are two critical pieces of the proposal around which everything
else sits.&lt;&#x2F;p&gt;
&lt;p&gt;First, the &lt;strong&gt;evaluation plan&lt;&#x2F;strong&gt;: if you can write this well, then you understand
what you’re going to build, and what it means to have done it well (or badly).
Writing the evaluation plan therefore usually means you have, for the most part,
got the rest of the project figured out.&lt;&#x2F;p&gt;
&lt;p&gt;Second, the &lt;strong&gt;workplan&lt;&#x2F;strong&gt;: this divides time until submission into two week
(never larger, sometimes smaller) chunks, each of which has attached a &lt;em&gt;calendar
date&lt;&#x2F;em&gt; (so there’s no confusion over weeks in term or suchlike) and a
&lt;em&gt;milestone&lt;&#x2F;em&gt;&#x2F;&lt;em&gt;deliverable&lt;&#x2F;em&gt; (so that we can immediately tell whether you’ve
completed, or at least are making progress against, that chunk of work in our
weekly meeting). Don’t forget to take account of any relevant module assessment
deadlines in your plan!&lt;&#x2F;p&gt;
&lt;p&gt;Note that it’s a plan not a contract! You don’t lose marks because you deviate
from the plan– but if you can’t tell whether you’re ahead or behind, you might
well find yourself in a sticky position at the end of Lent term or start of
Easter term when you find you’ve got module assessments to complete, revision to
start, two weeks to go until dissertation submission and still four weeks of
work to do on your project…&lt;&#x2F;p&gt;
&lt;h2 id=&quot;supervision-process&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#supervision-process&quot; aria-label=&quot;Anchor link for: supervision-process&quot;&gt;Supervision process&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I normally supervise projects by scheduling weekly half-hour meetings with each
student. Longer meetings can be arranged on an ad hoc basis as required. The key
purpose of the meeting is to check progress against the workplan, and to make
sure that any difficulties and roadblocks are aired and dealt with (whether in
the meeting or by scheduling a longer discussion).&lt;&#x2F;p&gt;
&lt;p&gt;For an example of a reasonable target timeline, consider trying to get
implementation completed by the end of Christmas vacation, evaluation completed
by the division of Lent Term, and the dissertation completed by the end of Lent
Term. That then gives you flexibility as to whether you do more project work,
extensions etc., or focus on exam revision, or whatever.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Hopefully that’s helpful. At the very least, I can now point potential project
students at it, so it’s helpful for me :) Some of the above may also be relevant
writing research proposals (Part III &#x2F; MPhil projects, even Ph.D.s) but that’s a
topic for another day.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Post-COVID19 TPC experience</title>
        <published>2024-09-09T00:00:00+00:00</published>
        <updated>2024-09-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/post-covid-tpc/"/>
        <id>https://mort.io/blog/post-covid-tpc/</id>
        
        <content type="html" xml:base="https://mort.io/blog/post-covid-tpc/">&lt;p&gt;I do not participate in a huge number of TPCs (Technical Programme Committees)
as a general rule– partly time constraints but mostly no-one knows who I am so
I don’t often get asked… (!)&lt;&#x2F;p&gt;
&lt;p&gt;I have done a few though, some big (e.g., &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.usenix.org&#x2F;conference&#x2F;nsdi15&quot;&gt;USENIX NSDI&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;conferences.sigcomm.org&#x2F;imc&#x2F;2018&#x2F;&quot;&gt;ACM IMC&lt;&#x2F;a&gt;),
some small (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uksystems.org&#x2F;&quot;&gt;UK Systems&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;link.springer.com&#x2F;conference&#x2F;pam&quot;&gt;PAM&lt;&#x2F;a&gt;), and perhaps because I only do
a couple every few years, while doing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;conferences2.sigcomm.org&#x2F;co-next&#x2F;&quot;&gt;ACM
CoNEXT&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;acm-ieee-sec.org&#x2F;list&#x2F;&quot;&gt;ACM&#x2F;IEEE
SEC&lt;&#x2F;a&gt; this week, I found myself particularly
noticing some changes in practice since that last TPCs I recall (notably
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.usenix.org&#x2F;conference&#x2F;nsdi15&quot;&gt;NSDI&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;conferences.sigcomm.org&#x2F;imc&#x2F;2018&#x2F;&quot;&gt;IMC&lt;&#x2F;a&gt;). So here are three observations.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1-online-first-and-only&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#1-online-first-and-only&quot; aria-label=&quot;Anchor link for: 1-online-first-and-only&quot;&gt;1. Online, first and only&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The biggest obvious change is that TPC meetings are now online rather than
in-person. This has one big disadvantage for me: I really enjoyed travelling to
the meeting to meet colleagues and (usually) participate in some TPC-oriented
workshop with presentations of recent an in-progress work. In many ways, I found
this sort of activity more interesting than the conference itself (sorry!). It
also has the unfortunate effect that, at least for international TPCs, timezones
make scheduling tricky – one benefit of travelling was that at least the
meeting took place in localtime for (almost) everyone.&lt;&#x2F;p&gt;
&lt;p&gt;However, it also has clear benefits: the CO2 footprint of the event is
dramatically reduced which can only be a good thing. The financial cost
reduction probably also opens up the experience to attendees who would never
previously have been able to make it. I’ve rarely seen really poor meeting
behaviour on the TPCs I’ve been involved in, but I also find that in an online
meeting, chairing tends to be more easily more rigorous and the sometimes
dominating effect of a single confident (perhaps I might say over-confident, or
even just loud) individual is significantly reduced. Which is good.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-offline-dominance&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#2-offline-dominance&quot; aria-label=&quot;Anchor link for: 2-offline-dominance&quot;&gt;2. Offline dominance&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I now see &lt;strong&gt;dramatically&lt;&#x2F;strong&gt; more use being made of commenting and discussions in
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;read.seas.harvard.edu&#x2F;~kohler&#x2F;hotcrp&#x2F;&quot;&gt;HotCRP&lt;&#x2F;a&gt;, which remains the only
conference management and paper reviewing platform I will willingly use (thanks
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Eddie_Kohler&quot;&gt;Eddie&lt;&#x2F;a&gt;!). I don’t know whether this
is a post-pandemic effect, or just the fact that the old old guard has largely
shuffled out of active TPC duties and we now have a new old guard (ie., people
of my era) and younger who are perhaps happier to communicate and express views
without needing to be in the same room.&lt;&#x2F;p&gt;
&lt;p&gt;I think this is another dramatic improvement in process, and puts us in a
similar place to how, for example, we handled marking final year undergraduate
projects at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nottingham.ac.uk&#x2F;&quot;&gt;Nottingham University&lt;&#x2F;a&gt;. It means
that discussion is recorded, and usually more coherently and explicitly argued
due to the need to write it down.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-reduction-in-extremism&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#3-reduction-in-extremism&quot; aria-label=&quot;Anchor link for: 3-reduction-in-extremism&quot;&gt;3. Reduction in extremism&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The one arguably slightly negative comment I would have is – and this is only
my anecdotal impression, and not something I can pretend to have data on – that
I think I see a tendency for reviewers to perhaps be a little less clear in
their scoring. Once the across the board strong rejects (a fair number) and
strong accepts (a much smaller number) were taken out, I saw an awful lot of
weak reject (but happy to consider weak accept after discussion) and weak accept
(but happy to consider weak reject after discussion). This made it quite hard
for me, as another reviewer, sometimes to get a clear signal as to what the
other reviews were recommending.&lt;&#x2F;p&gt;
&lt;p&gt;This is a challenge I sometimes see in admissions interviewing: less experienced
interviewers are sometimes  reluctant to give a clear signal, exhibiting instead
a tendency to score near or perhaps just above the middle of the scale. (I
remember doing this myself.) This feels more comfortable – putting one’s head
above the parapet by taking a clear stance often feels more socially awkward
than giving a “fine, ok, pretty good, sure” response, not least because it needs
stronger supporting argument – but in the end I think it misses the point of
being an interviewer &#x2F; a TPC member which is exactly to accept or reject papers
based on having been recognised for your expertise.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;So in the end, two good points, two potential (but minor) negatives, and one
completely unjustifiable and purely selfish negative. Which on the whole is a
good thing. Though having come back to this after a break for a couple of years,
I find I am even more sceptical of the whole process than I was. More later
perhaps, once I get my thoughts in order.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Stop, Start</title>
        <published>2024-08-30T00:00:00+00:00</published>
        <updated>2024-08-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/stop-start/"/>
        <id>https://mort.io/blog/stop-start/</id>
        
        <content type="html" xml:base="https://mort.io/blog/stop-start/">&lt;p&gt;Well, here we go again, again. Having stalled out back in 2013 to restart in
2015, I stalled out again in 2017, so am finally restarting seven years later.
Again. I do have a dozen or more half-written posts from that period that may
leak out slowly, in &lt;a href=&quot;&#x2F;tags&#x2F;old&quot;&gt;backdated form&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The stack for the blog has been updated again, naturally – the tools got better
after all. So now this is using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt; with, initially,
the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jieiku&#x2F;abridge&#x2F;&quot;&gt;abridge theme&lt;&#x2F;a&gt;. I think it’s shinier,
and hopefully also involves (almost) no JavaScript, is finally accessible, and
not too heavyweight. In removing the excessive JavaScript, I also updated my
&lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;stop-start&#x2F;.&#x2F;research#publications&quot;&gt;publication list&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;bib2html&quot;&gt;generation
process&lt;&#x2F;a&gt;: no more CoffeeScript and JavaScript,
just some plain ol’ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.python.org&#x2F;&quot;&gt;Python&lt;&#x2F;a&gt; using the slick new
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;astral-sh&#x2F;uv&quot;&gt;uv&lt;&#x2F;a&gt; tooling. The
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;casey&#x2F;just&quot;&gt;Justfile&lt;&#x2F;a&gt; incantation is something like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;make&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;papers&lt;&#x2F;span&gt;&lt;span&gt; := &amp;quot;..&#x2F;templates&#x2F;shortcodes&#x2F;publications.html&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;bibinputs&lt;&#x2F;span&gt;&lt;span&gt; := &amp;quot;..&#x2F;papers&#x2F;bibinputs.json&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# build papers data for site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;@papers&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  cd bib2html &amp;amp;&amp;amp; uv sync &amp;amp;&amp;amp; uv run -- .&#x2F;src&#x2F;bib2html {{bibinputs}} &amp;gt;| {{papers}}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I’ve also added a &lt;a href=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;stop-start&#x2F;.&#x2F;register&#x2F;&quot;&gt;register of interests&lt;&#x2F;a&gt; so I stop having to
scrabble around remembering what I’m officially doing when I’m occasionally
asked.&lt;&#x2F;p&gt;
&lt;p&gt;The stack underneath has also changed. I finally kicked the Mac OS habit after
over 10 years – decided I’d had enough of Apple hiding things and generally
getting in my way – at the same time I switched from Android to iPhone. Never
do things the easy way, that’s my motto. So now I’m back on a PC … but it
turns out that 2024 (well, 2023 in fact) is the year of Linux on the Laptop for
me. Not something I thought would actually happen when we joked about it in the
late 90s. Truly, times change. And not just any old wannabe-Windows distribution
but the resolutely idiosyncratic and copiously yet poorly documented
&lt;a href=&quot;httsp:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt; using Flakes and Home-Manager of course, with
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wayland.freedesktop.org&#x2F;&quot;&gt;Wayland&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;swaywm.org&#x2F;&quot;&gt;Sway&lt;&#x2F;a&gt;.
I’ve even finally made the leap to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vscodium.com&#x2F;&quot;&gt;Codium&lt;&#x2F;a&gt;, the
de-Microsofted version of VSCode, from
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;emacs&#x2F;&quot;&gt;Emacs&lt;&#x2F;a&gt; (mostly –
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;orgmode.org&#x2F;&quot;&gt;org-mode&lt;&#x2F;a&gt; has not yet been replaced). I blame
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jeffas.net&#x2F;&quot;&gt;Andrew&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jentek.dev&#x2F;&quot;&gt;Chris&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For the terminally curious, this meant a fairly heavy reworking of my 30 years
old &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;&quot;&gt;dotfiles&lt;&#x2F;a&gt; – still work in progress but
adequately organised for now I think. See the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;tree&#x2F;main&#x2F;nixos&quot;&gt;NixOS specific
bits&lt;&#x2F;a&gt; if curious.&lt;&#x2F;p&gt;
&lt;p&gt;And, because I’m going to try to include at least one vaguely technical bit (or
at least, one bit which isn’t just me bemoaning that I haven’t written anything
in years), I confess to being particularly pleased with the following fragment
to enable &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;blob&#x2F;main&#x2F;nixos&#x2F;modules&#x2F;home-manager&#x2F;sway.nix#L64-L122&quot;&gt;my Sway startup
script&lt;&#x2F;a&gt;
to start several apps on particular workspaces, by switching to the workspace,
starting the app, and then waiting for a suitable window to appear. The latter
step entails&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;subscribing &lt;code&gt;swaymsg&lt;&#x2F;code&gt; to &lt;code&gt;window&lt;&#x2F;code&gt; messages with
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jqlang.github.io&#x2F;jq&#x2F;&quot;&gt;jq&lt;&#x2F;a&gt; to extract the messages of interest
indicating a new window in the background,&lt;&#x2F;li&gt;
&lt;li&gt;executing the command to start the app,&lt;&#x2F;li&gt;
&lt;li&gt;using &lt;code&gt;grep&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;pkill&lt;&#x2F;code&gt; in tandem to kill the subscription when the new window is
detected,  and finally&lt;&#x2F;li&gt;
&lt;li&gt;waiting for the subscription to have been killed.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It seems fairly (indeed, surprisingly) reliable.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;wait_for&lt;&#x2F;span&gt;&lt;span&gt; () {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; swaymsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -r -m -t&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; subscribe &amp;#39;[&amp;quot;window&amp;quot;]&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    jq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -c --unbuffered&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;. | select(.change == &amp;quot;new&amp;quot;)&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -m1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; pkill&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; swaymsg&lt;&#x2F;span&gt;&lt;span&gt; ;} &amp;amp;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; 2&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  pid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  swaymsg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;exec &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sleep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 0.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  wait $pid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; 2&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Use via something like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;wayland&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;windowManager&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;sway&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;startup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;  let&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; cmds:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;swaymsg &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;builtins&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;concatStringsSep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; cmds&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    workspace&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ws: msg [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;workspace --no-auto-back-and-forth &lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;ws&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    after&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; delay: cmds:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;sleep &lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt; delay&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;msg cmds&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    startup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; pkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;writeShellScriptBin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;startup.sh&amp;quot; &amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      wait_for () {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        { swaymsg -r -m -t subscribe &amp;#39;[&amp;quot;window&amp;quot;]&amp;#39; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          jq -c --unbuffered &amp;#39;. | select(.change == &amp;quot;new&amp;quot;)&amp;#39; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;          { grep -m1 . &amp;gt;&#x2F;dev&#x2F;null ; pkill swaymsg ;} &amp;amp;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        } 2&amp;gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        pid=$!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        swaymsg -- &amp;quot;exec $*&amp;quot; &amp;amp;&amp;amp; sleep 0.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        wait $pid 2&amp;gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;      ${&lt;&#x2F;span&gt;&lt;span&gt;workspace&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;mediaws&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      wait_for &amp;quot;rhythmbox&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    &amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;  in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [ {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt; command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span&gt;startup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;bin&#x2F;startup.sh&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;; } ]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Discovering `restic`</title>
        <published>2024-08-26T00:00:00+00:00</published>
        <updated>2024-08-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/restic-discovery/"/>
        <id>https://mort.io/blog/restic-discovery/</id>
        
        <content type="html" xml:base="https://mort.io/blog/restic-discovery/">&lt;p&gt;I recently had cause to try to recover some files from my
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;restic.net&#x2F;&quot;&gt;&lt;code&gt;restic&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; backups. These go back for over a year now, and
I could not remember at which point I’d mistakenly nuked the directory I now
wanted to recover. &lt;code&gt;restic find&lt;&#x2F;code&gt; purports to be able to do this by searching
through snapshots but I found that it’s quite slow, and can only search within a
time range which is not that helpful when you don’t know the time range you
need.&lt;&#x2F;p&gt;
&lt;p&gt;So I did it by hand, which turned out to be rather faster.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; RESTIC_PASSWORD_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;your&#x2F;backup&#x2F;password&#x2F;file&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; RESTIC_REPOSITORY&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;your&#x2F;backup&#x2F;repository&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;    # list snapshots, filtering by DATE regex, grabbing just the snapshot hash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -E&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; restic snapshots&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -c \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; DATE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; cut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -b1-8 \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    | while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; read&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ss&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;=== &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$ss&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -E&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; restic ls&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $ss&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;DIRECTORY&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; done&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt; done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The key thing with the above approach is that it’s also quite amenable to
bisection, which makes it a lot faster.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Debugging Electron apps</title>
        <published>2024-08-14T00:00:00+00:00</published>
        <updated>2024-08-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/electron-cli/"/>
        <id>https://mort.io/blog/electron-cli/</id>
        
        <content type="html" xml:base="https://mort.io/blog/electron-cli/">&lt;p&gt;Another short one, this time the magic flags to get debug output and access to
webdev tools under Electron apps such as Slack and whatnot on Wayland:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;APPLICATION&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --enable-logging --devtools \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  --platform=wayland --enable-features=UseOzonePlatform --password-store=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;gnome_libsecret&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reinstalling `maestral`</title>
        <published>2024-06-28T00:00:00+00:00</published>
        <updated>2024-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/reinstall-maestral/"/>
        <id>https://mort.io/blog/reinstall-maestral/</id>
        
        <content type="html" xml:base="https://mort.io/blog/reinstall-maestral/">&lt;p&gt;A short one this; just a crib of commands to redo &lt;code&gt;maestral&lt;&#x2F;code&gt; (unofficial
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dropbox.com&#x2F;&quot;&gt;Dropbox&lt;&#x2F;a&gt; client) configuration.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# remove existing configuration&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;.config&#x2F;maestral&#x2F;maestral.ini&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# appears to fail with `&#x2F;usr&#x2F;bin&#x2F;env &amp;#39;bash&amp;#39;: No such file or directory`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;maestral&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; autostart&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; systemctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; daemon-reload&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# ...so instead, just remmeber to do the following on restart&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;maestral&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; stop&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; maestral&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; start&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# if desired, add autocompletion for `maestral` in bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[[ $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;which&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; maestral&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; 2&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span&gt;) ]] &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;lt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;maestral&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; completion bash)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>NixOS channels</title>
        <published>2023-12-13T00:00:00+00:00</published>
        <updated>2023-12-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/nixos-channels/"/>
        <id>https://mort.io/blog/nixos-channels/</id>
        
        <content type="html" xml:base="https://mort.io/blog/nixos-channels/">&lt;p&gt;I don’t pretend to understand &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt; configuration fully
yet, what with Flakes and channels and so forth. But I did find the following
usful to setup channels consistently so that I could have a single config that
used both.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --list&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # to list known channels&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --remove&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nixos&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # to remove a channel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;nixos.org&#x2F;channels&#x2F;nixos-unstable nixos&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # to go bleeding edge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…ultimately resulting in:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --list&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # channels are stored per-user, and $(whoami) != root&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo nix-channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nixos&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;nixos.org&#x2F;channels&#x2F;nixos-unstable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nixpkgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;nixos.org&#x2F;channels&#x2F;nixos-unstable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Upgrading to the latest release is then something like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pushd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;rc-files&#x2F;nixos&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-channel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; flake update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nixos-rebuild switch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --upgrade-all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;popd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…and finally, garbage collecting old versions once you’re satisfied the new
one works:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-collect-garbage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nix-collect-garbage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; nix-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --gc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;nix-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --gc&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And yes, some of the incantations above might be a little cargo-cultish and not
strictly necessary. But at various points they’ve seemed necessary to me, and
now they’re in my shell history, they’re what I got.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OneDrive and NixOS</title>
        <published>2023-08-22T00:00:00+00:00</published>
        <updated>2023-08-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/nixos-onedrive/"/>
        <id>https://mort.io/blog/nixos-onedrive/</id>
        
        <content type="html" xml:base="https://mort.io/blog/nixos-onedrive/">&lt;p&gt;Starting by reading instructions at:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;abraunegg&#x2F;onedrive&#x2F;blob&#x2F;master&#x2F;docs&#x2F;sharepoint-libraries.md&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;abraunegg&#x2F;onedrive&#x2F;blob&#x2F;master&#x2F;docs&#x2F;sharepoint-libraries.md&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;abraunegg&#x2F;onedrive&#x2F;blob&#x2F;master&#x2F;docs&#x2F;business-shared-items.md&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;abraunegg&#x2F;onedrive&#x2F;blob&#x2F;master&#x2F;docs&#x2F;business-shared-items.md&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;pull&#x2F;77734#issuecomment-575874225&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;pull&#x2F;77734#issuecomment-575874225&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;FWIW I also use that package on a NixOS system (via a Nix package that can presumably be installed on other systems if you add nix as a  package manager), &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;blob&#x2F;master&#x2F;nixos&#x2F;modules&#x2F;services&#x2F;networking&#x2F;onedrive.nix&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;NixOS&#x2F;nixpkgs&#x2F;blob&#x2F;master&#x2F;nixos&#x2F;modules&#x2F;services&#x2F;networking&#x2F;onedrive.nix&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I have successfully used it with the University and my startup’s tenancies (both personal OneDrive and enterprise Sharepoint sites) simultaneously – this was fairly simple in the end but I recall it took a while to do the token dance to get the necessary tokens, and then to get all the runes right. In short it was something like:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Follow the instructions Robert pointed to sort out access to the various accounts, refresh tokens, and the like.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Create file &lt;code&gt;~&#x2F;.config&#x2F;onedrive-launcher&lt;&#x2F;code&gt; comprising each subdirectory of &lt;code&gt;~&#x2F;.config&lt;&#x2F;code&gt; that is a onedrive configuration directory corresponding to each account – I named these after the accounts in question so mine contained&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;onedrive-rmm1002@cam.ac.uk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;onedrive-mort@ikva.ai&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sharepoint-mort@ikva.ai-iKVALimited&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(I now prefix the last two lines with &lt;code&gt;# &lt;&#x2F;code&gt; to comment them out as I don’t need those synced any more.)&lt;&#x2F;p&gt;
&lt;p&gt;The systemd service &lt;code&gt;onedrive-launcher.service&lt;&#x2F;code&gt; then uses the file to kick off a systemd &lt;code&gt;onedrive@...&lt;&#x2F;code&gt; service for each entry.&lt;&#x2F;p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Edit the &lt;code&gt;~&#x2F;.config&#x2F;ACCOUNT&#x2F;config&lt;&#x2F;code&gt; files appropriately; the only changes I made were to&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# for my University account&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sync_dir = &amp;quot;~&#x2F;OneDrive&#x2F;rmm1002@cam.ac.uk&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# for my startup personal OneDrive&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sync_dir = &amp;quot;~&#x2F;OneDrive&#x2F;mort@ikva.ai&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sync_business_shared_folders = &amp;quot;true&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;﻿&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# for startup Sharepoint sites&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sync_dir = &amp;quot;~&#x2F;OneDrive&#x2F;mort@ikva.ai-iKVA_Limited&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;drive_id = &amp;quot;...&amp;quot; # rune found per instructions Robert pointed to I think&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>WSL2 &#x2F; Windows 11</title>
        <published>2023-03-13T00:00:00+00:00</published>
        <updated>2023-03-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/windows-wsl2/"/>
        <id>https://mort.io/blog/windows-wsl2/</id>
        
        <content type="html" xml:base="https://mort.io/blog/windows-wsl2/">&lt;p&gt;I naively thought I could just use WSL2 on Windows on my new laptop. But it
turned out this was the year of Linux on the Laptop for me. For posterity
here’s the crib sheet though.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;wsl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --set-default-version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt update&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt upgrade&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -yy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt install locales&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; locale-gen en_GB.UTF-8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -yy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; emacs-gtk direnv gedit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; clone .&#x2F;..rc-files&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&#x2F;scripts&#x2F;install.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Some Windows native packages using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chocolatey.org&#x2F;&quot;&gt;Chocolatey&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;choco&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install signal skype wire slack zoom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;choco&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;choco&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install rustup.install rust-analyzer python&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;choco&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;choco&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install powertyos dropbox googledrive wiztree&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, &lt;code&gt;choco install texlive&lt;&#x2F;code&gt; didn’t work so well, so I fell back to WSL2:
&lt;code&gt;sudo apt install latexmk texlive-latex-base texlive-xetex ttf-mscorefonts-installer&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Use MS Powertoys to remap keyboard for &lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt;, &lt;code&gt;€&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Timesync is a bit broken, cf &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;a&#x2F;72318510&quot;&gt;https:&#x2F;&#x2F;stackoverflow.com&#x2F;a&#x2F;72318510&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately it all went pear-shaped when I tried to &lt;code&gt;rsync&lt;&#x2F;code&gt; files across from
MacOS into Windows&#x2F;WSL2.&lt;&#x2F;p&gt;
&lt;p&gt;I mapped the network drive via Network and Sharing Center &amp;gt; Settings &amp;gt; Network &amp;amp;
internet &amp;gt; Advanced network settings &amp;gt; Advanced sharing settings &amp;gt; Public
networks &amp;gt; Network discovery = ON&lt;&#x2F;p&gt;
&lt;p&gt;…and then&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; admin christs docs rc-files research src teaching me&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;=== &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  rsync&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -uavzsP --log-file=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;.$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -Iseconds) -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ssh mort@IPADDRESS:&#x2F;Users&#x2F;mort&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F; .&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…but found that moving files to the host mashed things a bit (&lt;code&gt;rw&lt;&#x2F;code&gt; bits
carried, but &lt;code&gt;x&lt;&#x2F;code&gt; not; hidden files not; no content translation; owner carried)
while moving host files to wsl was sort-of ok (owner carried, rw bits carried)
except that &lt;code&gt;group&lt;&#x2F;code&gt; and &lt;code&gt;other&lt;&#x2F;code&gt; access bits are all set to whatever the &lt;code&gt;user&lt;&#x2F;code&gt;
access bits were.&lt;&#x2F;p&gt;
&lt;p&gt;See
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;41513597&#x2F;how-do-i-access-the-wsl-linux-file-system-from-windows&quot;&gt;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;41513597&#x2F;how-do-i-access-the-wsl-linux-file-system-from-windows&lt;&#x2F;a&gt;
for more, perhaps.&lt;&#x2F;p&gt;
&lt;p&gt;Getting Docker installed was also rather painful:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# remove old distribution dockers&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt remove docker.io containerd runc&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt autoremove&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install dependencies to use an alternative package repo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get update&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get install ca-certificates curl gnupg lsb-release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install the new package repo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -m&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 0755&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;apt&#x2F;keyrings&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -fsSL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;download.docker.com&#x2F;linux&#x2F;ubuntu&#x2F;gpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --dearmor -o&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;apt&#x2F;keyrings&#x2F;docker.gpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;   &amp;quot;deb [arch=$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dpkg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --print-architecture&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;) signed-by=&#x2F;etc&#x2F;apt&#x2F;keyrings&#x2F;docker.gpg] https:&#x2F;&#x2F;download.docker.com&#x2F;linux&#x2F;ubuntu $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lsb_release&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -cs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;) stable&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; tee &#x2F;etc&#x2F;apt&#x2F;sources.list.d&#x2F;docker.list&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install up-to-date Docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get update&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  docker-ce&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  docker-ce-cli&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  containerd.io&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  docker-buildx-plugin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  docker-compose-plugin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, some further references that may or may not be useful:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stephenreescarter.net&#x2F;how-to-shrink-a-wsl2-virtual-disk&#x2F;&quot;&gt;https:&#x2F;&#x2F;stephenreescarter.net&#x2F;how-to-shrink-a-wsl2-virtual-disk&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;pulse&#x2F;acceso-wsl2-desde-windows-con-samba-manuel-nicol%C3%A1s-ortu%C3%B1o&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.linkedin.com&#x2F;pulse&#x2F;acceso-wsl2-desde-windows-con-samba-manuel-nicol%C3%A1s-ortu%C3%B1o&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.howtogeek.com&#x2F;193013&#x2F;how-to-create-an-encrypted-container-file-with-bitlocker-on-windows&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.howtogeek.com&#x2F;193013&#x2F;how-to-create-an-encrypted-container-file-with-bitlocker-on-windows&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OCaml operators</title>
        <published>2023-02-26T00:00:00+00:00</published>
        <updated>2023-02-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/ocaml-operators/"/>
        <id>https://mort.io/blog/ocaml-operators/</id>
        
        <content type="html" xml:base="https://mort.io/blog/ocaml-operators/">&lt;p&gt;An &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.brendanlong.com&#x2F;ocaml-operator-cheatsheet.html&quot;&gt;OCaml operator
cheatsheet&lt;&#x2F;a&gt; for
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ocaml.org&#x2F;&quot;&gt;OCaml&lt;&#x2F;a&gt; operators that I have found useful.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Software folklore</title>
        <published>2023-02-26T00:00:00+00:00</published>
        <updated>2023-02-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/software-folklore/"/>
        <id>https://mort.io/blog/software-folklore/</id>
        
        <content type="html" xml:base="https://mort.io/blog/software-folklore/">&lt;p&gt;Truly cursed bugs that have become &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;beza1e1.tuxen.de&#x2F;lore&#x2F;&quot;&gt;software
folklore&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hosting HotCRP</title>
        <published>2021-10-17T00:00:00+00:00</published>
        <updated>2021-10-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/setup-hotcrp/"/>
        <id>https://mort.io/blog/setup-hotcrp/</id>
        
        <content type="html" xml:base="https://mort.io/blog/setup-hotcrp/">&lt;p&gt;I once had cause to setup
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;read.seas.harvard.edu&#x2F;~kohler&#x2F;hotcrp&#x2F;&quot;&gt;HotCRP&lt;&#x2F;a&gt; for local hosting.
Specifically on a local Lab-hosted VM image.  Some of what follows is specific
to the CUCL VM hosting service, but I think most of it is HotCRP generic and so
may be of use. Anyway, here’s the crib sheet, starting from
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mbtech.github.io&#x2F;Setting-up-hotcrp&#x2F;&quot;&gt;https:&#x2F;&#x2F;mbtech.github.io&#x2F;Setting-up-hotcrp&#x2F;&lt;&#x2F;a&gt;…&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# setup some variables&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-DOMAIN&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;hotcrp-test.cl.cam.ac.uk&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-WORKSHOP&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;sysws18&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-PASSWORD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;mybestpassword&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-EMAIL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;postmaster@example.com&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;lab-specifics&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#lab-specifics&quot; aria-label=&quot;Anchor link for: lab-specifics&quot;&gt;Lab specifics&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Assume we start from a default Ubuntu template VM, and then…&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Configure the VM&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cl-asuser&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; passwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # set UNIX password for sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# create some space&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;usr&#x2F;src&#x2F;*&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;    export&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; K&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;uname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;s&#x2F;-generic$&#x2F;&#x2F;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $K $d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    case&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        &amp;quot;&#x2F;usr&#x2F;src&#x2F;linux-headers-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$K&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&#x2F;usr&#x2F;src&#x2F;linux-headers-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;K&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;-generic&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; keep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;        * )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; remove&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -rf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# THIS IS UNSAFE! BE CAREFUL! IT CALLS `sudo rm -rf`!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;lib&#x2F;modules&#x2F;*&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    echo $d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    case&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        &amp;quot;&#x2F;lib&#x2F;modules&#x2F;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;uname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -r&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; keep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;        * )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; remove&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;            sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -rf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# if necessary, resize the partition. this shouldn&amp;#39;t be necessary with the new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# VM image! if you need more than ~1GB space for papers, setup xvdb1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; fdisk &#x2F;dev&#x2F;xvda&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;p&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;w&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; partprobe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# resize the default filesystem to use the entire partition&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; resize2fs &#x2F;dev&#x2F;xvda1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # blank SIZE means use whole partition&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Install packages&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# sort out packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; TZ&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Europe&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;London&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt update&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --no-install-recommends -qq -yy \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    apache2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    ca-certificates&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    libapache2-mod-php&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    mailutils&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    mysql-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    php-curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    php-json&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    php-mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    poppler-utils&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    postfix&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    zip&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Configure &lt;code&gt;postfix&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# configure postfix: accept defaults if offered, setup postfix to use ppsw&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;s&#x2F;relayhost =&#x2F;relayhost = ppsw.cam.ac.uk&#x2F;&amp;#39; &#x2F;etc&#x2F;postfix&#x2F;main.cf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;init.d&#x2F;postfix reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; systemctl restart postfix.service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# test mail sending&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;Test mail from postfix&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; mail&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;Test Postfix&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-EMAIL&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For more email help, see
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;email-telephony-and-collaboration&#x2F;email&#x2F;specialist-email-advice&#x2F;sending-email&quot;&gt;https:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;email-telephony-and-collaboration&#x2F;email&#x2F;specialist-email-advice&#x2F;sending-email&lt;&#x2F;a&gt;
using &lt;code&gt;YOUR-DOMAIN&lt;&#x2F;code&gt; as mail domain, and &lt;code&gt;ppsw.cam.ac.uk&lt;&#x2F;code&gt; as relay host.&lt;&#x2F;p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Install HotCRP&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Get latest release:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; clone https:&#x2F;&#x2F;github.com&#x2F;kohler&#x2F;hotcrp.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; hotcrp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; checkout tags&#x2F;v2.101&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -b&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; v2.101&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Setup &lt;code&gt;root&lt;&#x2F;code&gt; account for MySQL&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;init.d&#x2F;mysql stop&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # stop the running service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# configure and run mysql in the console&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;var&#x2F;run&#x2F;mysqld&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chown mysql:mysql &#x2F;var&#x2F;run&#x2F;mysqld&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mysqld_safe&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --skip-grant-tables&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sleep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# smash a new `root` password in place &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mysql&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;ALTER&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; USER &amp;#39;root&amp;#39;@&amp;#39;localhost&amp;#39; IDENTIFIED WITH mysql_native_password BY &amp;#39;${YOUR-PASSWORD}&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;  &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;FLUSH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; PRIVILEGES&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# restart mysql properly as a service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mysqladmin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -uroot -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-PASSWORD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -h127.0.0.1 --protocol=tcp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; shutdown&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;init.d&#x2F;mysql start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…alternatively&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mysql&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -uroot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;USE mysql;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;UPDATE mysql.user SET authentication_string = PASSWORD(&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-PASSWORD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;WHERE User = &amp;#39;root&amp;#39; AND Host = &amp;#39;localhost&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;FLUSH PRIVILEGES;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;QUIT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;Secure your MySQL installation&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; systemctl stop mysql&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;var&#x2F;run&#x2F;mysqld&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chown mysql:mysql &#x2F;var&#x2F;run&#x2F;mysqld&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mysqld_safe&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --skip-grant-tables --skip-networking&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mysql_secure_installation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-PASSWORD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;y&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;y&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;y&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;y&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Setup the HotCRP MySQL tables and config&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lib&#x2F;createdb.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --user=root --password=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;YOUR-PASSWORD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;} &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;ok&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;YOUR-WORKSHOP&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# edit conf&#x2F;options.php&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - contactName&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - contactEmail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - sendEmail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - emailFrom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - emailSender&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - timezone&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# - upload_max_filesize [ if you care ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Turn on the HotCRP site in your Apache configuration&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# apache2: turn on hotcrp site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;cat &amp;gt;&amp;gt;&#x2F;etc&#x2F;apache2&#x2F;conf-available&#x2F;hotcrp.conf &amp;lt;&amp;lt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;lt;Directory &amp;quot;$(pwd -P)&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    Options Indexes Includes FollowSymLinks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    AllowOverride all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    Require all granted&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;lt;&#x2F;Directory&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;Alias &#x2F;YOUR-WORKSHOP $(pwd -P)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; a2enconf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;hotcrp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chgrp www-data conf&#x2F;options.php&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; service apache2 reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apache2ctl graceful&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…and you should now be able to access your hotcrp site at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;$%7BYOUR-DOMAIN%7D&#x2F;$%7BYOUR-WORKSHOP%7D&quot;&gt;http:&#x2F;&#x2F;${YOUR-DOMAIN}&#x2F;${YOUR-WORKSHOP}&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;ol start=&quot;9&quot;&gt;
&lt;li&gt;Use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;letsencrypt.org&#x2F;&quot;&gt;Let’s Encrypt&lt;&#x2F;a&gt; to create and configure
certificates for HTTPS support&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -yy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; software-properties-common&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; add-apt-repository ppa:certbot&#x2F;certbot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -yy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; certbot-auto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;dl.eff.org&#x2F;certbot-auto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; a+x .&#x2F;certbot-auto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; .&#x2F;certbot-auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -n --os-packages-only&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; .&#x2F;certbot-auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -a&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; webroot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apache&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -w&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -P&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --agree-tos --redirect --uir --hsts --staple-ocsp \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; YOUR-DOMAIN&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --email&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; YOUR-EMAIL&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; .&#x2F;certbot-auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --install-only&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!--
sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s &#x2F;snap&#x2F;bin&#x2F;certbot &#x2F;usr&#x2F;bin&#x2F;certbot

sudo certbot --apache
## follow prompts
--&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;Set permissions on the certificate directories&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chgrp www-data &#x2F;etc&#x2F;letsencrypt&#x2F;live&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chmod g+rx &#x2F;etc&#x2F;letsencrypt&#x2F;live&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chgrp www-data &#x2F;etc&#x2F;letsencrypt&#x2F;archive&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; chmod g+rx &#x2F;etc&#x2F;letsencrypt&#x2F;archive&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;End state is the Apache config looks something like the following, with
unindented lines being those I added:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cat &#x2F;etc&#x2F;apache2&#x2F;sites-available&#x2F;hotcrp.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;IfModule mod_ssl.c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;SSLStaplingCache&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; shmcb:&#x2F;var&#x2F;run&#x2F;apache2&#x2F;stapling_cache&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;128000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;	&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;VirtualHost&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; _default_:44&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;3&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;		ServerAdmin&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; webmaster@localhost&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;		DocumentRoot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;home&#x2F;hotcrp&#x2F;hotcrp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;		ErrorLog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;APACHE_LOG_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;error.log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;		CustomLog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;APACHE_LOG_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;access.log combined&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;		SSLEngine&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;SSLCACertificateFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;letsencrypt&#x2F;live&#x2F;hotcrp.sysws.org.uk&#x2F;fullchain.pem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;SSLUseStapling&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;		&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;FilesMatch&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;\.(cgi|shtml|phtml|php)$&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;				SSLOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; +StdEnvVars&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;		&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;FilesMatch&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;		&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Directory&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;usr&#x2F;lib&#x2F;cgi-bi&lt;&#x2F;span&gt;&lt;span&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;				SSLOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; +StdEnvVars&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;		&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;Directory&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;ServerName&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; hotcrp.sysws.org.uk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;SSLCertificateFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;letsencrypt&#x2F;live&#x2F;hotcrp.sysws.org.uk-0001&#x2F;fullchain.pem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;SSLCertificateKeyFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;letsencrypt&#x2F;live&#x2F;hotcrp.sysws.org.uk-0001&#x2F;privkey.pem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;letsencrypt&#x2F;options-ssl-apache.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Header&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; always set Strict-Transport-Security &amp;quot;max-age=31536000&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Header&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; always set Content-Security-Policy upgrade-insecure-requests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;	&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&#x2F;VirtualHost&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;IfModule&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;11.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; Add DNS entry for the name assigned&lt;&#x2F;span&gt;&lt;span&gt; (in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; my case, `&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;hotcrp.DOMAIN&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt;).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tarballing some files</title>
        <published>2021-08-25T00:00:00+00:00</published>
        <updated>2021-08-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/tar-includes/"/>
        <id>https://mort.io/blog/tar-includes/</id>
        
        <content type="html" xml:base="https://mort.io/blog/tar-includes/">&lt;p&gt;I recently discovered, to some irritation, that the &lt;code&gt;--include PATTERN&lt;&#x2F;code&gt; option
to &lt;code&gt;tar&lt;&#x2F;code&gt; seems only to apply to directories – and if the &lt;code&gt;PATTERN&lt;&#x2F;code&gt; doesn’t
match, it won’t traverse subdirectories. But I wanted to include &lt;code&gt;*.php&lt;&#x2F;code&gt; for
some reason. So instead pipe the output of &lt;code&gt;find&lt;&#x2F;code&gt;, or better these days,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;fd&quot;&gt;&lt;code&gt;fd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;fd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; php&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tar&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -cvjf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; TARBALL.bz2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --null --files-from&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Data visualisation links</title>
        <published>2020-09-07T00:00:00+00:00</published>
        <updated>2020-09-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/dataviz/"/>
        <id>https://mort.io/blog/dataviz/</id>
        
        <content type="html" xml:base="https://mort.io/blog/dataviz/">&lt;p&gt;Some possibly useful data visualisation links:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;medium.economist.com&#x2F;why-you-sometimes-need-to-break-the-rules-in-data-viz-4d8ece284919&quot;&gt;https:&#x2F;&#x2F;medium.economist.com&#x2F;why-you-sometimes-need-to-break-the-rules-in-data-viz-4d8ece284919&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;colororacle.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;colororacle.org&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Renovating an old media PC</title>
        <published>2020-08-28T00:00:00+00:00</published>
        <updated>2020-08-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/mediapc/"/>
        <id>https://mort.io/blog/mediapc/</id>
        
        <content type="html" xml:base="https://mort.io/blog/mediapc/">&lt;p&gt;Some notes from my first attempt to renovate an old media PC that had a SYSLINUX
install without any package management, and a crufty BIOS. Probably outdated
now, but I may go back to it one day…&lt;&#x2F;p&gt;
&lt;p&gt;First, some background links:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Cylinder-head-sector&quot;&gt;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Cylinder-head-sector&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;FAT_boot_sector&quot;&gt;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;FAT_boot_sector&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Logical_Block_Addressing#CHS_conversion&quot;&gt;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Logical_Block_Addressing#CHS_conversion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Master_Boot_Record&quot;&gt;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Master_Boot_Record&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Volume_boot_record&quot;&gt;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Volume_boot_record&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;index.php&#x2F;Syslinux&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;index.php&#x2F;Syslinux&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.syslinux.org&#x2F;wiki&#x2F;index.php?title=Common_Problems#Failed_to_load_ldlinux&quot;&gt;https:&#x2F;&#x2F;wiki.syslinux.org&#x2F;wiki&#x2F;index.php?title=Common_Problems#Failed_to_load_ldlinux&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.syslinux.org&#x2F;wiki&#x2F;index.php?title=Hardware_Compatibility#USB_related_problems&quot;&gt;https:&#x2F;&#x2F;wiki.syslinux.org&#x2F;wiki&#x2F;index.php?title=Hardware_Compatibility#USB_related_problems&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.syslinux.org&#x2F;wiki&#x2F;index.php?title=Hdt_(Hardware_Detection_Tool)&quot;&gt;https:&#x2F;&#x2F;wiki.syslinux.org&#x2F;wiki&#x2F;index.php?title=Hdt_(Hardware_Detection_Tool)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I explored two ways forward: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.syslinux.org&#x2F;&quot;&gt;SYSLINUX&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;grub&#x2F;index.html&quot;&gt;GRUB&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;syslinux&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#syslinux&quot; aria-label=&quot;Anchor link for: syslinux&quot;&gt;SYSLINUX&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I found that getting SYSLINUX working required moving the partition to 0&#x2F;1&#x2F;1 –
using sectors per track of 63 or 32, and heads per cylinder or 16 or 64 with
appropriate cylinder values simply didn’t help.&lt;&#x2F;p&gt;
&lt;p&gt;Diagnosed by observing that console displayed only CRLF but no banner –
SYSLINUX code ends up with the banner to be  displayed just falling into  the
second sector on the disk, so it can’t be read unless the geometry is correct.
Don’t ask why old fashioned whirling metal disk geometry needs to be set for a
USB stick, you’ll be sad.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;formatting-the-usb-stick&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#formatting-the-usb-stick&quot; aria-label=&quot;Anchor link for: formatting-the-usb-stick&quot;&gt;Formatting the USB stick&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Some runes, use at your own risk.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; dd if=&#x2F;dev&#x2F;zero of=&#x2F;dev&#x2F;sdd status=progress bs=1M count=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;256&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; fdisk &#x2F;dev&#x2F;sdd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;o&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;r&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;p&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;t&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;w&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkfs.fat &#x2F;dev&#x2F;sdd1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;One exciting gotcha: the &lt;code&gt;fdisk&lt;&#x2F;code&gt; utility in the  &lt;code&gt;util-linux&lt;&#x2F;code&gt; package &lt;strong&gt;didn’t
work&lt;&#x2F;strong&gt; – but the one in &lt;code&gt;busybox&lt;&#x2F;code&gt; did!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;putting-mbr-in-place&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#putting-mbr-in-place&quot; aria-label=&quot;Anchor link for: putting-mbr-in-place&quot;&gt;Putting MBR in place&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; dd bs=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;440&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; count=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; conv=notrunc if=&#x2F;usr&#x2F;share&#x2F;syslinux&#x2F;mbr.bin of=&#x2F;dev&#x2F;sdd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;obtaining-and-installing-memtest86&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#obtaining-and-installing-memtest86&quot; aria-label=&quot;Anchor link for: obtaining-and-installing-memtest86&quot;&gt;Obtaining and installing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.memtest86.com&#x2F;&quot;&gt;&lt;code&gt;memtest86&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; http:&#x2F;&#x2F;memtest.org&#x2F;download&#x2F;4.10&#x2F;memtest86+-4.10.zip&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;unzip&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; memtest86+-4.10.zip&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cp ~&#x2F;memtest86+-4.10.bin &#x2F;mnt&#x2F;boot&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;putting-locally-built-syslinux-in-place&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#putting-locally-built-syslinux-in-place&quot; aria-label=&quot;Anchor link for: putting-locally-built-syslinux-in-place&quot;&gt;Putting locally built SYSLINUX in place&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mount &#x2F;dev&#x2F;sdd1 &#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;mnt&#x2F;boot&#x2F;syslinux&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; syslinux&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --directory&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; boot&#x2F;syslinux&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;sdd1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cp &#x2F;usr&#x2F;share&#x2F;syslinux&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.c32 &#x2F;mnt&#x2F;boot&#x2F;syslinux&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;syslinux&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; bios&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cp ~&#x2F;syslinux&#x2F;bios&#x2F;com32&#x2F;hdt&#x2F;hdt.c32 &#x2F;mnt&#x2F;boot&#x2F;syslinux&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cp &#x2F;usr&#x2F;share&#x2F;hwdata&#x2F;pci.ids &#x2F;mnt&#x2F;boot&#x2F;syslinux&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -c&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;cat &amp;gt; &#x2F;mnt&#x2F;boot&#x2F;syslinux&#x2F;syslinux.cfg&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;# UI menu.c32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;PROMPT 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;DEFAULT hdt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;LABEL some_label&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  LINUX memdisk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  INITRD ..&#x2F;alpine-standard-3.12.0-x86_64.iso&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  APPEND iso-scan&#x2F;filename=..&#x2F;alpine-standard-3.12.0-x86_64.iso&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;LABEL memtest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  LINUX ..&#x2F;memtest86+-4.10.bin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;LABEL hdt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  COM32 hdt.c32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;LABEL reboot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  COM32 reboot.c32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;LABEL poweroff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  COM32 poweroff.c32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Unfortunately, getting &lt;code&gt;hdt&lt;&#x2F;code&gt; working required rebuilding as the Alpine package
version doesn’t appear to statically link against libupload.a  from SYSLINUX
tree so doesn’t work. Fixing required &lt;code&gt;make bios&lt;&#x2F;code&gt; in  the SYSLINUX tree after
installing dependencies including:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apk&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -U&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; add nasm xzlinux-headers util-linux-dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;grub&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#grub&quot; aria-label=&quot;Anchor link for: grub&quot;&gt;GRUB&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Similar behaviour: GRUB2 displayed the &lt;code&gt;GRUB &lt;&#x2F;code&gt; message and nothing else, The
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;help.ubuntu.com&#x2F;community&#x2F;Grub2&#x2F;Troubleshooting#GRUB&quot;&gt;Ubuntu wiki&lt;&#x2F;a&gt; says
this is the “can’t find MBR or euqivalent” information. In fact, it’s the same
issue: subsequent progress requires reading the second sector, but I had a
CHS&#x2F;LBA mismatch meant it wasn’t reading from the right sector and so hanging.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;to-wipe-the-stick&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#to-wipe-the-stick&quot; aria-label=&quot;Anchor link for: to-wipe-the-stick&quot;&gt;To wipe the stick&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; dd if=&#x2F;dev&#x2F;zero of=&#x2F;dev&#x2F;sdd status=progress bs=4M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;to-partition-the-stick&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#to-partition-the-stick&quot; aria-label=&quot;Anchor link for: to-partition-the-stick&quot;&gt;To partition the stick&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;In this case, to be bootable with a single &lt;code&gt;ext4&lt;&#x2F;code&gt; partition&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; parted &#x2F;dev&#x2F;sdd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mklabel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; msdos&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;unit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkpart&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; primary ext2 2048s 100%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; boot on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lba off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…or alternatively, possibly&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; fdisk &#x2F;dev&#x2F;sdd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;o&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;p&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;to-format-the-partition-and-install-grub-and-the-master-boot-record&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#to-format-the-partition-and-install-grub-and-the-master-boot-record&quot; aria-label=&quot;Anchor link for: to-format-the-partition-and-install-grub-and-the-master-boot-record&quot;&gt;To format the partition, and install &lt;code&gt;grub&lt;&#x2F;code&gt; and the master boot record&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mkfs.ext4 &#x2F;dev&#x2F;sdd1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mount &#x2F;dev&#x2F;sdd1 &#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; grub-install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --recheck --boot-directory=&#x2F;mnt&#x2F;boot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;sdd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At this point, booting off the stick will bring htpc to &lt;code&gt;GRUB &lt;&#x2F;code&gt; error stage,
indicating GRUB has loaded but doesn’t know anything about how to continue.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;install-memtest&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#install-memtest&quot; aria-label=&quot;Anchor link for: install-memtest&quot;&gt;Install memtest&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cp memtest86+.bin &#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;mnt&#x2F;boot&#x2F;grub&#x2F;grub.cfg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;set timeout=10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;set default=0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;menuentry &amp;quot;Memtest 86+&amp;quot; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; linux16 &#x2F;memtest86+.bin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;install-alpine-iso-for-booting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#install-alpine-iso-for-booting&quot; aria-label=&quot;Anchor link for: install-alpine-iso-for-booting&quot;&gt;Install Alpine ISO for booting&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Add the following stanza to GRUB config, above:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;insmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; loopback&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;menuentry&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;alpine&amp;quot; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; isofile=&#x2F;boot&#x2F;alpine-standard-3.12.0-x86_64.iso&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  loopback&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; loop&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $isofile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  linux&lt;&#x2F;span&gt;&lt;span&gt; (loop)&#x2F;boot&#x2F;vmlinuz-lts iso-scan&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;filename&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$isofile modules&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;loop,squashfs,sd-mod,usb-storage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; modloop&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;boot&#x2F;modloop-lts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  initrd&lt;&#x2F;span&gt;&lt;span&gt; (loop)&#x2F;boot&#x2F;initramfs-lts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;miscellaneous-cribs&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#miscellaneous-cribs&quot; aria-label=&quot;Anchor link for: miscellaneous-cribs&quot;&gt;Miscellaneous cribs&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I did of course forget that the&lt;&#x2F;p&gt;
&lt;p&gt;Bluetooth keyboard requires a dongle to be plugged in which is stored inside the
battery compartment. Doh. Making a note so I don’t forget again.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;adding-internal-hard-disk&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#adding-internal-hard-disk&quot; aria-label=&quot;Anchor link for: adding-internal-hard-disk&quot;&gt;Adding internal hard-disk&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Required partitioning and formatting:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;find where disk is mounted: &lt;code&gt;sudo lshw -C disk -short&lt;&#x2F;code&gt;
assume new disk is &lt;code&gt;&#x2F;dev&#x2F;sdX&lt;&#x2F;code&gt;, flash disk is &lt;code&gt;&#x2F;dev&#x2F;sdF&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;partition disk: &lt;code&gt;sudo parted &#x2F;dev&#x2F;sdX mkpart primary ext4 1 -1&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;format disk: &lt;code&gt;sudo mkfs.ext4 -m0 &#x2F;dev&#x2F;sdX1&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;label disk: &lt;code&gt;sudo e2label &#x2F;dev&#x2F;sdX1 Harddisk&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;remount flash disk rw: &lt;code&gt;mount -o remount,rw &#x2F;dev&#x2F;sdF&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;edit &lt;code&gt;&#x2F;boot&#x2F;extlinux.conf&lt;&#x2F;code&gt; so APPEND line reads:
&lt;code&gt;APPEND boot=LABEL=System disk=LABEL=Harddisk quiet&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I screwed up the first time by not correctly labelling the disk so had to make
an Ubuntu rescue USB stick. Couldn’t get this to work using MacOS, though didn’t
try putting GRUB on via MacOS.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;download ISO: &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;ubuntu-rescue-remix.org&#x2F;&quot;&gt;http:&#x2F;&#x2F;ubuntu-rescue-remix.org&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;boot &lt;code&gt;ubuntu-rescue-remix-12-04.iso&lt;&#x2F;code&gt; via virtualbox&lt;&#x2F;li&gt;
&lt;li&gt;mount USB stick on &lt;code&gt;&#x2F;dev&#x2F;sdX&lt;&#x2F;code&gt; at &lt;code&gt;&#x2F;mnt&lt;&#x2F;code&gt;: &lt;code&gt;mount &#x2F;dev&#x2F;sdX &#x2F;mnt&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;format the stick: &lt;code&gt;mkfs.vfat -n multiboot &#x2F;dev&#x2F;sdX1&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;cd &#x2F;mnt &amp;amp;&amp;amp; mkdir boot iso&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;grub-install --force --no-floppy --boot-directory=&#x2F;mnt&#x2F;boot &#x2F;dev&#x2F;sdX&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;create ISO from mounted cd:
&lt;code&gt;dd if=&#x2F;dev&#x2F;cdrom of=&#x2F;mnt&#x2F;iso&#x2F;ubuntu-rescue-remix-12-04.iso&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;create &lt;code&gt;&#x2F;boot&#x2F;grub&#x2F;grub.cfg&lt;&#x2F;code&gt; with&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;menuentry&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;Ubuntu Rescue Remix ISO &amp;#39; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; isofile=&amp;quot;&#x2F;iso&#x2F;ubuntu-rescue-remix-12-04.iso&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  loopback&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; loop&lt;&#x2F;span&gt;&lt;span&gt; (hd0,N)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$isofile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  linux&lt;&#x2F;span&gt;&lt;span&gt; (loop)&#x2F;casper&#x2F;vmlinuz&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; boot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;casper&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; iso-scan&#x2F;filename&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$isofile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; noprompt noeject&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  initrd&lt;&#x2F;span&gt;&lt;span&gt; (loop)&#x2F;casper&#x2F;initrd.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;where &lt;code&gt;N&lt;&#x2F;code&gt; is partition number, typically 1.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, for backup purposes, addons are stored in
&lt;code&gt;&#x2F;storage&#x2F;.xbmc&#x2F;addons&#x2F;packages&lt;&#x2F;code&gt;, and the following Alpine packages were useful
to install for some of the above, diagnostics, etc:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apk add busybox-static apk-tools-static&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; vi &#x2F;etc&#x2F;apk&#x2F;repositories&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apk.static update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apk.static upgrade&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --no-self-upgrade --available&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apk add lshw lshw-doc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lshw&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -C&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; storage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -short -numeric&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apk add lsblk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lsblk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Discord discord</title>
        <published>2020-08-01T00:00:00+00:00</published>
        <updated>2020-08-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/discord/"/>
        <id>https://mort.io/blog/discord/</id>
        
        <content type="html" xml:base="https://mort.io/blog/discord/">&lt;p&gt;So for some reason I wanted to do this – use Discord on an iPad without
installing the app. This proved surprisingly tricky as Safari on the iPad
&lt;em&gt;really&lt;&#x2F;em&gt; wanted to make you use the app and certainly wouldn’t display the
desktop site.&lt;&#x2F;p&gt;
&lt;p&gt;However, Firefox Focus can though it still forced you into the app from the link
in the invite email.&lt;&#x2F;p&gt;
&lt;p&gt;However, you can go to the website to signup and then manually invite yourself
via a real desktop browser. And this then means that Firefox Focus on the iPad
believes in the new account and just lets you in.&lt;&#x2F;p&gt;
&lt;p&gt;Seems something of a palaver but hey, these twisted webs we weave.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up a Macbook</title>
        <published>2020-01-01T00:00:00+00:00</published>
        <updated>2020-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/setup-new-laptop/"/>
        <id>https://mort.io/blog/setup-new-laptop/</id>
        
        <content type="html" xml:base="https://mort.io/blog/setup-new-laptop/">&lt;p&gt;This is the set of things that I roughly did to set up my old new Macbook:
configurations, packages, etc. Not guaranteed complete, but hopefully captures
much of it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;keyboard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#keyboard&quot; aria-label=&quot;Anchor link for: keyboard&quot;&gt;Keyboard&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Set the touchbar to expanded&lt;&#x2F;li&gt;
&lt;li&gt;Turn off various emacs conflicts (e.g., &lt;code&gt;S-M-6&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;karabiner-elements.pqrs.org&#x2F;&quot;&gt;Karabiner Elements&lt;&#x2F;a&gt; to make
&lt;code&gt;CAPSLOCK&lt;&#x2F;code&gt; become &lt;code&gt;ESC&lt;&#x2F;code&gt; on a single press&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;homebrew-packages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#homebrew-packages&quot; aria-label=&quot;Anchor link for: homebrew-packages&quot;&gt;Homebrew packages&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brew.sh&#x2F;&quot;&gt;Homebrew&lt;&#x2F;a&gt; and then&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                    \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  aspcud&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  aspell&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  bash-completion&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                               \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  coreutils&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                     \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  direnv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  evernote&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ffmpeg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  font-hack-nerd-font&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                           \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  gawk&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                          \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  gcc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                           \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  get_iplayer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                   \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ghostscript&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                   \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                           \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  git-lfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  gnupg2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  gnuplot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  gpg-agent&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                     \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  graphviz&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  imagemagick&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                   \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  jq&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                            \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  lua&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                           \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  mu&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                            \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ncftp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  nmap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                          \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ocaml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  offlineimap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                   \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  omnigraffle&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                   \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                          \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  python&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  python@2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  qemu&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                          \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  rcs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                           \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  readline&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  rsync&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  socat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  sshfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  telnet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  tmux&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                          \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  unrar&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  wget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# install casks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; tap homebrew&#x2F;cask-versions&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; cask install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                               \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  adium&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  disk-inventory-x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                              \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  dropbox&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  emacs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  evernote&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  font-hack-nerd-font&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                           \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  get-iplayer-automator&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  google-backup-and-sync&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  google-drive-file-stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  gpodder&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  inkscape&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  iterm2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  karabiner-elements&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                            \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  keepingyouawake&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                               \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  keybase&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  mactex&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  mp3tag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  musicbrainz-picard&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                            \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  omnigraffle6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                  \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  onedrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  osxfuse&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  sharepod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                      \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  signal&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                        \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  slack&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;                                         \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  vlc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lfs install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --system&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # enable `git-lfs` system-wide&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mu&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; index&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --rebuild&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # rebuild `mu` index&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; init&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # initialise `opam`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;podcasts&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#podcasts&quot; aria-label=&quot;Anchor link for: podcasts&quot;&gt;Podcasts&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Extract  RSS feeds from iTunes:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; Location Library.xml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sed&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;s&#x2F;[[:space:]]&#x2F;&#x2F;g&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sort&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -iv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;\.\(mp[34]\|m4[av]\)&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; http&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; cut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -b&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 28-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  cut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&amp;lt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; PODCAST.URLS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;ocal&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ocal&quot; aria-label=&quot;Anchor link for: ocal&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&quot;&gt;OCal&lt;&#x2F;a&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ocal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Falsehoods</title>
        <published>2019-01-11T00:00:00+00:00</published>
        <updated>2019-01-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/falsehoods/"/>
        <id>https://mort.io/blog/falsehoods/</id>
        
        <content type="html" xml:base="https://mort.io/blog/falsehoods/">&lt;p&gt;Being a list of some cool “Falsehoods programmers believe about …” sites, now
redundant thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kdeldycke&#x2F;awesome-falsehood&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;kdeldycke&#x2F;awesome-falsehood&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;infiniteundo.com&#x2F;post&#x2F;25326999628&#x2F;falsehoods-programmers-believe-about-time&quot;&gt;…time&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;infiniteundo.com&#x2F;post&#x2F;25509354022&#x2F;more-falsehoods-programmers-believe-about-time&quot;&gt;…time, more&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.kalzumeus.com&#x2F;2010&#x2F;06&#x2F;17&#x2F;falsehoods-programmers-believe-about-names&#x2F;&quot;&gt;…names&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mjt.me.uk&#x2F;posts&#x2F;falsehoods-programmers-believe-about-addresses&#x2F;&quot;&gt;…addresses&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;wiesmann.codiferes.net&#x2F;wordpress&#x2F;?p=15187&amp;amp;lang=en&quot;&gt;…geography&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Wipeout</title>
        <published>2018-12-17T00:00:00+00:00</published>
        <updated>2018-12-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/wipeout/"/>
        <id>https://mort.io/blog/wipeout/</id>
        
        <content type="html" xml:base="https://mort.io/blog/wipeout/">&lt;p&gt;I recently decided to go through some old PCs and hard disks (yes, actual
spinning bits of metal) and recycle or simply junk them. I figured I should wipe
them properly first, and given that they had been installed with a range of OSs,
setup a bootable USB stick so that I could boot and wipe in one easy motion.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Download &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpinelinux.org&#x2F;downloads&#x2F;&quot;&gt;Alpine Linux&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dl-cdn.alpinelinux.org&#x2F;alpine&#x2F;v3.8&#x2F;releases&#x2F;x86_64&#x2F;alpine-extended-3.8.1-x86_64.iso&quot;&gt;3.8.1
ISO&lt;&#x2F;a&gt;
– I had only &lt;code&gt;x86_64&lt;&#x2F;code&gt; machines, YMMV obviously&lt;&#x2F;li&gt;
&lt;li&gt;Write this to a USB stick using &lt;code&gt;dd&lt;&#x2F;code&gt; (on Linux), or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;etcher.balena.io&#x2F;&quot;&gt;Balena
Etcher&lt;&#x2F;a&gt; on Windows&lt;&#x2F;li&gt;
&lt;li&gt;Insert the stick and boot the machine after making any necessary BIOS changes&lt;&#x2F;li&gt;
&lt;li&gt;If the machine has been unbooted for too long or (as one of mine) has a flat
CMOS clock battery so cannot retain time across reboots, set the time
&lt;ul&gt;
&lt;li&gt;manually: &lt;code&gt;date --set=&quot;20181217&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;automatically: &lt;code&gt;setup-alpine&lt;&#x2F;code&gt; to start configuring things, then &lt;code&gt;CTRL-C&lt;&#x2F;code&gt;
after network setup, and execute &lt;code&gt;setup-ntp&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Then &lt;code&gt;setup-alpine; apk add coreutils&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Finally, &lt;code&gt;shred --verbose &#x2F;dev&#x2F;sdXN&lt;&#x2F;code&gt; where &lt;code&gt;X&lt;&#x2F;code&gt; is the device id and &lt;code&gt;N&lt;&#x2F;code&gt; the
partition number (eg., &lt;code&gt;&#x2F;dev&#x2F;sda2&lt;&#x2F;code&gt;), or &lt;code&gt;shred --verbose -n1 &#x2F;dev&#x2F;sdXN&lt;&#x2F;code&gt; if
you’re using a modern disk (apparently) and only want one pass of random data&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;installing-alpine&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-alpine&quot; aria-label=&quot;Anchor link for: installing-alpine&quot;&gt;Installing Alpine&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;After installing Alpine as above:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;adduser mort&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;create &lt;code&gt;~mort&#x2F;.ssh&#x2F;authorized_keys&lt;&#x2F;code&gt; containing you preferred public key, and
set permissions (&lt;code&gt;chmod 600 ~mort&#x2F;.ssh&#x2F;authorized_keys&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;apk add sudo&lt;&#x2F;code&gt; and then &lt;code&gt;visudo&lt;&#x2F;code&gt; to allow members of group &lt;code&gt;sudo&lt;&#x2F;code&gt; to &lt;code&gt;sudo&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;add &lt;code&gt;mort&lt;&#x2F;code&gt; to group &lt;code&gt;sudo&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;logout and then back in&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;You can then configure storage as you see fit; it seems I once did probably
using &lt;code&gt;sudo&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;apk&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; add lvm2 git bash xfsprogs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;pvcreate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;sd[bc]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # create persistent volumes group&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;vgextend&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; vg0 &#x2F;dev&#x2F;sdb&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # assign storage devices to volume group&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;vgextend&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; vg0 &#x2F;dev&#x2F;sdc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; #&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lvcreate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lv_home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 60G vg0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # create logical volume `lv_home`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkfs.xfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;vg0&#x2F;lv_home&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # format `lv_home` using XFS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;lvcreate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lv_backup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 60G vg0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # create logical volume `lv_backup`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkfs.xfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;dev&#x2F;vg0&#x2F;lv_backup&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # format `lv_backup` using XFS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# create `&#x2F;etc&#x2F;fstab` to match the above configuration&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;dev&#x2F;vg0&#x2F;lv_home	&#x2F;home	xfs	defaults	0 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;dev&#x2F;vg0&#x2F;lv_backup	&#x2F;backup	xfs	defaults	0 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -a -v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # mount everything, verbosely&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Back to the Future</title>
        <published>2017-12-14T00:00:00+00:00</published>
        <updated>2017-12-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/back-to-the-future/"/>
        <id>https://mort.io/blog/back-to-the-future/</id>
        
        <content type="html" xml:base="https://mort.io/blog/back-to-the-future/">&lt;blockquote&gt;
&lt;p&gt;Ed: the first in a likely series, this is one of the posts I drafted but never
published during my seven years in the blogging wilderness&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I have been having persistent issues on MacOS with Time Machine backups
interacting badly with several configuration elements and other services. This
is exacerbated by my use of maildirs to backup emails, with my Gmail account
leading to a directory with some millions of files. (Yeah, ok, maybe not wise
but hey, we are where we are.)&lt;&#x2F;p&gt;
&lt;p&gt;So in the course of trying to get backups to work reliably, I found the
following commands useful to at least some degree:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mdutil -sav&lt;&#x2F;code&gt; to get info about spotlight indexing status&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sudo mdutil -Ea -i [off|on]&lt;&#x2F;code&gt; to turn off|on spotlight indexing where possible&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sudo fs_usage -w mdworker mds_stores backupd&lt;&#x2F;code&gt; obtain the current filesystem
usage for those services&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sudo fs_usage -w -e iTerm2&lt;&#x2F;code&gt; to obtain current filesystem usage for services
&lt;em&gt;excluding&lt;&#x2F;em&gt; those listed&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sudo sysctl debug.lowpri_throttle_enabled=[0|1]&lt;&#x2F;code&gt; stop|start throttling to go
faster|be nice!&lt;&#x2F;li&gt;
&lt;li&gt;to obtain the various different hostnames that MacOS seems to want to give;
note that renaming &lt;code&gt;ComputerName&lt;&#x2F;code&gt; (also possible via
&lt;code&gt;SysPrefs&amp;gt;Sharing&amp;gt;&amp;gt;name&lt;&#x2F;code&gt;) caused the Time Machine directory to be renamed
when the backup started&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ComputerName LocalHostName HostName&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  scutil&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tmutil listbackups&lt;&#x2F;code&gt; to list backups&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;tmutil listlocalsnapshotdates &#x2F;&lt;&#x2F;code&gt; to list local snapshots&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;tmutil destinationinfo&lt;&#x2F;code&gt; to list the Time Machine destination volumes&lt;&#x2F;li&gt;
&lt;li&gt;to stream Time Machine log entries live&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; stream&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --style&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; syslog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --debug --info \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  --predicate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;senderImagePath contains[cd] &amp;quot;TimeMachine&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;to show Time Machine log entries from YYYY-MM-DD&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;log&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; show&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --style&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; syslog&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --debug --info --start&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; YYYY-MM-DD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;  --predicate&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;senderImagePath contains[cd] &amp;quot;TimeMachine&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Quelle dommage</title>
        <published>2017-11-05T00:00:00+00:00</published>
        <updated>2017-11-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/quelle-dommage/"/>
        <id>https://mort.io/blog/quelle-dommage/</id>
        
        <content type="html" xml:base="https://mort.io/blog/quelle-dommage/">&lt;blockquote&gt;
&lt;p&gt;Ed: this tool is perhaps less relevant now that both
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&#x2F;&quot;&gt;Mirage&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ocaml.org&#x2F;opam&#x2F;&quot;&gt;OPAM&lt;&#x2F;a&gt; have moved
on. But perhaps it’ll be resurrected one day so here it is.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Largely because I wanted to make a feeble attempt at a French pun,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;dommage&#x2F;&quot;&gt;&lt;code&gt;dommage&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is a tool for
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt; containerising Mirage unikernels. From the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;dommage&quot;&gt;README&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dommage-dockerised-mirage&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#dommage-dockerised-mirage&quot; aria-label=&quot;Anchor link for: dommage-dockerised-mirage&quot;&gt;Dommage, Dockerised Mirage&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;dommage&lt;&#x2F;code&gt; is a shell script that wraps the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&quot;&gt;Mirage&lt;&#x2F;a&gt; CLI to make use of Docker
containers meaning that:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;you can cache the OPAM build artefacts in the container image, speeding up
local builds;&lt;&#x2F;li&gt;
&lt;li&gt;you can re-use the build container image in Travis builds by publishing it,
speeding those up considerably; and&lt;&#x2F;li&gt;
&lt;li&gt;you can easily test build &lt;code&gt;-t xen&lt;&#x2F;code&gt; targets on OSX.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I’ve tried to minimise interference with the normal operation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&quot;&gt;Mirage&lt;&#x2F;a&gt; CLI so
simply replacing &lt;code&gt;mirage&lt;&#x2F;code&gt; with &lt;code&gt;dommage&lt;&#x2F;code&gt; is supposed to work. To publish the
resulting container image, &lt;code&gt;dommage publish &amp;lt;image&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Issues, comments, suggestions and bug fixes all welcome!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;operation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#operation&quot; aria-label=&quot;Anchor link for: operation&quot;&gt;Operation&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;To start, &lt;code&gt;dommage&lt;&#x2F;code&gt; provides a few management commands to manipulate the build
container:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dommage init BASE-IMAGE&lt;&#x2F;code&gt; creates a new container, based off &lt;code&gt;BASE-IMAGE&lt;&#x2F;code&gt;
from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hub.docker.com&quot;&gt;Docker Hub&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dommage publish IMAGE&lt;&#x2F;code&gt; commits the current container and pushes it to
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hub.docker.com&quot;&gt;Docker Hub&lt;&#x2F;a&gt; as &lt;code&gt;IMAGE&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dommage destroy&lt;&#x2F;code&gt; stops and removes the current build container&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dommage run ...&lt;&#x2F;code&gt; executes a command inside the current build container&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In addition, it wraps the main &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&quot;&gt;Mirage&lt;&#x2F;a&gt; CLI commands:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dommage configure ...&lt;&#x2F;code&gt; runs &lt;code&gt;mirage configure ... &amp;amp;&amp;amp; make depends&lt;&#x2F;code&gt; inside
the build contianer&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dommage build ...&lt;&#x2F;code&gt; runs &lt;code&gt;mirage build ...&lt;&#x2F;code&gt; inside the build container&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;dommage clean ...&lt;&#x2F;code&gt; runs &lt;code&gt;mirage clean ...&lt;&#x2F;code&gt; inside the build container&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Spring Loading Karabiner in the Autumn</title>
        <published>2017-10-30T00:00:00+00:00</published>
        <updated>2017-10-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/mess-with-my-keyboard/"/>
        <id>https://mort.io/blog/mess-with-my-keyboard/</id>
        
        <content type="html" xml:base="https://mort.io/blog/mess-with-my-keyboard/">&lt;p&gt;I recently took the plunge and upgraded my OS X. Not to vN of &lt;em&gt;Sierra&lt;&#x2F;em&gt; as I’d
hoped, but to v0 &lt;em&gt;High Sierra&lt;&#x2F;em&gt;– the perils of waiting too long…&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately, this toasted&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; my carefully curated keyboard remappings as
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;osx&#x2F;karabiner&#x2F;&quot;&gt;Karabiner&lt;&#x2F;a&gt; used a kernel extension, for which everything changed. All was not
lost however, as the rewrite to support Sierra&#x2F;High Sierra was well underway. Or
so I thought until I realised that the configuration file had changed from XML
to JSON. And so my configuration journey began. (But it all ends well, so that’s
good.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;controlling-the-config&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#controlling-the-config&quot; aria-label=&quot;Anchor link for: controlling-the-config&quot;&gt;Controlling the config&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The first thing was to get the new configuration matters under control. I did
this per the documentation, symlinking the config subdirectory from my
&lt;code&gt;rc-files&lt;&#x2F;code&gt; repo:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;.config&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; karabiner&#x2F; ~&#x2F;rc-files&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;ln&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;rc-files&#x2F;karabiner&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;internal-apple-keyboard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#internal-apple-keyboard&quot; aria-label=&quot;Anchor link for: internal-apple-keyboard&quot;&gt;Internal Apple keyboard&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;In the interests of keeping all configuration in one place (but see below), I
decided to do this via a set of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-karabiner&#x2F;blob&#x2F;master&#x2F;assets&#x2F;complex_modifications&#x2F;mort-keymap.json&quot;&gt;complex modifications&lt;&#x2F;a&gt;. In summary this
meant:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;swap &lt;code&gt;(caps_lock)&lt;&#x2F;code&gt; and &lt;code&gt;(control)&lt;&#x2F;code&gt;:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;description&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;mort: caps_lock -&amp;gt; ctrl&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;manipulators&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;caps_lock&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;optional&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;any&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;left_control&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;swap &lt;code&gt;&quot;&lt;&#x2F;code&gt; (glyph &lt;code&gt;S-&#x27;&lt;&#x2F;code&gt;) with &lt;code&gt;@&lt;&#x2F;code&gt; (glyph &lt;code&gt;S-2&lt;&#x2F;code&gt;):&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;description&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;mort: S-&amp;#39; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;) &amp;lt;-&amp;gt; S-2 (@)&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;manipulators&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;quote&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;quote&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;map &lt;code&gt;(backslash)&lt;&#x2F;code&gt; (glyph &lt;code&gt;\&lt;&#x2F;code&gt;) to &lt;code&gt;#&lt;&#x2F;code&gt;, and &lt;code&gt;S-\&lt;&#x2F;code&gt; (glyph &lt;code&gt;|&lt;&#x2F;code&gt;) to &lt;code&gt;~&lt;&#x2F;code&gt;:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;description&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;mort: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; -&amp;gt; #; S-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; (|) -&amp;gt; ~&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;manipulators&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;backslash&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;3&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;option&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;backslash&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;map &lt;code&gt;(non_us_backslash)&lt;&#x2F;code&gt; (glyph &lt;code&gt;§&lt;&#x2F;code&gt;) to &lt;code&gt;`&lt;&#x2F;code&gt; and &lt;code&gt;S-(non_us_backslash)&lt;&#x2F;code&gt;
(glyph &lt;code&gt;±&lt;&#x2F;code&gt;) to &lt;code&gt;€&lt;&#x2F;code&gt;, and then patch things up so that the usual window
switching works (using &lt;code&gt;(command)-`&lt;&#x2F;code&gt;):&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;description&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;mort: § -&amp;gt; `; ± (S-§) -&amp;gt; €&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;manipulators&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_backslash&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_backslash&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;2&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;option&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_backslash&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_backslash&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;finally, map &lt;code&gt;`&lt;&#x2F;code&gt; to &lt;code&gt;\&lt;&#x2F;code&gt; and &lt;code&gt;S-`&lt;&#x2F;code&gt; to &lt;code&gt;|&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;description&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;mort: ` -&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;; S-` (~) -&amp;gt; |&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;      &amp;quot;manipulators&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;backslash&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;backslash&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;iterm2&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#iterm2&quot; aria-label=&quot;Anchor link for: iterm2&quot;&gt;iTerm2&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Unfortunately for me, iTerm2 then gets a bit confused as it wants to leave
&lt;code&gt;(command)&lt;&#x2F;code&gt; alone, only allowing mapping of &lt;code&gt;(option)&lt;&#x2F;code&gt; to &lt;code&gt;(meta)&lt;&#x2F;code&gt; (or, in fact,
&lt;code&gt;(esc+)&lt;&#x2F;code&gt;). In the past I swapped &lt;code&gt;(left_command)&lt;&#x2F;code&gt; and &lt;code&gt;(left_option)&lt;&#x2F;code&gt; to make
the usual shell (&lt;code&gt;bash&lt;&#x2F;code&gt;) CLI editing combinations (roughly, &lt;code&gt;emacs&lt;&#x2F;code&gt;) work.  That
wasn’t ideal though as I then had to fix up the window cycling commands
(&lt;code&gt;(command)-` &lt;&#x2F;code&gt; and so on). Fortunately, the fix this time seems easier: just
configure the two tricky mappings (involving generating a keypress modified with
&lt;code&gt;(option)&lt;&#x2F;code&gt;) to be interpreted by iTerm2 to just send the appropriate text
through. Again, I did this in the UI (Preferences &amp;gt; Profiles &amp;gt; Keys) but the
resulting configuration change is also straightforward:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;			&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Keyboard Map&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;			&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;				&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;0x32-0x80000&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;				&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;12&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;€&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;				&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;				&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;0x33-0x80000&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;				&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Action&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;12&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;					&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;string&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;				&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;			&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;dict&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;microsoft-digital-media-keyboard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#microsoft-digital-media-keyboard&quot; aria-label=&quot;Anchor link for: microsoft-digital-media-keyboard&quot;&gt;Microsoft Digital Media keyboard&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Examining the key codes using the Karabiner Event-Viewer, it seemed that the
first thing to do was to swap &lt;code&gt;(grave_accent_and_tilde)&lt;&#x2F;code&gt; (glyph &lt;code&gt;`&lt;&#x2F;code&gt;) and
&lt;code&gt;(non_us_backslash)&lt;&#x2F;code&gt; (slightly confusingly, glyph &lt;code&gt;\&lt;&#x2F;code&gt; on my keyboard). I started
out trying to do this as a complex modification so that all the remappings were
in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-karabiner&#x2F;blob&#x2F;master&#x2F;assets&#x2F;complex_modifications&#x2F;mort-keymap.json&quot;&gt;one file&lt;&#x2F;a&gt;, but couldn’t: I couldn’t figure out how to control the
application order of mappings in that file. However, simple modifications are
applied before complex modifications, and this &lt;em&gt;is&lt;&#x2F;em&gt; a simple modification as
it’s a direct swap, so I just used the UI and did it there. For the sake of
completeness, the resulting modification to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-karabiner&#x2F;blob&#x2F;master&#x2F;karabiner.json&quot;&gt;&lt;code&gt;karabiner.json&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;    &amp;quot;profiles&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;devices&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                    &amp;quot;disable_built_in_keyboard_if_exists&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                    &amp;quot;fn_function_keys&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                    &amp;quot;identifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                        &amp;quot;is_keyboard&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                        &amp;quot;is_pointing_device&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                        &amp;quot;product_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                        &amp;quot;vendor_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1118&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                    &amp;quot;ignore&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                    &amp;quot;simple_modifications&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                            &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                                &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                            },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                            &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                                &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_backslash&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                            &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                                &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_backslash&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                            },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                            &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;                                &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The next step was to patch up the complex modifications. Once I realised that
the event viewer was claiming that the key with glyph &lt;code&gt;#&lt;&#x2F;code&gt; was emitting
&lt;code&gt;(backslash)&lt;&#x2F;code&gt; while it was, in fact, emitting &lt;code&gt;(non_us_pound)&lt;&#x2F;code&gt;, this was fairly
straightforward:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;swap &lt;code&gt;(command)&lt;&#x2F;code&gt; (glyph &lt;code&gt;Alt&lt;&#x2F;code&gt;) and &lt;code&gt;(option)&lt;&#x2F;code&gt; (glyph &lt;code&gt;Start&lt;&#x2F;code&gt;):&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;conditions&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;device_if&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;identifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;vendor_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1118&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;quot;product_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span&gt;}]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;left_option&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;optional&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;any&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;left_command&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;conditions&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;device_if&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;identifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;vendor_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1118&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;quot;product_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span&gt;}]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;left_command&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;optional&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;any&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;left_option&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;add coverage of &lt;code&gt;(non_us_pound)&lt;&#x2F;code&gt; to the rule that remaps &lt;code&gt;\&lt;&#x2F;code&gt; to &lt;code&gt;#&lt;&#x2F;code&gt;:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;conditions&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;device_if&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;identifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;vendor_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1118&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;quot;product_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span&gt;}]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_pound&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;3&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;option&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;conditions&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;device_if&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;identifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [{&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;vendor_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1118&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;quot;product_id&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 180&lt;&#x2F;span&gt;&lt;span&gt;}]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;type&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;basic&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;from&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;non_us_pound&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;            &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;quot;mandatory&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;          &amp;quot;to&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;key_code&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;grave_accent_and_tilde&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;              &amp;quot;modifiers&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;shift&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…and that’s it. My keyboard is, once again, my castle.&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;To be honest, I suspect even the &lt;em&gt;Sierra&lt;&#x2F;em&gt; upgrade would’ve done this. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Platforms, Packaging, Progress— Addendum</title>
        <published>2017-09-01T00:00:00+00:00</published>
        <updated>2017-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/topkg-addendum/"/>
        <id>https://mort.io/blog/topkg-addendum/</id>
        
        <content type="html" xml:base="https://mort.io/blog/topkg-addendum/">&lt;p&gt;This is a short addendum to my &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;2017&#x2F;08&#x2F;28&#x2F;past-present-future&#x2F;&quot;&gt;post of a couple of days
ago&lt;&#x2F;a&gt; caused by my
carelessness in writing the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;13a9a7f5b8f2e0be4c2b55941a00a885df202cf8&#x2F;ocal.opam#L16-L22&quot;&gt;OPAM
file&lt;&#x2F;a&gt;.
Careful readers will observe the lack of any dependency on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pqwy&#x2F;notty&#x2F;&quot;&gt;notty&lt;&#x2F;a&gt;. Read on for
what happened next…&lt;&#x2F;p&gt;
&lt;p&gt;The result of this carelessness was that everything worked just fine locally,
but &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocaml&#x2F;opam-repository&#x2F;pull&#x2F;10176&quot;&gt;my PR to the OPAM package
repository&lt;&#x2F;a&gt; failed. Cue
much wailing and gnashing of teeth.&lt;&#x2F;p&gt;
&lt;p&gt;However, thanks to a moment’s assistance
from &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;erratique.ch&#x2F;contact.en&quot;&gt;Daniel Bünzli&lt;&#x2F;a&gt;, this was easy to fix:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; git checkout&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 0.2.0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;       # checkout the relevant release version tag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; topkg opam pkg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;           # create the release metadata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; e _build&#x2F;ocal.0.2.0&#x2F;opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # invoke editor so I can add the missing dep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; topkg opam submit&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;        # submit the updated OPAM metadata, updating the PR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Submitting&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; _build&#x2F;ocal.0.2.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ocal-0.2.0.tbz] http:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;releases&#x2F;download&#x2F;0.2.0&#x2F;ocal-0.2.0.tbz downloaded&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Updating&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; existing pull-request&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; #10176&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Pull-requested:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;github.com&#x2F;ocaml&#x2F;opam-repository&#x2F;pull&#x2F;10176&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For me, the main thing to note here is that the OPAM metadata in the repo at the
commit ref tagged for release doesn’t match that which OPAM uses to install the
release. But as &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;seb.mondet.org&#x2F;&quot;&gt;Sebastien Mondet&lt;&#x2F;a&gt; pointed out to me,
this is neither relevant nor (in the long term) likely, as (e.g.) version
constraints on dependencies may need to be added to old versions of dependent
packages to keep them working. (Though I did add and commit the dependency to
&lt;code&gt;master&lt;&#x2F;code&gt;, naturally.)&lt;&#x2F;p&gt;
&lt;p&gt;So, all-in-all, an easy fix to a common problem. Which is the way it should
be…&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Platforms, Packaging, Progress</title>
        <published>2017-08-28T00:00:00+00:00</published>
        <updated>2017-08-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/past-present-future/"/>
        <id>https://mort.io/blog/past-present-future/</id>
        
        <content type="html" xml:base="https://mort.io/blog/past-present-future/">&lt;p&gt;I recently decided to refresh and update my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;&quot;&gt;ocal&lt;&#x2F;a&gt; package,&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; primarily to
port it to use the excellent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pqwy&#x2F;notty&#x2F;&quot;&gt;notty&lt;&#x2F;a&gt; before adding support for indicating
week-of-year. At the same time, I took the opportunity to update the build
infrastructure now that the OCaml world has some shiny new packaging and build
tools to go with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocaml&#x2F;opam&#x2F;&quot;&gt;OPAM&lt;&#x2F;a&gt;, namely &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dbuenzli&#x2F;topkg&#x2F;&quot;&gt;&lt;code&gt;topkg&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;janestreet&#x2F;jbuilder&#x2F;&quot;&gt;&lt;code&gt;jbuilder&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. So, starting
from &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;github.com&#x2F;djs55&#x2F;&quot;&gt;Dave Scott’s&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&#x2F;wiki&#x2F;packaging&quot;&gt;wiki entry&lt;&#x2F;a&gt; about how to package &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&#x2F;&quot;&gt;Mirage&lt;&#x2F;a&gt; libraries,
here’s what I had to do…&lt;&#x2F;p&gt;
&lt;h2 id=&quot;remove-oasis-remnants&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#remove-oasis-remnants&quot; aria-label=&quot;Anchor link for: remove-oasis-remnants&quot;&gt;Remove Oasis remnants&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; rm _oasis setup.ml Makefile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; _tags myocamlbuild.ml .merlin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ocal.opam&#x2F;opam o&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -rf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ocal.opam&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; o ocal.opam&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; add ocal.opam&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .gitignore&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;_build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;*.merlin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;*.install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Although we’re removing the &lt;code&gt;ocal.opam&#x2F;descr&lt;&#x2F;code&gt; file, we’re not going to lose the
content: we’re going to let &lt;code&gt;topkg opam pkg&lt;&#x2F;code&gt; use its default &lt;code&gt;--readme&lt;&#x2F;code&gt; option
to extract the relevant info from the first marked up section of the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;README.md&quot;&gt;&lt;code&gt;README.md&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;font-weight: bold;&quot;&gt;# ocal — An improved Unix &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;`cal`&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;font-weight: bold;&quot;&gt; utility&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;%%VERSION%%&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A replacement for the standard Unix &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;`cal`&lt;&#x2F;span&gt;&lt;span&gt; utility. Partly because I could,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;partly because I&amp;#39;d become too irritated with its command line interface.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We also remove but don’t lose the functionality of the &lt;code&gt;.merlin&lt;&#x2F;code&gt; and OPAM
&lt;code&gt;ocal.install&lt;&#x2F;code&gt; files, as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;janestreet&#x2F;jbuilder&#x2F;&quot;&gt;jbuilder&lt;&#x2F;a&gt; will generate them for us.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;create-src-jbuild-file&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#create-src-jbuild-file&quot; aria-label=&quot;Anchor link for: create-src-jbuild-file&quot;&gt;Create &lt;code&gt;src&#x2F;jbuild&lt;&#x2F;code&gt; file&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; src&#x2F;jbuild&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;(jbuild_version 1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;(executable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ((public_name ocal)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  (package     ocal)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  (name        main)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  (libraries&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;   (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    astring&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    calendar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    cmdliner&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    notty&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    notty.unix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    ))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  (flags (:standard -w &amp;quot;A-44-48-52&amp;quot; -safe-string))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This corresponds to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;releases&#x2F;tag&#x2F;0.2.0&quot;&gt;0.2.0&lt;&#x2F;a&gt;
release of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;&quot;&gt;ocal&lt;&#x2F;a&gt;. Note that the &lt;code&gt;name&lt;&#x2F;code&gt; parameter refers to the module that
contains the entrypoint for the executable, and that we turn on all warnings
(&lt;code&gt;A&lt;&#x2F;code&gt;) except for three that we wish to ignore:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;44&lt;&#x2F;code&gt;: Open statement shadows an already defined identifier.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;48&lt;&#x2F;code&gt;: Implicit elimination of optional arguments.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;52&lt;&#x2F;code&gt;: (see 8.5.1) Fragile constant pattern.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;After I did some tidying up of the code to deal with the newly imposed warnings,
&lt;code&gt;make&lt;&#x2F;code&gt; and &lt;code&gt;make install&lt;&#x2F;code&gt; satisfactorily (and quickly!) used &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;janestreet&#x2F;jbuilder&#x2F;&quot;&gt;jbuilder&lt;&#x2F;a&gt; to
build and install the executable as &lt;code&gt;~&#x2F;.opam&#x2F;system&#x2F;bin&#x2F;ocal&lt;&#x2F;code&gt; (thanks to the
&lt;code&gt;public_name&lt;&#x2F;code&gt; stanza in the &lt;code&gt;src&#x2F;jbuild&lt;&#x2F;code&gt; file, above). &lt;code&gt;make uninstall&lt;&#x2F;code&gt; then
caused &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;janestreet&#x2F;jbuilder&#x2F;&quot;&gt;jbuilder&lt;&#x2F;a&gt; to remove it, before I &lt;code&gt;opam&lt;&#x2F;code&gt; pinned it and then reinstall
through &lt;code&gt;opam&lt;&#x2F;code&gt; to check that workflow worked as well:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; remove ocal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pin add&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -yn --dev-repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ocal .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;opam&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install ocal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;create-the-topkg-skeletons&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#create-the-topkg-skeletons&quot; aria-label=&quot;Anchor link for: create-the-topkg-skeletons&quot;&gt;Create the &lt;code&gt;topkg&lt;&#x2F;code&gt; skeletons&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Having refreshed the basic build infrastructure, next it’s time to update the
packaging workflow. For a simple library we could use the automatic
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;janestreet&#x2F;jbuilder&#x2F;&quot;&gt;jbuilder&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dbuenzli&#x2F;topkg&#x2F;&quot;&gt;topkg&lt;&#x2F;a&gt; plugin per the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&#x2F;wiki&#x2F;packaging&quot;&gt;wiki entry&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; pkg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; pkg&#x2F;pkg.ml&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env ocaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;#use &amp;quot;topfind&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;#require &amp;quot;topkg-jbuilder.auto&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;_EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;However, this isn’t a library so we don’t have documentation to build so we
don’t bother with the &lt;code&gt;odoc&lt;&#x2F;code&gt; skeleton. As a result we also need to customise
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;pkg&#x2F;pkg.ml&quot;&gt;&lt;code&gt;pkg&#x2F;pkg.ml&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; so as to stop &lt;code&gt;topkg publish&lt;&#x2F;code&gt; failing when it can’t build docs:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;ocaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!&#x2F;usr&#x2F;bin&#x2F;env ocaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span&gt;use &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;topfind&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#require &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;topkg-jbuilder&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt;open&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; Topkg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;  Pkg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; ~&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;artefacts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;[&lt;&#x2F;span&gt;&lt;span&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt;Distrib] ()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt; ()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;  Topkg_jbuilder&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;describe&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DC322F;&quot;&gt; ~&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;&quot;&gt; ()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;prepare-a-release&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#prepare-a-release&quot; aria-label=&quot;Anchor link for: prepare-a-release&quot;&gt;Prepare a release&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Finally, we follow the standard &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dbuenzli&#x2F;topkg&#x2F;&quot;&gt;topkg&lt;&#x2F;a&gt; workflow to prepare a release. First,
add an entry to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;CHANGES.md&quot;&gt;&lt;code&gt;CHANGES.md&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; with the correct formatting and commit the
result, and then:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;make&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;distrib&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	[ -x &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$$&lt;&#x2F;span&gt;&lt;span&gt;(opam config var root)&#x2F;plugins&#x2F;opam-publish&#x2F;repos&#x2F;ocal ] || &lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	  opam-publish repo add ocal mor1&#x2F;ocal&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	topkg tag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	topkg distrib&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…which creates tokens for accessing the GitHub repo for this project (if they
don’t already exist), creates a release tag based on entries in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;CHANGES.md&quot;&gt;&lt;code&gt;CHANGES.md&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
and then creates the release tarballs (without the edits to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;pkg&#x2F;pkg.ml&quot;&gt;&lt;code&gt;pkg&#x2F;pkg.ml&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; this
would also build the docs, but we have none).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;publish-a-release&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#publish-a-release&quot; aria-label=&quot;Anchor link for: publish-a-release&quot;&gt;Publish a release&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Finally, we publish the release to GitHub and issue a pull request to
the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocaml&#x2F;opam&#x2F;&quot;&gt;OPAM repository&lt;&#x2F;a&gt; to add the new release into OPAM after linting and
tests have passed.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;make&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;publish&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	topkg publish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	topkg opam pkg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	topkg opam submit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Given that this repo has only a single package, we could in fact simply issue&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;topkg tag &amp;amp;&amp;amp; topkg bistro&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Also, as an alternative to customising the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;pkg&#x2F;pkg.ml&quot;&gt;&lt;code&gt;pkg&#x2F;pkg.ml&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as indicated above, we
could simply remember to indicate the appropriate customisation on the command
line:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;topkg publish distrib&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…but &lt;code&gt;topkg bistro&lt;&#x2F;code&gt; wouldn’t then work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;So that’s it: a simple executable distribution taken from old-school &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;oasis.forge.ocamlcore.org&#x2F;&quot;&gt;Oasis&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ocaml.org&#x2F;learn&#x2F;tutorials&#x2F;ocamlbuild&#x2F;&quot;&gt;OCamlBuild&lt;&#x2F;a&gt; infrastructure to shiny new modern &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;janestreet&#x2F;jbuilder&#x2F;&quot;&gt;jbuilder&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dbuenzli&#x2F;topkg&#x2F;&quot;&gt;topkg&lt;&#x2F;a&gt;. The new
scheme seems to me to be an improvement: faster build times, simpler (to my
eyes) metadata, autogeneration of more of the repeated metadata (&lt;code&gt;.merlin&lt;&#x2F;code&gt; etc),
and a reasonably simple &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;ocal&#x2F;blob&#x2F;0.2.0&#x2F;Makefile&quot;&gt;&lt;code&gt;Makefile&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; that I actually think I understand.
Definitely progress :)&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;A somewhat over-featured replacement for the standard UNIX &lt;code&gt;cal&lt;&#x2F;code&gt; utility,
because I got irritated by its American-centricity and my
initial &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;python-scripts&#x2F;blob&#x2F;master&#x2F;cal.py&quot;&gt;Python replacement&lt;&#x2F;a&gt; was just too slow… &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Redwood Trail, Big Basin Redwood Park, USA</title>
        <published>2017-08-24T00:00:00+00:00</published>
        <updated>2017-08-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2017-usa-redwood-trail-big-basin-redwood-park/"/>
        <id>https://mort.io/tracks/2017-usa-redwood-trail-big-basin-redwood-park/</id>
        
        <summary type="html">&lt;p&gt;A short stop off to see some big trees: a small redwood grove in California.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>May Lake, Yosemite National Park, USA</title>
        <published>2017-08-22T00:00:00+00:00</published>
        <updated>2017-08-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2017-usa-may-lake-yosemite/"/>
        <id>https://mort.io/tracks/2017-usa-may-lake-yosemite/</id>
        
        <summary type="html">&lt;p&gt;A short walk to May Lake in Yosemite National Park, USA. The day after the
eclipse. Genuinely beautiful. Some of the photos I’m most happy with in this
lot.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>ARMing LinuxKit</title>
        <published>2017-06-02T00:00:00+00:00</published>
        <updated>2017-06-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/arming-linuxkit/"/>
        <id>https://mort.io/blog/arming-linuxkit/</id>
        
        <content type="html" xml:base="https://mort.io/blog/arming-linuxkit/">&lt;p&gt;As some may know, following the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;unikernels.com&quot;&gt;Unikernel Systems&lt;&#x2F;a&gt; acquisition, I
currently do contract work for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&quot;&gt;Docker Inc.&lt;&#x2F;a&gt; in addition to my day job
here at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&quot;&gt;Cambridge University Computer Laboratory&lt;&#x2F;a&gt;. Recently this has
centred on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linuxkit&#x2F;linuxkit&quot;&gt;LinuxKit&lt;&#x2F;a&gt;, “&lt;em&gt;A toolkit for building secure, portable and lean
operating systems for containers&lt;&#x2F;em&gt;” and, specifically, enabling ARM64 support.
I’m pleased to say that a basic proof-of-concept is now complete, and we’re
working towards getting support merged upstream.&lt;&#x2F;p&gt;
&lt;p&gt;The proof-of-concept was developed using the great ARM64 support provided
by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packet.net&quot;&gt;&lt;code&gt;packet.net&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, on one of their &lt;code&gt;type 2A&lt;&#x2F;code&gt; boxes.&lt;&#x2F;p&gt;
&lt;p&gt;If you fancy trying it out, then hopefully the following instructions will be of
use – or just bug me on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;slack.packet.net&#x2F;&quot;&gt;&lt;code&gt;packet.net&lt;&#x2F;code&gt; Slack&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#building&quot; aria-label=&quot;Anchor link for: building&quot;&gt;Building&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Start by getting an ARM64 box setup. If you have one to hand, great! If not, you
could head over to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packet.net&quot;&gt;packet.net&lt;&#x2F;a&gt; and create type 2A Ubuntu box to use as a build
environment.&lt;&#x2F;p&gt;
&lt;p&gt;Then clone the source, either &lt;code&gt;git clone&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;linuxkit&#x2F;tree&#x2F;project-arm64&quot;&gt;my dev branch&lt;&#x2F;a&gt;, or
see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;linuxkit&#x2F;linuxkit&#x2F;pull&#x2F;1654&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;linuxkit&#x2F;linuxkit&#x2F;pull&#x2F;1654&lt;&#x2F;a&gt; for the open PR which may
be a bit more stable.&lt;&#x2F;p&gt;
&lt;p&gt;The essence of it then is to build the containers based off &lt;code&gt;aarch64&#x2F;alpine&lt;&#x2F;code&gt;,
along with an ARM64 version of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;moby&#x2F;moby&quot;&gt;&lt;code&gt;moby&lt;&#x2F;code&gt; CLI&lt;&#x2F;a&gt; if needed. Specifying the
container images you just built in your &lt;code&gt;moby.yml&lt;&#x2F;code&gt; file will then cause &lt;code&gt;moby&lt;&#x2F;code&gt;
to assemble things that should boot on ARM64.&lt;&#x2F;p&gt;
&lt;p&gt;The output should be a gzipped kernel, currently slightly misleadingly named
&lt;code&gt;bzImage&lt;&#x2F;code&gt; as well as a suitable &lt;code&gt;initrd&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;booting&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#booting&quot; aria-label=&quot;Anchor link for: booting&quot;&gt;Booting&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Setup another ARM64 box on which to boot the results. You could setup a
type 2A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packet.net&quot;&gt;packet.net&lt;&#x2F;a&gt; box once more, but this  time set it to &lt;em&gt;custom OS&lt;&#x2F;em&gt; and
&lt;em&gt;iPXE boot&lt;&#x2F;em&gt;. For the iPXE boot URL, give a URL pointing to a suitable boot
file. I use:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;#!ipxe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; base-url URL-TO-DIRECTORY-HOLDING-IMAGES&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; kernel-params ip=dhcp nomodeset ro serial console=ttyAMA0,115200 earlycon earlyprintk=serial,keep initrd=arm64-initrd.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;initrd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;base-url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;arm64-initrd.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;imgstat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;boot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;base-url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;arm64-bzImage&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ${&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;kernel-params&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note that, currently at least, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packet.net&quot;&gt;packet.net&lt;&#x2F;a&gt; iPXE boot only occurs on the
first boot as it is assumed that the iPXE boot will install a working image to
the local disk. Thus, if it doesn’t work first time, get an SOS console and
break in by hitting &lt;code&gt;^B&lt;&#x2F;code&gt; at the appropriate moment, before issuing &lt;code&gt;chain URL&lt;&#x2F;code&gt;
where &lt;code&gt;URL&lt;&#x2F;code&gt; points to your iPXE boot file.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;Conclusion&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This just does the barest minimum for now – I did say it was a
proof-of-concept… :) Work is currently ongoing to upstream this rather than
developing this PoC further, but if anyone has a particular interest or would
like to provide patches to, e.g., support network devices on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packet.net&quot;&gt;packet.net&lt;&#x2F;a&gt;,
please &lt;a href=&quot;mailto:mort@cantab.net&quot;&gt;get in touch&lt;&#x2F;a&gt;, file an issue or send a pull
request!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Docker Docker</title>
        <published>2017-05-06T00:00:00+00:00</published>
        <updated>2017-05-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/docker-docker/"/>
        <id>https://mort.io/blog/docker-docker/</id>
        
        <content type="html" xml:base="https://mort.io/blog/docker-docker/">&lt;h1 id=&quot;bootstrapping-docker-for-arm64-aka-aarch64&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bootstrapping-docker-for-arm64-aka-aarch64&quot; aria-label=&quot;Anchor link for: bootstrapping-docker-for-arm64-aka-aarch64&quot;&gt;Bootstrapping Docker for ARM64 (aka AARCH64)&lt;&#x2F;a&gt;&lt;&#x2F;h1&gt;
&lt;p&gt;Basic process is:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;bootstrap ARM64 &lt;code&gt;go&lt;&#x2F;code&gt; toolchain on x86, and install&lt;&#x2F;li&gt;
&lt;li&gt;build ARM64 &lt;code&gt;go1.7.5&lt;&#x2F;code&gt; toolchain needed for &lt;code&gt;docker&lt;&#x2F;code&gt; build&lt;&#x2F;li&gt;
&lt;li&gt;bootstrap ARM64 &lt;code&gt;docker&lt;&#x2F;code&gt; v1.10.3&lt;&#x2F;li&gt;
&lt;li&gt;use bootstrapped &lt;code&gt;docker&lt;&#x2F;code&gt; to provide containerised build environment for
building later versions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Instructions below are for CentOS 7 for Reasons(tm). Package details and so on
will vary on other distros.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;build-go-bootstrap-toolchain&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-go-bootstrap-toolchain&quot; aria-label=&quot;Anchor link for: build-go-bootstrap-toolchain&quot;&gt;Build &lt;code&gt;go&lt;&#x2F;code&gt; bootstrap toolchain&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;On x86 host:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;build basic go1.4 sufficient to bootstrap&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;curl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -O&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;storage.googleapis.com&#x2F;golang&#x2F;go1.4-bootstrap-20161024.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;tar&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; xzvf go1.4-bootstrap-20161024.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; go go1.4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; go1.4&#x2F;src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&#x2F;make.bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;cross-compile go1.7 (latest)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&#x2F;src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&#x2F;src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; clone https:&#x2F;&#x2F;go.googlesource.com&#x2F;go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; checkout go1.7.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;GOOS&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;linux&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; GOARCH&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;arm64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&#x2F;bootstrap.bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;transfer cross-compiled toolchain to ARM64 host&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;scp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&#x2F;src&#x2F;go-linux-arm64-bootstrap.tbz HOST:~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;build-arm64-go1-7-5&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-arm64-go1-7-5&quot; aria-label=&quot;Anchor link for: build-arm64-go1-7-5&quot;&gt;Build ARM64 &lt;code&gt;go1.7.5&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;produce bootstrap toolchains&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;tar&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; xvf go-linux-arm64-bootstrap.tbz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;use the bootstrap toolchain to build a modern &lt;code&gt;go&lt;&#x2F;code&gt; install&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&#x2F;src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&#x2F;src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; clone https:&#x2F;&#x2F;go.googlesource.com&#x2F;go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; checkout go1.7.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;GOROOT_BOOTSTRAP&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;~&#x2F;go-linux-arm64-bootstrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&#x2F;make.bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&#x2F;src&#x2F;go&#x2F;bin ~&#x2F;go&#x2F;bin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;bootstrap-arm64-docker&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bootstrap-arm64-docker&quot; aria-label=&quot;Anchor link for: bootstrap-arm64-docker&quot;&gt;Bootstrap ARM64 Docker&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;get a recent &lt;code&gt;git&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; yum remove git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; https:&#x2F;&#x2F;github.com&#x2F;git&#x2F;git&#x2F;archive&#x2F;v2.12.2.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;tar&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; xvf v2.12.2.tar.gz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; git-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;which&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; yum install perl-devel hg curl-devel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; configure&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&#x2F;configure&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --prefix=&#x2F;usr&#x2F;local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -j8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; make install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;install dev dependencies&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; yum install btrfs-progs-devel device-mapper-devel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;clone source&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;go&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -p&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; src&#x2F;github.com&#x2F;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; src&#x2F;github.com&#x2F;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; clone git@github.com:docker&#x2F;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;build components&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; co v1.10.3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; vendor&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; src&#x2F;*&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; do&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; ln&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $n&lt;&#x2F;span&gt;&lt;span&gt; ;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; done&lt;&#x2F;span&gt;&lt;span&gt; )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;.&#x2F;hack&#x2F;make.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; dynbinary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -rf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; vendor&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; checkout .&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # tidy up symlinking&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note that a current bug in Ubuntu packaging metadata means a small edit needs to
be made to &lt;code&gt;.&#x2F;Dockerfile.aarch64&lt;&#x2F;code&gt;: change the &lt;code&gt;apt-get update &amp;amp;&amp;amp;&lt;&#x2F;code&gt; to &lt;code&gt;apt-get update ;&lt;&#x2F;code&gt; so that the build doesn’t stop at the first hurdle, updating packages.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;run daemon&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# sudo rm -rf &#x2F;var&#x2F;lib&#x2F;docker &#x2F;etc&#x2F;docker&#x2F;config.json # DANGEROUS!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; .&#x2F;bundles&#x2F;1.10.3&#x2F;dynbinary&#x2F;docker daemon&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -D --group=wheel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;run client to check&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; PATH=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -P&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&#x2F;bundles&#x2F;1.10.3&#x2F;dynbinary&#x2F;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$PATH&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; docker version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Client:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Version:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;      1.10.3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; API&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; version:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;  1.22&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Go&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; version:   go1.7.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; commit:   20f81dde9&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Built:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        Tue Apr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;  4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 00:27:13&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 2017&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; OS&#x2F;Arch:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      linux&#x2F;arm64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Server:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Version:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;      1.10.3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; API&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; version:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;  1.22&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Go&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; version:   go1.7.5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; commit:   20f81dde9&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; Built:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;        Tue Apr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;  4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 00:27:13&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 2017&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; OS&#x2F;Arch:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;      linux&#x2F;arm64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;build-docker&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-docker&quot; aria-label=&quot;Anchor link for: build-docker&quot;&gt;Build Docker&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;reissue &lt;code&gt;make&lt;&#x2F;code&gt; using containerised build&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; DOCKER_BUILDTAGS&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;apparmor selinux seccomp&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; co v17.05.0-ce&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # or v1.12.3 or master or whatever&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;          # transient failure of first build; restart succeeded&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; deb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; contrib&#x2F;builder&#x2F;rpm&#x2F;aarch64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; rpm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;notes&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#notes&quot; aria-label=&quot;Anchor link for: notes&quot;&gt;Notes&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Resulting &lt;code&gt;17.05-dev&lt;&#x2F;code&gt; binaries fail due to missing &lt;code&gt;libapparmor.so&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Static binary build no longer supported?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;DOCKER_BUILDTAGS&lt;&#x2F;code&gt; environment variable no longer supported?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;1.12.3&lt;&#x2F;code&gt; and &lt;code&gt;1.13.1&lt;&#x2F;code&gt; also built&lt;&#x2F;li&gt;
&lt;li&gt;Build of RPM or DEB packages fails due, I think, to DIND not working&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lab GitLab</title>
        <published>2017-04-19T00:00:00+00:00</published>
        <updated>2017-04-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/lab-gitlab/"/>
        <id>https://mort.io/blog/lab-gitlab/</id>
        
        <content type="html" xml:base="https://mort.io/blog/lab-gitlab/">&lt;p&gt;Recently had cause to do this as part of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;research&#x2F;srg&#x2F;&quot;&gt;SRG’s&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ocamllabs.io&#x2F;&quot;&gt;OCaml Labs&lt;&#x2F;a&gt;
infrastructure. Thought it might be useful to make some notes, so here they are!
Assuming your local &lt;code&gt;sys-admin&lt;&#x2F;code&gt; has kindly created you a suitable VM running
Ubuntu with login credentials, etc, read on…&lt;&#x2F;p&gt;
&lt;p&gt;Note that several commands that follow must be run as &lt;code&gt;root&lt;&#x2F;code&gt;, via use of &lt;code&gt;sudo&lt;&#x2F;code&gt;
below. Given that, think twice before just cutting and pasting them in,
obviously… And I am not held responsible for anything either way!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;install-docker&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#install-docker&quot; aria-label=&quot;Anchor link for: install-docker&quot;&gt;Install Docker&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;On a new Ubuntu stretch&#x2F;sid (testing) VM:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; lsb_release&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -drc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Description:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;	Ubuntu&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 16.04.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; LTS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Release:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;	16.04&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Codename:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;	xenial&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, install up-to-date &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get install apt-transport-https ca-certificates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;apt-key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; adv&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --keyserver&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; hkp:&#x2F;&#x2F;p80.pool.sks-keyservers.net:80&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;        --recv-keys&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 58118E89F3A912897C070ADBF76221572C52609D&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; echo &amp;quot;deb https:&#x2F;&#x2F;apt.dockerproject.org&#x2F;repo debian-stretch main&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;     &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;apt&#x2F;sources.list.d&#x2F;docker.list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get install&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; docker-engine&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tweak the &lt;code&gt;systemd&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt; configuration by adding a fragment to point
all &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt; to the &lt;code&gt;&#x2F;data&lt;&#x2F;code&gt; partition, lest the root partition &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; fill:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;etc&#x2F;systemd&#x2F;system&#x2F;docker.service.d&#x2F;data-disk.conf&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;[Service]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;ExecStart=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;ExecStart=&#x2F;usr&#x2F;bin&#x2F;dockerd -H fd:&#x2F;&#x2F; -g &#x2F;data&#x2F;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then start the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt; daemon and run &lt;code&gt;hello-world&lt;&#x2F;code&gt; just to check all is
well:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; systemctl daemon-reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; service docker start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, test the install by running &lt;code&gt;hello-world&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; docker run hello-world&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Hello&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; from Docker!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;This&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; message shows that your installation appears to be working correctly.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;To&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; generate this message, Docker took the following steps:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 1.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; The Docker client contacted the Docker daemon.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 2.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; The Docker daemon pulled the &amp;quot;hello-world&amp;quot; image from the Docker Hub.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 3.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; The Docker daemon created a new container from that image which runs the&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    executable&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; that produces the output you are currently reading.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; 4.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; The Docker daemon streamed that output to the Docker client, which sent it&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;    to&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; your terminal.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;To&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; try something more ambitious, you can run an Ubuntu container with:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; docker run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -it&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ubuntu bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Share&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; images, automate workflows, and more with a free Docker Hub account:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; https:&#x2F;&#x2F;hub.docker.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;For&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; more examples and ideas, visit:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; https:&#x2F;&#x2F;docs.docker.com&#x2F;engine&#x2F;userguide&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If appropriate, you may also wish to add yourself to the &lt;code&gt;docker&lt;&#x2F;code&gt; user group:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; usermod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -aG&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; docker&lt;&#x2F;span&gt;&lt;span&gt; $(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;whoami&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;gitlab&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#gitlab&quot; aria-label=&quot;Anchor link for: gitlab&quot;&gt;GitLab&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Assuming you have rights to run &lt;code&gt;docker&lt;&#x2F;code&gt;, install and run Gitlab-CE:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;S&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;128.232.xxx.yyy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;gitlab.srg.cl.cam.ac.uk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --detach \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $H&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $S&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;:443:443&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $S&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;:80:80&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --publish&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; $S&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;:2222:22&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --restart&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; always&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --volume&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;data&#x2F;gitlab&#x2F;config:&#x2F;etc&#x2F;gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --volume&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;data&#x2F;gitlab&#x2F;logs:&#x2F;var&#x2F;log&#x2F;gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --volume&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;data&#x2F;gitlab&#x2F;data:&#x2F;var&#x2F;opt&#x2F;gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --volume&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;data&#x2F;gitlab&#x2F;backups:&#x2F;var&#x2F;opt&#x2F;gitlab&#x2F;backups&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --volume&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;data&#x2F;gitlab&#x2F;sync:&#x2F;var&#x2F;opt&#x2F;gitlab&#x2F;sync&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;     --env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; HOST_UID=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -u&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --env&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; HOST_GID=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -g&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;     mor1&#x2F;gitlab-ce-cron:latest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…or use the &lt;code&gt;make start&lt;&#x2F;code&gt; target in the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;dockerfiles&#x2F;blob&#x2F;master&#x2F;gitlab-ce-cron&#x2F;Makefile&quot;&gt;Makefile&lt;&#x2F;a&gt;
in the related &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;dockerfiles&#x2F;tree&#x2F;master&#x2F;gitlab-ce-cron&quot;&gt;GitHub
repo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tls-certificates&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tls-certificates&quot; aria-label=&quot;Anchor link for: tls-certificates&quot;&gt;TLS Certificates&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Self-certified certificates:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;openssl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; req&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -nodes -newkey&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; rsa:2048&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -keyout&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gitlab.srg.cl.cam.ac.uk.key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -out&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gitlab.srg.cl.cam.ac.uk.csr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ssl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;chmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 600&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;openssl&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; x509&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -req -days&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1460&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gitlab.srg.cl.cam.ac.uk.csr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -signkey&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gitlab.srg.cl.cam.ac.uk.key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -out&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; gitlab.srg.cl.cam.ac.uk.crt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;run-backups&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#run-backups&quot; aria-label=&quot;Anchor link for: run-backups&quot;&gt;Run Backups&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;backup&lt;&#x2F;code&gt; script to create backup tarballs and extract&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sync&lt;&#x2F;code&gt; script to rsync extracted tarballs to filer&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;recovering-password&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#recovering-password&quot; aria-label=&quot;Anchor link for: recovering-password&quot;&gt;Recovering Password&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;To change the &lt;code&gt;root&lt;&#x2F;code&gt; password you need to use the Ruby-on-Rails console to
access the relevant object, modify it, and save it back:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;rails console production&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;irb&lt;&#x2F;span&gt;&lt;span&gt;(main):&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;001&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; user &lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;= User&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;id:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;).&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;first&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; #&amp;lt;User id: 1, email: &amp;quot;admin@example.com&amp;quot;, created_at: &amp;quot;2016-11-16 22:57:21&amp;quot;, updated_at: &amp;quot;2016-12-05 23:42:50&amp;quot;, name: &amp;quot;Administrator&amp;quot;, admin: true, projects_limit: 10, skype: &amp;quot;&amp;quot;, linkedin: &amp;quot;&amp;quot;, twitter: &amp;quot;&amp;quot;, authentication_token: &amp;quot;secrettoken&amp;quot;, theme_id: 2, bio: nil, username: &amp;quot;root&amp;quot;, can_create_group: true, can_create_team: false, state: &amp;quot;active&amp;quot;, color_scheme_id: 1, password_expires_at: nil, created_by_id: nil, last_credential_check_at: nil, avatar: nil, hide_no_ssh_key: false, website_url: &amp;quot;&amp;quot;, notification_email: &amp;quot;admin@example.com&amp;quot;, hide_no_password: false, password_automatically_set: false, location: nil, encrypted_otp_secret: nil, encrypted_otp_secret_iv: nil, encrypted_otp_secret_salt: nil, otp_required_for_login: false, otp_backup_codes: nil, public_email: &amp;quot;&amp;quot;, dashboard: 0, project_view: 0, consumed_timestep: nil, layout: 0, hide_project_limit: false, otp_grace_period_started_at: nil, ldap_email: false, external: false, organization: nil&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;irb&lt;&#x2F;span&gt;&lt;span&gt;(main):&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;002&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; user.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;password&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;secretpassword&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;secretpassword&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;irb&lt;&#x2F;span&gt;&lt;span&gt;(main):&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;003&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; user.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;password_confirmation&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;secretpassword&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;secretpassword&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;irb&lt;&#x2F;span&gt;&lt;span&gt;(main):&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;004&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; user.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;save!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Enqueued&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; ActionMailer&lt;&#x2F;span&gt;&lt;span style=&quot;color: #6C71C4;&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;DeliveryJob&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Job&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; ID:&lt;&#x2F;span&gt;&lt;span&gt; 5f74573d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;dfa2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;4778&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;b365&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;cbebd88e454e) to &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Sidekiq&lt;&#x2F;span&gt;&lt;span&gt;(mailers) with &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;arguments:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;DeviseMailer&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;password_change&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;deliver_now&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; gid:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;User&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;irb&lt;&#x2F;span&gt;&lt;span&gt;(main):&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;005&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gitlab&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;ctl reconfigure&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;hook-up-to-github&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#hook-up-to-github&quot; aria-label=&quot;Anchor link for: hook-up-to-github&quot;&gt;Hook up to GitHub&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Per
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;integration&#x2F;omniauth.html#initial-omniauth-configuration&quot;&gt;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;integration&#x2F;omniauth.html#initial-omniauth-configuration&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;integration&#x2F;github.html&quot;&gt;https:&#x2F;&#x2F;docs.gitlab.com&#x2F;ce&#x2F;integration&#x2F;github.html&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;p&gt;Edit via &lt;code&gt;sudo docker exec -it gitlab &#x2F;bin&#x2F;bash&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;root@gitlab:&#x2F;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; vi &#x2F;etc&#x2F;gitlab&#x2F;gitlab.rb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gitlab_rails[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;omniauth_enabled&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gitlab_rails[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;omniauth_allow_single_sign_on&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;saml&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;github&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gitlab_rails[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;omniauth_block_auto_created_users&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;email&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#email&quot; aria-label=&quot;Anchor link for: email&quot;&gt;Email&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Use SMTP via &amp;lt;ppsw.cam.ac.uk&amp;gt;, for which the from address must have a valid &lt;code&gt;MX&lt;&#x2F;code&gt;
record &lt;strong&gt;and&lt;&#x2F;strong&gt; not be under &amp;lt;cam.ac.uk&amp;gt; per
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;email-telephony-and-collaboration&#x2F;email&#x2F;technical&#x2F;sending&quot;&gt;http:&#x2F;&#x2F;help.uis.cam.ac.uk&#x2F;email-telephony-and-collaboration&#x2F;email&#x2F;technical&#x2F;sending&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Configuration can be tested via the console:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;Notify&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;test_email&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;your@email.address, &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;Hello World&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;, &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;This&lt;&#x2F;span&gt;&lt;span&gt; is a &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span&gt; message&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;).deliver_now&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Google screening</title>
        <published>2017-01-29T00:00:00+00:00</published>
        <updated>2017-01-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/google-screening/"/>
        <id>https://mort.io/blog/google-screening/</id>
        
        <content type="html" xml:base="https://mort.io/blog/google-screening/">&lt;p&gt;Some time ago, for reasons best known to themselves, a Google recruiter decided
to “reach out” on the basis of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;&quot;&gt;my GitHub profile&lt;&#x2F;a&gt; to
see if I were interested in a role as a Site-Reliability Engineer or possibly a
Software Engineer. This entailed a short (~30min) telephone interview to answer
some questions. I made a note of those I recalled, in case anyone’s interested.&lt;&#x2F;p&gt;
&lt;p&gt;The hawk-eyed and keen-minded among you may discern a certain amount of
ambiguity in answers to some of the questions – e.g., is the opposite of
&lt;code&gt;malloc()&lt;&#x2F;code&gt;, &lt;code&gt;free()&lt;&#x2F;code&gt; or a garbage collector? are we assuming an Ethernet MAC
address? – which the recruiter did not seem to be happy to deal with. But so
long as my answer included a reasonable approximation to (presumably) the string
they had written down, all was well.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;What is the Big-O complexity of quicksort?&lt;&#x2F;li&gt;
&lt;li&gt;What is the search complexity for a red-black tree, a binary tree, a linked
list, a hashtable, and a B-tree?&lt;&#x2F;li&gt;
&lt;li&gt;What’s the opposite of &lt;code&gt;malloc()&lt;&#x2F;code&gt;?&lt;&#x2F;li&gt;
&lt;li&gt;What are the semantics of an ACL?&lt;&#x2F;li&gt;
&lt;li&gt;Which of the following fields are &lt;em&gt;not&lt;&#x2F;em&gt; part of the &lt;code&gt;passwd&lt;&#x2F;code&gt; file?
&lt;ul&gt;
&lt;li&gt;shell, comment, initial umask, login name, ui, home directory, gid,
preferred language&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;What does the &lt;code&gt;fstat&lt;&#x2F;code&gt; syscall do?&lt;&#x2F;li&gt;
&lt;li&gt;What’s the default signal for &lt;code&gt;kill&lt;&#x2F;code&gt;?&lt;&#x2F;li&gt;
&lt;li&gt;What’s in an inode?&lt;&#x2F;li&gt;
&lt;li&gt;How do you make a socket accept inbound connections?&lt;&#x2F;li&gt;
&lt;li&gt;How many bytes in a MAC address?&lt;&#x2F;li&gt;
&lt;li&gt;What are the packets involved in a TCP connection setup?&lt;&#x2F;li&gt;
&lt;li&gt;How many hosts are in a &#x2F;23 subnet?&lt;&#x2F;li&gt;
&lt;li&gt;What’s the DNS resource record type for an IPv6 address?&lt;&#x2F;li&gt;
&lt;li&gt;Estimate the value of 2&lt;sup&gt;24&lt;&#x2F;sup&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In the end, I passed even though I could only remember the name, not the number,
of the default signal for &lt;code&gt;kill&lt;&#x2F;code&gt;. It then got mildly amusing: the next stage is
apparently to “jump on a call” (sigh) with a recruiter and an engineer to work
through some coding problems. I explained that I generally refuse to engage in
whiteboard coding during interviews (it’s not a useful measure of anything
useful, and I don’t see why I should). They said oh but of course I could do it
on a call so it wouldn’t actually be a whiteboard. I said, yes I could but no I
wouldn’t and I thought they were rather missing my point. They said really,
it was very unusual for someone to refuse. I said, to be honest it makes little
sense anyway given they contacted me because of &lt;em&gt;all the code I’d written under
my GitHub account&lt;&#x2F;em&gt;. They said oh well.&lt;&#x2F;p&gt;
&lt;p&gt;And then some time later – 6 months I think – a different recruiter “reached
out” to ask why the process had stalled and did I want to jump on a call.&lt;&#x2F;p&gt;
&lt;p&gt;I said No. They haven’t called back since. Oh well…&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Customising Homebrew service</title>
        <published>2017-01-04T00:00:00+00:00</published>
        <updated>2017-01-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/brew-plist/"/>
        <id>https://mort.io/blog/brew-plist/</id>
        
        <content type="html" xml:base="https://mort.io/blog/brew-plist/">&lt;p&gt;As I could never remember the command to start the &lt;code&gt;offlineimap&lt;&#x2F;code&gt; service using
my customised configuration, here it is:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; services start offlineimap ~&#x2F;rc-files&#x2F;homebrew.mxcl.offlineimap.plist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Building Up Your ARMs</title>
        <published>2016-11-16T00:00:00+00:00</published>
        <updated>2016-11-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/building-up-your-arms/"/>
        <id>https://mort.io/blog/building-up-your-arms/</id>
        
        <content type="html" xml:base="https://mort.io/blog/building-up-your-arms/">&lt;p&gt;Due to the impending finish of the EU FP7 funded &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;usercentricnetworking.eu&quot;&gt;User Centric
Networking&lt;&#x2F;a&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; I recently had cause to revisit the excellent work that
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;talex5&quot;&gt;Thomas Leonard&lt;&#x2F;a&gt; did for the project in getting Xen&#x2F;ARM running on the
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;cubieboard.org&#x2F;model&#x2F;cb2&#x2F;&quot;&gt;Cubieboard2&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;cubieboard.org&#x2F;model&#x2F;cb3&#x2F;&quot;&gt;Cubietruck&lt;&#x2F;a&gt; (aka &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;cubieboard.org&#x2F;model&#x2F;cb3&#x2F;&quot;&gt;Cubieboard3&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;The resulting repo, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder&quot;&gt;mirage&#x2F;xen-arm-builder&lt;&#x2F;a&gt;, had languished for several
months and the past SD card images had some problems and had been allowed to
drop off the ’Net as a result. However, sterling work by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ijc25&quot;&gt;Ian Campbell&lt;&#x2F;a&gt; at
a recent Mirage &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&#x2F;blog&#x2F;2016-summer-hackathon-roundup&quot;&gt;hackathon&lt;&#x2F;a&gt; had started to resurrect this work based on
the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpinelinux.org&#x2F;&quot;&gt;Alpine Linux&lt;&#x2F;a&gt; distribution. This seemed a promising place to start,
so I did :)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building-an-image&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#building-an-image&quot; aria-label=&quot;Anchor link for: building-an-image&quot;&gt;Building an Image&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The end result was an enormous &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder&#x2F;pull&#x2F;71&quot;&gt;pull request&lt;&#x2F;a&gt; that splatted a Brave New
World on top of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;talex5&quot;&gt;Thomas’&lt;&#x2F;a&gt; work.
The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder&#x2F;blob&#x2F;master&#x2F;README.md&quot;&gt;&lt;code&gt;README&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
is hopefully reasonably self-explanatory but in summary,&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone the repo:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; clone https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;arm-image-builder.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; arm-image-builder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;code&gt;make&lt;&#x2F;code&gt; targets:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;       # runs `make prepare build image`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# make prepare # clones repos, pulls tarballs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# make build   # use Docker to build the `linux&#x2F;` and `u-boot&#x2F;` trees&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;# make image   # finally, create the on-disk `sdcard.img`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This clones the necessary repos (Linux, u-boot), builds them, and then puts
together the image file &lt;code&gt;sdcard.img&lt;&#x2F;code&gt; in the current directory. If on OSX, &lt;code&gt;make sdcard&lt;&#x2F;code&gt; will then attempt to write that to a blank, mounted SD card. This does a
rather hacky auto-discovery of where the SD card might be mounted; if in doubt,
and in any case, always safer to simply&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;MNT&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;the-correct-mount-point&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sdcard&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…or simply use your favourite tools to write the &lt;code&gt;sdcard.img&lt;&#x2F;code&gt; file to your SD
card.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-the-image&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#using-the-image&quot; aria-label=&quot;Anchor link for: using-the-image&quot;&gt;Using the Image&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The end result should be an SD card that you can use to boot your device into
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpinelinux.org&#x2F;&quot;&gt;Alpine Linux v3.4&lt;&#x2F;a&gt;. At present, completing installation requires then:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder#first-boot--re-initialisation&quot;&gt;resetting the environment&lt;&#x2F;a&gt;,&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder#base-install&quot;&gt;completing Alpine setup&lt;&#x2F;a&gt; via
the &lt;code&gt;setup-alpine&lt;&#x2F;code&gt; script,&lt;&#x2F;li&gt;
&lt;li&gt;(if desired) installing Xen via the
&lt;code&gt;&#x2F;media&#x2F;mmcblk0p1&#x2F;alpine-dom0-install.sh&lt;&#x2F;code&gt; script created as part of building
the SD card image,&lt;&#x2F;li&gt;
&lt;li&gt;(if desired) finally,
building &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder#alpine&quot;&gt;Alpine&lt;&#x2F;a&gt;
and&#x2F;or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;xen-arm-builder#debian&quot;&gt;Debian&lt;&#x2F;a&gt; &lt;code&gt;domU&lt;&#x2F;code&gt;s
via the &lt;code&gt;&#x2F;media&#x2F;mmcblk0p1&#x2F;alpine-domU-install.sh&lt;&#x2F;code&gt; and
&lt;code&gt;&#x2F;media&#x2F;mmcblk0p1&#x2F;debian-domU-install.sh&lt;&#x2F;code&gt; scripts, also created as part of
building the image.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hopefully the net result is you end up with a Cubieboard2&#x2F;3 running Xen with an
Alpine Linux &lt;code&gt;dom0&lt;&#x2F;code&gt; and some &lt;code&gt;domU&lt;&#x2F;code&gt; images available.&lt;&#x2F;p&gt;
&lt;p&gt;As ever, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;mort___&quot;&gt;comments, patches, pull requests welcome&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Grant No. 611001 for those who care. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Debugging with jQuery</title>
        <published>2016-11-16T00:00:00+00:00</published>
        <updated>2016-11-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/jquery-console/"/>
        <id>https://mort.io/blog/jquery-console/</id>
        
        <content type="html" xml:base="https://mort.io/blog/jquery-console/">&lt;p&gt;I had cause to do this recently, so here’re the runes from
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;7474354&#x2F;include-jquery-in-the-javascript-console&quot;&gt;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;7474354&#x2F;include-jquery-in-the-javascript-console&lt;&#x2F;a&gt;
for the record:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; script&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;createElement&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;script&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;https:&#x2F;&#x2F;ajax.googleapis.com&#x2F;ajax&#x2F;libs&#x2F;jquery&#x2F;1.6.3&#x2F;jquery.min.js&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;getElementsByTagName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;#39;head&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;].&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;appendChild&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zen and the Art of Research Management</title>
        <published>2016-11-11T00:00:00+00:00</published>
        <updated>2016-11-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/zen-and-the-art-of-research-management/"/>
        <id>https://mort.io/blog/zen-and-the-art-of-research-management/</id>
        
        <content type="html" xml:base="https://mort.io/blog/zen-and-the-art-of-research-management/">&lt;p&gt;I think this is a bit of a classic, the first written form of which I came
across in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;misc&#x2F;obituaries&#x2F;needham&#x2F;&quot;&gt;Prof. Roger Needham&lt;&#x2F;a&gt;’s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;events&#x2F;50+5&#x2F;&quot;&gt;50+5 Festschrift&lt;&#x2F;a&gt; celebrating his
time at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;&quot;&gt;Cambridge University Computer Lab&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.microsoft.com&#x2F;en-us&#x2F;research&#x2F;lab&#x2F;microsoft-research-cambridge&#x2F;&quot;&gt;Microsoft Research Cambridge&lt;&#x2F;a&gt;. I don’t know who originated it, but the
copy there is certainly due to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;memex.naughtons.org&#x2F;&quot;&gt;John Naughton&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Robert_Taylor_(computer_scientist)&quot;&gt;Bob Taylor&lt;&#x2F;a&gt;. I
suppose one might quibble point 12, in that I seem to recall Roger did a lot of
pacing about, but a good chair is certainly a worthwhile thing to provide.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, I find myself wanting to point at it from time-to-time, so here it is!&lt;&#x2F;p&gt;
&lt;p&gt;By &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;memex.naughtons.org&#x2F;&quot;&gt;John Naughton&lt;&#x2F;a&gt; (&lt;em&gt;Open University, Milton Keynes, England&lt;&#x2F;em&gt;), and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Robert_Taylor_(computer_scientist)&quot;&gt;Robert
W. Taylor&lt;&#x2F;a&gt; (&lt;em&gt;Woodside, California, USA&lt;&#x2F;em&gt;).&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;HIRE ONLY THE VERY BEST PEOPLE, EVEN IF THEY ARE CUSSED. Perhaps especially
if they are cussed. Your guiding principle should be to employ people who
are smarter than you. One superb researcher is worth dozens of merely good
ones.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;ONCE YOU’VE GOT THEM, TRUST THEM. Do not attempt to micro-manage talented
people. (Remember rule #1.) Set broad goals and leave them to it.
Concentrate your own efforts on strategy and nurturing the environment.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;PROTECT YOUR RESEARCHERS FROM EXTERNAL INTERFERENCE, whether from company
personnel officers, senior executives or security personnel. Remember that
your job is to create a supportive and protective space within which they
can work.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;MUCH OF WHAT YOU DO WILL FALL INTO THE CATEGORY OF ABSORBING THE UNCERTAINTY
OF YOUR RESEARCHERS.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;REMEMBER THAT YOU ARE A CONDUCTOR, NOT A SOLOIST. (Rule #1 again.) The Lab
is your performance.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;DO NOT PAY TOO MUCH ATTENTION TO ‘RELEVANCE,’ ‘DELIVERABLES’ and other
concepts beloved of Senior Management.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;REMEMBER THAT CREATIVE PEOPLE ARE LIKE HEARTS – they go where they are
appreciated. They can be inspired or led, but not managed.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;KEEP THE ORGANISATION CHART SHALLOW. Never let the Lab grow beyond the point
where you cannot fit everyone comfortably in the same room.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;MAKE YOUR RESEARCHERS DEBATE WITH ONE ANOTHER REGULARLY. Let them tear one
another’s ideas to pieces. Ensure frank communication among them. Observe
the strengths and weaknesses which emerge in the process.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;BE NICE TO GRADUATE STUDENTS. One day they may keep you, even if only as a
mascot. (Moreover, they are a lot of fun!)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;INSTALL A WORLD-CLASS COFFEE MACHINE and provide plenty of free soft drinks.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;BUY AERON CHAIRS. Remember that most computer science research is done
sitting down.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;INSTITUTE A ‘TOY BUDGET’, enabling anyone in the Lab to buy anything costing
less than a specified amount on their own authority. And provide a darkened
recovery room for accountants shocked by the discovery of this budget.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;PAY ATTENTION TO WHAT GOES ON IN UNIVERSITIES. Every significant
breakthrough in computing in the last four decades has involved both the
university and corporate sectors at some point in its evolution.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;REMEMBER TO INITIATE AND SPONSOR CELEBRATIONS when merited.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;WHEN IN DOUBT, ASK YOURSELF: “WHAT WOULD ROGER NEEDHAM DO IN SIMILAR
CIRCUMSTANCES?”&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Evolving the Unikernel Revolution</title>
        <published>2016-11-10T00:00:00+00:00</published>
        <updated>2016-11-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/unikernel-revolution/"/>
        <id>https://mort.io/blog/unikernel-revolution/</id>
        
        <content type="html" xml:base="https://mort.io/blog/unikernel-revolution/">&lt;p&gt;I’ve had the pleasure of giving a couple of talks at some fun venues recently,
extolling both the virtues of &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;unikernel.org&#x2F;&quot;&gt;unikernels&lt;&#x2F;a&gt; and talking a bit about where we
currently see them as usefully being deployed.&lt;&#x2F;p&gt;
&lt;p&gt;Specifically, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;operability.io&#x2F;&quot;&gt;Operability.io 2016&lt;&#x2F;a&gt; a couple of weeks ago was enlightening
about some of the problems faced in operating production systems. Some great
audience questions and follow-ups after the talk, including some who were even
wondering when we’ll see unikernels as ready for the desktop! Of course, with
the release of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docker.com&#x2F;...&quot;&gt;Docker for Mac&lt;&#x2F;a&gt; and [Docker for Windows][dfw] products,
it’s arguable that we’ve beaten Linux to that accolade, as both products make
extensive use of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&quot;&gt;MirageOS&lt;&#x2F;a&gt; unikernel libraries. Having said that, I was
pleased to be told that the message about unikernels having a range of
deployment scenarios, and particularly partial deployments into micro-service
environments made sense to many who came to speak to me afterwards.&lt;&#x2F;p&gt;
&lt;p&gt;This was followed by a slightly expanded version of that talk earlier today at
the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devoxx.be&#x2F;&quot;&gt;Devox Belgium&lt;&#x2F;a&gt; conference. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;devoxx.be&#x2F;&quot;&gt;Devoxx&lt;&#x2F;a&gt; is primarily a Java community
so I was interested to see how the talk would go down given that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&quot;&gt;MirageOS&lt;&#x2F;a&gt; is
staunchly OCaml-centric, and the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;unikernel.org&#x2F;&quot;&gt;unikernels&lt;&#x2F;a&gt; movement in general is language
specific and (at least until now) somewhat weighted toward functional
programming, our good friends at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.includeos.org&#x2F;&quot;&gt;IncludeOS&lt;&#x2F;a&gt; notwithstanding. In the end it
seemed to go pretty well, based on what little I could see through the bright
lights– maybe one day I’ll get used to that when being videoed! Certainly some
good questions again, on the specific utility of unikernels to IoT, the
relationship between unikernels and Docker, and more besides.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, I hope anyone who came to either talk enjoyed it and found it
interesting. Happy to respond to comments or questions via email or
on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;mort___&quot;&gt;Twitter&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rat Racing Jetlag</title>
        <published>2016-11-04T00:00:00+00:00</published>
        <updated>2016-11-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/jetlag-fasting/"/>
        <id>https://mort.io/blog/jetlag-fasting/</id>
        
        <content type="html" xml:base="https://mort.io/blog/jetlag-fasting/">&lt;p&gt;As I’ve found myself repeating the same information several times recently, and
have to dig out the links in question every time, I figured it’d be useful to
write this down once so I can point at it.&lt;&#x2F;p&gt;
&lt;p&gt;Jetlag is a first-world problem but can be an annoying one– in recent years
I’ve found I have a particular problem getting up in the morning when flying
east. So, one day, bored in an airport in the US and with only the entire
Internet to hand, I thought I’d look around for an explanation at least.&lt;&#x2F;p&gt;
&lt;p&gt;I ended up coming across reports of some physiological research – in rats of
course – that suggested a way to avoid jetlag. I’ve since tried it over a dozen
times, and found it to work in all cases. At this point I no longer care if it’s
placebo affect or a genuine explanation or something else :)&lt;&#x2F;p&gt;
&lt;p&gt;The TL;DR is: fast for &amp;gt;16 hours before your time of arrival, then eat as
appropriate. Definitely &amp;gt;16 hours though – the occasions I’ve not quite managed
it (at least once I miscounted and managed only about 14 hours) it didn’t seem
to work as effectively.&lt;&#x2F;p&gt;
&lt;p&gt;As I interpret the information in the
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dx.doi.org&#x2F;10.1126&#x2F;science.1153277&quot;&gt;article&lt;&#x2F;a&gt;, found via
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;news.bbc.co.uk&#x2F;2&#x2F;hi&#x2F;health&#x2F;7414437.stm&quot;&gt;BBC&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;news.harvard.edu&#x2F;gazette&#x2F;story&#x2F;2008&#x2F;05&#x2F;study-identifies-food-related-clock-in-the-brain&#x2F;&quot;&gt;Harvard&lt;&#x2F;a&gt;
reports, through my “I can barely do computer science and certainly not biology”
brain, mammals have two body clocks, one driven by daylight and one by
metabolism. The daylight can’t be shifted quickly, but the metabolic one can be
made to float by fasting. The metabolic also being a lower level clock means
that, when you resync it by consuming calories, it syncs back to whatever light
conditions are current.&lt;&#x2F;p&gt;
&lt;p&gt;As I say, this isn’t my area of expertise – but it seems to work anyway.&lt;&#x2F;p&gt;
&lt;p&gt;Also, because a surprisingly large (or perhaps not) number of people also ask–
as far as I know and have experienced, fasting means &lt;strong&gt;no&lt;&#x2F;strong&gt; calories,
&lt;strong&gt;including alcohol&lt;&#x2F;strong&gt;, even it it’s free… :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Grubbing Around</title>
        <published>2016-09-13T00:00:00+00:00</published>
        <updated>2016-09-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/grubbing-around/"/>
        <id>https://mort.io/blog/grubbing-around/</id>
        
        <content type="html" xml:base="https://mort.io/blog/grubbing-around/">&lt;p&gt;Nothing earth-shattering here: I recently had the “pleasure” of setting up an
ARM64 server. After considerable support, several firmware upgrades, corruption
of the main HDD, reinstallation of CentOS7 (recommended, somewhat to my
surprise), all that remained was to get an up-to-date Linux built and installed
with 32 bit binary support. This took a bit of &lt;code&gt;make config&lt;&#x2F;code&gt; fiddling, but got
there after a few tries.&lt;&#x2F;p&gt;
&lt;p&gt;And then I had to relearn how &lt;code&gt;grub&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;grub2&lt;&#x2F;code&gt; works in this brave new (to me)
UEFI CentOS7 world. Herewith some brief commands I found useful while doing
so…&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; grep &amp;quot;^menu entry&amp;quot; &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;centos&#x2F;grub.cfg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #859900;&quot;&gt;     |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; tr&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; cut&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;quot;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #859900;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Edit &lt;code&gt;&#x2F;etc&#x2F;default&#x2F;grub&lt;&#x2F;code&gt; to set &lt;code&gt;GRUB_DEFAULT=N&lt;&#x2F;code&gt; for desired value of &lt;code&gt;N&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Temporarily set the default for the next reboot:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; grub2-reboot&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt; # based on output of above&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Regenerate the grub2 configuration:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; grub2-mkconfig&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -o&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &#x2F;boot&#x2F;efi&#x2F;EFI&#x2F;centos&#x2F;grub.cfg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Walking The Ridgeway</title>
        <published>2016-08-28T00:00:00+00:00</published>
        <updated>2016-08-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2016-the-ridgeway/"/>
        <id>https://mort.io/tracks/2016-the-ridgeway/</id>
        
        <summary type="html">&lt;p&gt;After roughly 35 years of my dad and I threatening to do so, following a rather
formative experience I had in the Scouts, my brother finally sorted us out with
a plan to walk &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nationaltrail.co.uk&#x2F;en_GB&#x2F;trails&#x2F;the-ridgeway&#x2F;&quot;&gt;The
Ridgeway&lt;&#x2F;a&gt;, popularly
known as “Britain’s oldest road”. It was a blast.</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Local Knowledge</title>
        <published>2016-03-11T00:00:00+00:00</published>
        <updated>2016-03-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/local-knowledge/"/>
        <id>https://mort.io/blog/local-knowledge/</id>
        
        <content type="html" xml:base="https://mort.io/blog/local-knowledge/">&lt;p&gt;A relatively long hiatus this time – blame the Cambridge housing market and the
need to simultaneously act both incredibly quickly and mind-numbingly slowly.
Also obtaining a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.christs.cam.ac.uk&#x2F;content&#x2F;dr-richard-mortier&quot;&gt;College
Fellowship&lt;&#x2F;a&gt; and
experiencing a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.docker.com&#x2F;2016&#x2F;01&#x2F;unikernel&#x2F;&quot;&gt;Company Acquisition&lt;&#x2F;a&gt;
were considerable (interesting, welcome) distractions… :)&lt;&#x2F;p&gt;
&lt;p&gt;As an interim measure, and because I’ve been asked relatively frequently over
the last few months, I thought I’d collect some local knowledge^Wopinion,
garnered over many long hard years of hanging about in both Cambridge and
Nottingham. What follows should be viewed as indicating nothing more than my
lack of imagination.&lt;&#x2F;p&gt;
&lt;p&gt;Both Cambridge and Nottingham are blessed with many fine pubs, as well as
several truly terrible ones. Less said about the latter the better. But among
those that I like, and will occasionally drag various people to (including the
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.cl.cam.ac.uk&#x2F;research&#x2F;srg&#x2F;&quot;&gt;SRG&lt;&#x2F;a&gt;) are, arranged roughly in
geographical order from the Computer Lab to the Station:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.theploughcoton.co.uk&#x2F;&quot;&gt;The Plough, Coton&lt;&#x2F;a&gt;. Gastro-pub-ish.
Frequently changed management over recent years, but currently seems pretty
consistent and (finally!) is not limited to Greene King beers.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;thecastleinncambridge.com&#x2F;&quot;&gt;The Castle Inn&lt;&#x2F;a&gt;. Major long-standing
Adnams “proper pub”. Very consistent. Castle Burger and chips please.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.taylor-walker.co.uk&#x2F;pub&#x2F;pickerel-cambridge&#x2F;c3602&#x2F;&quot;&gt;The Pickerel&lt;&#x2F;a&gt;.
Also largely unchanged in a couple of decades. Good for a pint before entering
the Greene King desert.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;whatpub.com&#x2F;pubs&#x2F;CAM&#x2F;184&#x2F;st-radegund-cambridge&quot;&gt;The Radegund&lt;&#x2F;a&gt;.
Tiniest pub I know of. Recently quite radically refurbished. But, while not
what it was, seems pretty decent nonetheless.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;whatpub.com&#x2F;pubs&#x2F;CAM&#x2F;79&#x2F;free-press-cambridge&quot;&gt;The Free Press&lt;&#x2F;a&gt;. Has
improved significantly while I was in Nottingham. Very good food and beer.
Stocks the only actually pleasant Greene King beer
(&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ratebeer.com&#x2F;beer&#x2F;greene-king-xx-mild&#x2F;14879&#x2F;&quot;&gt;XX Mild&lt;&#x2F;a&gt;), as well
as an interesting range of others. Quite small and often packed if it’s too
cold to sit outside.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.the-cambridgeblue.co.uk&#x2F;&quot;&gt;The Cambridge Blue&lt;&#x2F;a&gt;. Surely one of the
best pubs for many many miles. Excellent and huge range of beer (and,
apparently, cider; won’t touch the stuff myself). Good food. Large and with a
large garden too – rarely a problem finding somewhere to sit during the week.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.kingston-arms.co.uk&#x2F;&quot;&gt;The Kingston Arms&lt;&#x2F;a&gt;. Another excellent pub in
the station area. Possibly better food than the Blue, potentially slightly
less wide ranging set of beers (and, certainly, ciders). Also a nice garden,
though in all respects somewhat smaller than the Blue so prone to being
absolutely packed. Doesn’t serve lager – a certain German colleague makes do
with JHB though.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;whatpub.com&#x2F;pubs&#x2F;CAM&#x2F;118&#x2F;live-let-live-cambridge&quot;&gt;The Live and Let Live&lt;&#x2F;a&gt;.
Yet one more excellent and, though small, often less busy pub near the
station. No food in the evenings.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.individualpubs.co.uk&#x2F;devonshire&#x2F;&quot;&gt;The Devonshire Arms&lt;&#x2F;a&gt;. Largest
range of Milton Brewery beers I know of. Food = pizzas I believe (though not,
last time I tried, as good as those at
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.carpentersarmscambridge.co.uk&#x2F;&quot;&gt;The Carpenters Arms&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I don’t get out to the villages as often as I’d like now, but &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.thegreenmangrantchester.co.uk&#x2F;#the-green-man-grantchester&quot;&gt;The Green Man,
Grantchester&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.bluelionhardwick.co.uk&#x2F;&quot;&gt;The Blue Lion, Hardwick&lt;&#x2F;a&gt; and especially
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;theredlionhiston.co.uk&#x2F;&quot;&gt;The Red Lion, Histon&lt;&#x2F;a&gt; are (or were last time I
went) all excellent too. The latter is still possibly my favourite pub anywhere
in fact.&lt;&#x2F;p&gt;
&lt;p&gt;I only spent a few years in Nottingham, and it’s a Proper City unlike Cambridge,
so I can’t claim to have tested it thoroughly. However, places I did visit
fairly regularly in Nottingham, Beeston, and Wollaton that I certainly enjoyed
include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.theroundhousenottingham.co.uk&#x2F;&quot;&gt;The Roundhouse&lt;&#x2F;a&gt;. A little pricey
for Nottingham, but good quality beer and food, nice atmosphere.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.castlerockbrewery.co.uk&#x2F;pubs&#x2F;lincolnshire-poacher&#x2F;&quot;&gt;The Lincolnshire Poacher&lt;&#x2F;a&gt;.
Very excellent pub. Good whisky range too.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.fellowsmortonandclayton.co.uk&#x2F;&quot;&gt;Fellows, Morton &amp;amp; Clayton&lt;&#x2F;a&gt;.
Consistently good, proper pub food, about 4 minutes walk from the station
platforms.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.castlerockbrewery.co.uk&#x2F;pubs&#x2F;vat-and-fiddle&#x2F;&quot;&gt;The Vat &amp;amp; Fiddle&lt;&#x2F;a&gt;.
Only finally tried more recently. Castle Rock brewery tap. Good food and beer,
also about 4 minutes walk from your station platform.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.thehandandheart.co.uk&#x2F;&quot;&gt;The Hand &amp;amp; Heart&lt;&#x2F;a&gt;. In a cave! It’s a pub
in a cave! With excellent beer and good food! And not owned by Greene King!
(Unlike &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;triptojerusalem.com&#x2F;&quot;&gt;Ye Olde Trip to Jerusalem&lt;&#x2F;a&gt; which has
bigger, better caves but markedly less good beer or food.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.bluemonkeybrewery.com&#x2F;pubs&#x2F;organ-grinder-nottingham&quot;&gt;The Organ Grinder&lt;&#x2F;a&gt;.
Another fine pub at Canning Circus. Blue Monkey brewery this time – rather
good. Food limited to (nice!) pork pies and such, but the beer is good.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.nottinghambrewery.co.uk&#x2F;the_plough_inn.html&quot;&gt;The Plough Inn&lt;&#x2F;a&gt;.
Closest (decent) pub to Jubilee Campus. Nottingham City brewery tap. Excellent
beer, no food in the evenings, and prices that make me think I’m 15 years
younger…&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.victoriabeeston.co.uk&#x2F;&quot;&gt;The Victoria Hotel, Beeston&lt;&#x2F;a&gt;. Consistently
excellent pub. Excellent beer, very good food.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.everards.co.uk&#x2F;our-pubs&#x2F;crown-inn-beeston&#x2F;&quot;&gt;The Crown Inn, Beeston&lt;&#x2F;a&gt;.
Also consistently excellent beer, though no food in the evenings.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.molefacepubcompany.co.uk&#x2F;the-wollaton-pub-and-kitchen.html&quot;&gt;The Wollaton Pub and Kitchen, Wollaton&lt;&#x2F;a&gt;.
Gastro-pub-ish. Generally good beer, often excellent but occasionally
patchy food.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So there you go. Some opinions if relatively little knowledge. YMMV. Etc.&lt;&#x2F;p&gt;
&lt;p&gt;(PS. If I know you, I’ll also be happy to give recommendations of solicitors,
builders and other house-associated professionals too. And a couple of
warnings.)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Of Mice and Keyboards</title>
        <published>2015-11-21T00:00:00+00:00</published>
        <updated>2015-11-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/elcapitan-maps/"/>
        <id>https://mort.io/blog/elcapitan-maps/</id>
        
        <content type="html" xml:base="https://mort.io/blog/elcapitan-maps/">&lt;p&gt;A bit of a delay since the last post – lots going on! But anyway: I
(relatively) recently upgraded my old skool Macbook Pro (look! built-in Ethernet
port! DVD drive!) to El Capitan. This was generally rather less faff that the
previous upgrade, though it did seem to take rather more reboots than might have
been assumed to be &lt;em&gt;strictly&lt;&#x2F;em&gt; necessary before it settled down, and I’d
remembered to fix up permissions for Homebrew with &lt;code&gt;sudo chown -R $(whoami):admin &#x2F;usr&#x2F;local&lt;&#x2F;code&gt;. So that was ok.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;elcapitan-maps&#x2F;keyboard-small.png&quot; alt=&quot;Macbook Pro UK Keyboard&quot; title=&quot;Macbook Pro
UK Keyboard&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Except… I have a slightly odd keyboard and mouse setup. It’s a UK Macbook
which means a slightly tweaked keyboard layout compared to the standard US
Macbook keyboard. At my desk, I also use a &lt;em&gt;Microsoft Digital Media Keyboard&lt;&#x2F;em&gt; –
nice action (for me!) plus some handy shortcut keys – and a &lt;em&gt;Microsoft 5-Button
Mouse with IntelliEye&lt;&#x2F;em&gt;. Now, until El Capitan I’d happily been using the
Microsoft provided software to make use of the extra mouse buttons and shortcut
keys, coupled with a
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;scripts.sil.org&#x2F;cms&#x2F;scripts&#x2F;page.php?site_id=nrsi&amp;amp;id=ukelele&quot;&gt;Ukelele-generated&lt;&#x2F;a&gt;
keymap to handle the oddities of the UK laptop keyboard (like, who in the world
really needs &lt;code&gt;§&lt;&#x2F;code&gt; at the top-left key, below &lt;code&gt;escape&lt;&#x2F;code&gt; rather than &lt;code&gt;`&lt;&#x2F;code&gt;; and
doesn’t need an easily accessible &lt;code&gt;#&lt;&#x2F;code&gt;?).&lt;&#x2F;p&gt;
&lt;p&gt;This had never been entirely satisfactory – I had to have a standard keymap
installed in addition to my modified one, and some apps (all of Microsoft
Office, I’m looking at you) liked to intermittently flip the keymap away from my
keymap to the standard issue on, including undoing my remapping of &lt;code&gt;caps lock&lt;&#x2F;code&gt;
to &lt;code&gt;ctrl&lt;&#x2F;code&gt;. This was annoying, but having it completely break was intolerable.&lt;&#x2F;p&gt;
&lt;p&gt;So I went hunting for alternatives and am now very happy with
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;osx&#x2F;karabiner&#x2F;&quot;&gt;Karabiner.app&lt;&#x2F;a&gt; for standard keyboard remappings, and fairly happy
with &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.usboverdrive.com&quot;&gt;USB Overdrive&lt;&#x2F;a&gt; to handle the mouse and the
special Microsoft Digital Media Keyboard shortcut keys.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;usb-overdrive&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#usb-overdrive&quot; aria-label=&quot;Anchor link for: usb-overdrive&quot;&gt;USB Overdrive&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;USB Overdrive seems to do the mouse mappings correctly, having detected the
device as a “Microsoft 5-Button Mouse with IntelliEye(tm), Any Application” –
&lt;code&gt;Button 4&lt;&#x2F;code&gt; and &lt;code&gt;Button 5&lt;&#x2F;code&gt; can be remapped to &lt;code&gt;forward&lt;&#x2F;code&gt; and &lt;code&gt;back&lt;&#x2F;code&gt;, just as I
like it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;mort.io&#x2F;blog&#x2F;elcapitan-maps&#x2F;usboverdrive.png&quot; alt=&quot;USB Overdrive&quot; title=&quot;USB Overdrive Configuration&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It also allows me to repurpose some of the extra keys on my Microsoft keyboard
that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;osx&#x2F;karabiner&#x2F;&quot;&gt;Karabiner&lt;&#x2F;a&gt; doesn’t seem able to see– so I get one touch play&#x2F;pause of
iTunes and other such delights.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;karabiner-app&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#karabiner-app&quot; aria-label=&quot;Anchor link for: karabiner-app&quot;&gt;Karabiner.app&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;osx&#x2F;karabiner&#x2F;&quot;&gt;Karabiner&lt;&#x2F;a&gt; took a bit more setting up but does a very nice job. I needed to
remap certain keys differently on the two different keyboards to make both
consistent and to fix some of the weirder (to my mind!) decisions both Microsoft
and (particualrly) Apple have taken with their layouts. The result is an
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;blob&#x2F;master&#x2F;karabiner.xml&quot;&gt;XML configuration file&lt;&#x2F;a&gt;, symlinked by &lt;code&gt;~&#x2F;Library&#x2F;Application Support&#x2F;Karabiner&#x2F;private.xml&lt;&#x2F;code&gt;. This applies two keymaps based on the detected
device, using product ID codes determined by the &lt;code&gt;EventViewer&lt;&#x2F;code&gt; app that comes
with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;osx&#x2F;karabiner&#x2F;&quot;&gt;Karabiner&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;deviceproductdef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;MACBOOK_PRO_UK_KEYBOARD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;0x0253&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;deviceproductdef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;deviceproductdef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;DIGITAL_MEDIA_KEYBOARD&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;0x00b4&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;deviceproductdef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;deviceproductdef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;FIVE_BUTTON_MOUSE_WITH_INTELLIEYE&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productname&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;0x0039&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;productid&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;deviceproductdef&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There are then two  &lt;code&gt;&amp;lt;item&amp;gt;&amp;lt;&#x2F;item&amp;gt;&lt;&#x2F;code&gt; stanzas that configure the two different
keyboards, e.g.,&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Keyboard mappings for Microsoft keyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;identifier&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;private.io.mort.microsoft_keyboard&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;identifier&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;device_only&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    DeviceVendor::MICROSOFT,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    DeviceProduct::DIGITAL_MEDIA_KEYBOARD&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;device&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Each of these contains a number of &lt;code&gt;&amp;lt;autogen&amp;gt;&amp;lt;&#x2F;autogen&amp;gt;&lt;&#x2F;code&gt; stanza mapping specific
keycodes for that keymap. For example, I want the top-left key on the main block
to be &lt;code&gt;`&lt;&#x2F;code&gt; and, when shifted, to be &lt;code&gt;€&lt;&#x2F;code&gt;. This leads to the following on the
Microsoft keyboard:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;&amp;lt;!-- shift-` to € --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::BACKQUOTE, ModifierFlag::SHIFT_L | ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::KEY_2, ModifierFlag::OPTION_R | ModifierFlag::SHIFT_R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::BACKQUOTE, ModifierFlag::SHIFT_R | ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::KEY_2, ModifierFlag::OPTION_R | ModifierFlag::SHIFT_R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…but to the following on the Macbook built-in UK keyboard, to take account
first of the different keycode it generates but also to ensure that when used
with command and command-shift, the standard behaviour of cycling between
windows works:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;&amp;lt;!-- top-left § to ` --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::DANISH_DOLLAR, ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::BACKQUOTE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;&amp;lt;!-- ...with shift, to € --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::DANISH_DOLLAR, ModifierFlag::SHIFT_L | ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::KEY_2, ModifierFlag::OPTION_R | ModifierFlag::SHIFT_R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::DANISH_DOLLAR, ModifierFlag::SHIFT_R | ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::KEY_2, ModifierFlag::OPTION_R | ModifierFlag::SHIFT_R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;&amp;lt;!-- ...with COMMAND&#x2F;SHIFT, so that cycle-window-{forward,back} work --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::DANISH_DOLLAR, ModifierFlag::COMMAND_L | ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::BACKQUOTE, ModifierFlag::COMMAND_R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  __KeyToKey__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::DANISH_DOLLAR, ModifierFlag::COMMAND_L | ModifierFlag::SHIFT_L | ModifierFlag::NONE,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  KeyCode::BACKQUOTE, ModifierFlag::COMMAND_R | ModifierFlag::SHIFT_R&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There are a number of other mappings made in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;blob&#x2F;master&#x2F;karabiner.xml&quot;&gt;karabiner.xml&lt;&#x2F;a&gt;: &lt;code&gt;shift-&#x27;&lt;&#x2F;code&gt; is
&lt;code&gt;@&lt;&#x2F;code&gt;, &lt;code&gt;shift-2&lt;&#x2F;code&gt; is &lt;code&gt;&quot;&lt;&#x2F;code&gt;, &lt;code&gt;shift-3&lt;&#x2F;code&gt; is &lt;code&gt;£&lt;&#x2F;code&gt;, and resolving general confusion among
&lt;code&gt;#&lt;&#x2F;code&gt;, &lt;code&gt;\&lt;&#x2F;code&gt;, &lt;code&gt;~&lt;&#x2F;code&gt;, and &lt;code&gt;|&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;emacs&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#emacs&quot; aria-label=&quot;Anchor link for: emacs&quot;&gt;Emacs&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;That fixed things for the terminal and for most apps – the only remaining
sticking point was Emacs. I don’t pretend to understand the entire chain of
event processing but suffice it to say that Emacs was receiving &lt;code&gt;shift-@&lt;&#x2F;code&gt; and
&lt;code&gt;shift-3&lt;&#x2F;code&gt; without knowing what to do with them. Fortunately, when coupled with
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;blob&#x2F;master&#x2F;emacs.d&#x2F;init.el#L929-L1019&quot;&gt;my hacks to enforce a &lt;code&gt;my-keys-minor-mode&lt;&#x2F;code&gt; to override everything&lt;&#x2F;a&gt;,
the fix was pretty straightforward:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(define-key my-keys-minor-mode-map (kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;s-@&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;€&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(define-key my-keys-minor-mode-map (kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;s-3&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;lambda&lt;&#x2F;span&gt;&lt;span&gt; () (interactive) (insert-char &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;#x00A3&lt;&#x2F;span&gt;&lt;span&gt;))) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;; £&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;result&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#result&quot; aria-label=&quot;Anchor link for: result&quot;&gt;Result?&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;A &lt;strong&gt;significant&lt;&#x2F;strong&gt; decrease in the need I feel to curse because my keyboard has
changed in the middle of typing! It seems that keyboards remain, like time and
terminals, one of those &lt;em&gt;Really Hard&lt;&#x2F;em&gt; things for computers&#x2F;manufacturers to
handle…&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Note: Thanks to &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.amp-what.com&#x2F;unicode&#x2F;search&#x2F;&quot;&gt;http:&#x2F;&#x2F;www.amp-what.com&#x2F;unicode&#x2F;search&#x2F;&lt;&#x2F;a&gt; for an easy way to
hunt down some of the unicode symbols used above!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Fame and Fortune!</title>
        <published>2015-06-24T00:00:00+00:00</published>
        <updated>2015-06-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/bigtechday-mirage/"/>
        <id>https://mort.io/blog/bigtechday-mirage/</id>
        
        <content type="html" xml:base="https://mort.io/blog/bigtechday-mirage/">&lt;p&gt;After a slew of HDI related items, a quick &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;openmirage.org&#x2F;&quot;&gt;MirageOS&lt;&#x2F;a&gt; note. I was invited to
give a presentation on MirageOS at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tngtech.com&#x2F;en.html&quot;&gt;TNG&lt;&#x2F;a&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.tngtech.com&#x2F;en&#x2F;big-techday.html&quot;&gt;Big TechDay 8&lt;&#x2F;a&gt; conference. This
was an interesting, and very broad based, event. It brought together about 500
people with about 25 speakers over one day, on topics from cognitive science to
AI to chess playing algorithms to obviating testing through proof reasoning.
And, of course, operating systems and &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;openmirage.org&#x2F;&quot;&gt;MirageOS&lt;&#x2F;a&gt;! If you’re interested, the
slides used are available at
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;decks.openmirage.org&#x2F;bigtechday8&quot;&gt;decks.openmirage.org&lt;&#x2F;a&gt; in the usual
way, and if you really want to hear me droning on, TNG are making the video
(with synchronised slides)
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.techcast.com&#x2F;events&#x2F;bigtechday8&#x2F;salvator-1130&#x2F;?q=salvator-1130&quot;&gt;available&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As ever, comments welcome!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Actual HCI Papers!</title>
        <published>2015-06-17T00:00:00+00:00</published>
        <updated>2015-06-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/ecscw-and-aarhus/"/>
        <id>https://mort.io/blog/ecscw-and-aarhus/</id>
        
        <content type="html" xml:base="https://mort.io/blog/ecscw-and-aarhus/">&lt;p&gt;I have to confess to being quite pleased to having a couple of
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;hdiresearch.org&#x2F;&quot;&gt;HDI&lt;&#x2F;a&gt;-related papers accepted recently (even if we
can’t even get proper reviews on the
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;ssrn.com&#x2F;abstract=2508051&quot;&gt;original HDI paper&lt;&#x2F;a&gt; – recently judged
out-of-scope for the third time, even though the Special Issue in question
seemed bang on target!).&lt;&#x2F;p&gt;
&lt;p&gt;The first is a full paper to &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ecscw2015.no&#x2F;&quot;&gt;ECSCW’15&lt;&#x2F;a&gt; titled
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mor1.github.io&#x2F;publications&#x2F;pdf&#x2F;ecscw15-hdi.pdf&quot;&gt;&lt;em&gt;Human Data Interaction: Historical Lessons from Social Studies and CSCW&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;.
A collaboration with &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.andy-crabtree.com&#x2F;&quot;&gt;Dr Andy Crabtree&lt;&#x2F;a&gt;, it
examines particularly the role of &lt;em&gt;interaction&lt;&#x2F;em&gt; in HDI and explores how past
technical approaches, such as
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mor1.github.io&#x2F;publications&#x2F;pdf&#x2F;comsnets11-dataware.pdf&quot;&gt;Dataware&lt;&#x2F;a&gt;, to
the challenges posed by HDI haven’t fully considered the inherently social
nature of data.&lt;&#x2F;p&gt;
&lt;p&gt;The second is a short paper to the decennial – seriously: every ten years! –
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;aarhus2015.org&quot;&gt;Aarhus 2015&lt;&#x2F;a&gt; conference titled
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mor1.github.io&#x2F;publications&#x2F;pdf&#x2F;aarhus15-databox.pdf&quot;&gt;&lt;em&gt;Personal Data: Thinking Inside the Box&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;.
This sets out a vision for an embodiment of a &lt;em&gt;Databox&lt;&#x2F;em&gt;: a physical device
supported by online services that empowers us to take back control of our online
lives. Building a Databox, using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mirage.io&#x2F;&quot;&gt;MirageOS&lt;&#x2F;a&gt;, is hopefully
going to be a key activity for me in the coming months…&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rescuing a Shattered Nexus 4</title>
        <published>2015-05-21T00:00:00+00:00</published>
        <updated>2015-05-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/nexus-4-rescue/"/>
        <id>https://mort.io/blog/nexus-4-rescue/</id>
        
        <content type="html" xml:base="https://mort.io/blog/nexus-4-rescue/">&lt;p&gt;A little while ago, before I’d done the smart thing and got myself a case for my
Nexus 4, I dropped it a couple of inches onto a hard surface at the wrong angle.
The screen promptly shattered – and this was bad because without the touch
screen, I couldn’t interact with it, I had some photos on it from son#1 birthday
party that hadn’t been copied off, and I hadn’t got round to enabling USB access
to the filesystem or any of the debug&#x2F;developer options.&lt;&#x2F;p&gt;
&lt;p&gt;So what to do? I &lt;em&gt;really&lt;&#x2F;em&gt; didn’t want to lose those photos. A couple of hours
searching the Interwebs and a little bit of experimentation later, and I managed
it. Basically, download and apply the clockwork mod bootloader, and this turns
on the developer options that allow access to the filesystem via the Android SDK
tools. To find out the details, read on…&lt;&#x2F;p&gt;
&lt;p&gt;First, download the recovery image:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; wget http:&#x2F;&#x2F;download2.clockworkmod.com&#x2F;recoveries&#x2F;recovery-clockwork-touch-6.0.3.1-mako.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Next, install the Android SDK – I’m on OSX using [Homebrew][] so I do:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; brew install android-sdk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, power off and disconnect the phone! Then boot it into fastboot mode by
holding down &lt;code&gt;power&lt;&#x2F;code&gt; and &lt;code&gt;volume-down&lt;&#x2F;code&gt;. Once it boots you should be in the
fastboot list – the volume keys will cycle you through the list. You should now
also be able to see the device once connected to USB, and you can then OEM
unlock it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo fastboot devices&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -l&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;04f02d4bdcd3b6e2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;       fastboot usb:FD123000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo fastboot oem unlock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;OKAY&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; 17.937s]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;finished.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; total time: 17.937s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Having unlocked it, you can now install the clockwork recovery bootloader you
downloaded (assuming it’s in the local directory):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; sudo fastboot flash recovery recovery-clockwork-touch-6.0.3.1-mako.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sending&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;recovery&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; (7560&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; KB&lt;&#x2F;span&gt;&lt;span&gt;)...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;OKAY&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  0.526s]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;writing&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; &amp;#39;recovery&amp;#39;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;OKAY&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  0.448s]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;finished.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; total time: 0.975s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When you now use the volume keys to cycle through the list, you should now see
&lt;strong&gt;recovery mode&lt;&#x2F;strong&gt; as an option – select it, and you should be able to see the
device listed in the usual way via &lt;code&gt;adb&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; mort@greyjay:phone&lt;&#x2F;span&gt;&lt;span&gt;$;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; adb devices&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -l&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;List&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; of devices attached&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;04f02d4bdcd3b6e2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;       recovery usb:FD123000 product:occam model:Nexus_4 device:mako&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, pull all the contents off the sdcard:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; adb pull &#x2F;sdcard&#x2F;0 .&#x2F;sdcard&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; adb pull &#x2F;data&#x2F; .&#x2F;data&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; adb pull &#x2F;system&#x2F; .&#x2F;system&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…and that’s it – you should now have a local copy of everything off the
phone, and you can send it away for repair (or whatever you feel like
otherwise), possibly while sobbing quietly.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Moving Onto Mirage</title>
        <published>2015-05-20T00:00:00+00:00</published>
        <updated>2015-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/moving-onto-mirage/"/>
        <id>https://mort.io/blog/moving-onto-mirage/</id>
        
        <content type="html" xml:base="https://mort.io/blog/moving-onto-mirage/">&lt;p&gt;For a little while I’ve had &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;mor1.github.io&quot;&gt;this site&lt;&#x2F;a&gt; running as a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;openmirage.org&#x2F;&quot;&gt;MirageOS&lt;&#x2F;a&gt;
unikernel, shadowing the main site hosted on &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;github.com&#x2F;&quot;&gt;GitHub&lt;&#x2F;a&gt;. I’ve finally decided to
make the switch, as part of moving over to take advantage of Mirage’s DNS and
TLS libraries.&lt;&#x2F;p&gt;
&lt;p&gt;Following the usual pattern, as previously explained by &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;amirchaudhry.com&#x2F;from-jekyll-to-unikernel-in-fifty-lines&#x2F;&quot;&gt;Amir&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.somerandomidiot.com&#x2F;blog&#x2F;2014&#x2F;08&#x2F;19&#x2F;i-am-unikernel&#x2F;&quot;&gt;Mindy&lt;&#x2F;a&gt; and
others, the process is:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Construct a static &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jekyllrb.com&quot;&gt;Jekyll&lt;&#x2F;a&gt; site.&lt;&#x2F;li&gt;
&lt;li&gt;Write a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;travis-ci.com&#x2F;&quot;&gt;Travis&lt;&#x2F;a&gt; YAML file to cause &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;travis-ci.com&#x2F;&quot;&gt;Travis&lt;&#x2F;a&gt; to build the unikernel image
and commit it back to the deployment repository.&lt;&#x2F;li&gt;
&lt;li&gt;Write a Git &lt;code&gt;post-merge&lt;&#x2F;code&gt; hook for the deployment repository, so that the
latest unikernel is automatically booted when a merge is detected, i.e., there
is a new unikernel image.&lt;&#x2F;li&gt;
&lt;li&gt;Write a &lt;code&gt;cron&lt;&#x2F;code&gt; job that periodically polls the deployment repository, pulling
any changes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Building a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jekyllrb.com&quot;&gt;Jekyll&lt;&#x2F;a&gt; site is well-documented – I did find that I had to tweak
my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;mor1.github.io&#x2F;blob&#x2F;master&#x2F;_config.yml&quot;&gt;&lt;code&gt;_config.yml&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; so as to make sure my local toolchain matched the
one used by Github, ensuring consistency between versions of the site. For
convenience:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;make&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; site&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;bringing-up-the-network&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#bringing-up-the-network&quot; aria-label=&quot;Anchor link for: bringing-up-the-network&quot;&gt;Bringing up the network&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;mor1.github.io&#x2F;blob&#x2F;master&#x2F;.travis.yml&quot;&gt;&lt;code&gt;.travis.yml&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; file then specifies the three main targets for
the CI test build to carry out: Unix with a standard sockets backed
(&lt;code&gt;MIRAGE_BACKEND=unix&lt;&#x2F;code&gt;, &lt;code&gt;MIRAGE_NET=socket&lt;&#x2F;code&gt;) and with the Mirage network stack
(&lt;code&gt;MIRAGE_BACKEND=unix&lt;&#x2F;code&gt;, &lt;code&gt;MIRAGE_NET=direct&lt;&#x2F;code&gt;), and with the Xen backend
(&lt;code&gt;MIRAGE_BACKEND=xen&lt;&#x2F;code&gt;). For the latter case, we must also specify the static IP
configuration to be used (&lt;code&gt;MIRAGE_ADDR&lt;&#x2F;code&gt;, &lt;code&gt;..._GWS&lt;&#x2F;code&gt;, and &lt;code&gt;..._MASK&lt;&#x2F;code&gt;). The
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;mor1.github.io&#x2F;blob&#x2F;master&#x2F;.travis.sh&quot;&gt;&lt;code&gt;.travis.sh&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; script then calls the standard skeleton
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocaml&#x2F;ocaml-travisci-skeleton&#x2F;blob&#x2F;master&#x2F;.travis-mirage.sh&quot;&gt;&lt;code&gt;.travis-mirage.sh&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; script after first building the site
content using Jekyll.&lt;&#x2F;p&gt;
&lt;p&gt;This tests the three basic combinations of network backend for a Mirage
appliance:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; make configure.socket build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UNIX&#x2F;socket&lt;&#x2F;strong&gt; requires no configuration. The network device is configured
with the loopback address, &lt;code&gt;127.0.0.1&lt;&#x2F;code&gt;. Appliances can be run without
requiring &lt;code&gt;root&lt;&#x2F;code&gt; privileges, assuming they only bind to non-privileged ports.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; make configure.direct build&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UNIX&#x2F;direct&#x2F;dhcp&lt;&#x2F;strong&gt; requires no configuration if a DHCP server is running and
can respond. The appliance must be run with &lt;code&gt;root&lt;&#x2F;code&gt; privileges to use the new
network bridging capability of OSX 10.10, whereupon the DHCP client in the
appliance follows the usual protocol.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; make configure.xen build&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;  ADDR=&amp;quot;46.43.42.137&amp;quot; GWS=&amp;quot;46.43.42.129&amp;quot; MASK=&amp;quot;255.255.255.128&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xen&lt;&#x2F;strong&gt; uses the Mirage network stack and expects static configuration of the
network device.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;using-travis-ci&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#using-travis-ci&quot; aria-label=&quot;Anchor link for: using-travis-ci&quot;&gt;Using Travis CI&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Of course, all that is for local development – for the live site, this is
actually all wrapped up using &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;travis-ci.com&#x2F;&quot;&gt;Travis CI&lt;&#x2F;a&gt;. Due to a small pull request
waiting on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocaml&#x2F;ocaml-travisci-skeleton&quot;&gt;OCaml Travis CI skeleton scripts&lt;&#x2F;a&gt; and a few
Mirage releases currently being readied, this looks a little more complex than
it needs to (the &lt;code&gt;FORK_USER&lt;&#x2F;code&gt; and &lt;code&gt;DEV_REMOTE&lt;&#x2F;code&gt; variables shouldn’t need to be
specified in the long run) but anyway:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;language&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;script&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; bash -ex .travis.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;env&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;  matrix&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; FORK_USER=mor1 DEV_REMOTE=git:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    OCAML_VERSION=4.02 MIRAGE_BACKEND=unix MIRAGE_NET=socket&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; FORK_USER=mor1 DEV_REMOTE=git:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    OCAML_VERSION=4.02 MIRAGE_BACKEND=unix MIRAGE_NET=direct&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; FORK_USER=mor1 DEV_REMOTE=git:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-dev&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    UPDATE_GCC_BINUTILS=1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    OCAML_VERSION=4.02 MIRAGE_BACKEND=xen&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    MIRAGE_ADDR=&amp;quot;46.43.42.137&amp;quot; MIRAGE_GWS=&amp;quot;46.43.42.129&amp;quot; MIRAGE_MASK=&amp;quot;255.255.255.128&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;    XENIMG=mortio MIRDIR=_mirage DEPLOY=1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This uses the local &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;mor1.github.io&#x2F;blob&#x2F;master&#x2F;.travis.sh&quot;&gt;&lt;code&gt;.travis-sh&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; script to build the three versions
of the site, using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-dev&quot;&gt;Mirage development OPAM repository&lt;&#x2F;a&gt; so as to
pick up the latest versions of all the various packages, and updating the Travis
&lt;code&gt;gcc&lt;&#x2F;code&gt; and &lt;code&gt;binutils&lt;&#x2F;code&gt; to ensure the stubs for a couple of packages (notably
&lt;code&gt;mirage-entropy-xen&lt;&#x2F;code&gt;) build.&lt;&#x2F;p&gt;
&lt;p&gt;Next stop: adding TLS and DNS support…&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Diamonds are a Chap&#x27;s Best Friend</title>
        <published>2015-04-09T00:00:00+00:00</published>
        <updated>2015-04-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/inconstant-ruby/"/>
        <id>https://mort.io/blog/inconstant-ruby/</id>
        
        <content type="html" xml:base="https://mort.io/blog/inconstant-ruby/">&lt;p&gt;As &lt;a href=&quot;&#x2F;blog&#x2F;2015&#x2F;01&#x2F;15&#x2F;begin-again&#x2F;&quot;&gt;noted previously&lt;&#x2F;a&gt;, this site is basically a
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;&quot;&gt;Github&lt;&#x2F;a&gt;-hosted &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; site at present, though one that can be built as a
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;openmirage.org&#x2F;&quot;&gt;Mirage&lt;&#x2F;a&gt; unikernel. Part of the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;openmirage.org&#x2F;&quot;&gt;Mirage&lt;&#x2F;a&gt; workflow to publish a new post
involves using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;&quot;&gt;Travis CI&lt;&#x2F;a&gt; to build and then commit back a new unikernel
image. Thus it is currently necessary to run &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;&quot;&gt;Travis&lt;&#x2F;a&gt; build
scripts, and the dynamism of the Ruby environment meant that this broke (again)
recently as one of the &lt;code&gt;github-pages&lt;&#x2F;code&gt; gem’s dependencies now depends on &lt;code&gt;Ruby &amp;gt;= 2.0&lt;&#x2F;code&gt; while the default Rubies on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;&quot;&gt;Travis&lt;&#x2F;a&gt; Ubuntu image for &lt;code&gt;C&lt;&#x2F;code&gt; language
builds is &lt;code&gt;1.8&lt;&#x2F;code&gt; (via Ubuntu packaging) or, if you remove that one, &lt;code&gt;1.9&lt;&#x2F;code&gt; (via
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rvm.io&#x2F;&quot;&gt;rvm&lt;&#x2F;a&gt;). Read on to find out how to fix this…&lt;&#x2F;p&gt;
&lt;p&gt;The fix that currently works for me turns out to be relatively simple: remove
all the rubies installed as Ubuntu packages, and then invoke &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rvm.io&#x2F;&quot;&gt;rvm&lt;&#x2F;a&gt; to set the
default ruby to something reasonable – in this case, 2.1.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;## remove old ubuntu rubies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; remove ruby ruby1.8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; autoremove&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;## use rvm and a modern-ish ruby&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ~&#x2F;.rvm&#x2F;scripts&#x2F;rvm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;rvm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; use&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt; 2.1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;## check that all worked...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;which&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; ruby&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;ruby&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;## install jekyll and github-pages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;gem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install jekyll&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;gem&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt; install github-pages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; --no-rdoc --no-ri&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;jekyll&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt; -v&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that’s all there is to it – you should now be able to call &lt;code&gt;jekyll&lt;&#x2F;code&gt; in your
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;&quot;&gt;Travis&lt;&#x2F;a&gt; environment as you’d expect…&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Taking it to the People People</title>
        <published>2015-04-08T00:00:00+00:00</published>
        <updated>2015-04-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/hdi-seminar/"/>
        <id>https://mort.io/blog/hdi-seminar/</id>
        
        <content type="html" xml:base="https://mort.io/blog/hdi-seminar/">&lt;p&gt;Looks like I get a chance to run my mouth off again :) Upcoming
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;hdiresearch.org&#x2F;&quot;&gt;HDI&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.crassh.cam.ac.uk&#x2F;events&#x2F;26198&quot;&gt;research
seminar&lt;&#x2F;a&gt;, organised by &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.bigdata.cam.ac.uk&#x2F;&quot;&gt;Cambridge Big
Data&lt;&#x2F;a&gt;&#x2F;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.digitalhumanities.cam.ac.uk&#x2F;&quot;&gt;Digital
Humanities&lt;&#x2F;a&gt;. In short, details are:
&lt;strong&gt;20th April 2015, 14:00–16:00&lt;&#x2F;strong&gt; in &lt;strong&gt;S1, Alison Richard Building, West Road,
Cambridge&lt;&#x2F;strong&gt;. If you’d like to attend, please do register at
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.eventbrite.co.uk&#x2F;e&#x2F;human-data-interaction-cambridge-big-datadigital-humanities-seminar-tickets-16337148852&quot;&gt;http:&#x2F;&#x2F;www.eventbrite.co.uk&#x2F;e&#x2F;human-data-interaction-cambridge-big-datadigital-humanities-seminar-tickets-16337148852&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;And just because pixels are, in some loose sense, nearly free, here’s the
abstract from the seminar link above:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The increasing generation and collection of personal data has created a
complex ecosystem, often collaborative but sometimes combative, around
companies and individuals engaging in the use of these data. We propose that
the interactions between these agents warrant a new topic of study: Human-Data
Interaction (HDI), that sits at the intersection of various disciplines,
including computer science, statistics, sociology, psychology and behavioural
economics._&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In this brief presentation I will pose some of the challenges that HDI raises,
organised into three core themes of legibility, agency and negotiability. I
will also outline some of the technical work we are currently undertaking that
attempts to address some of the underlying platform problems. My hope is to
elicit discussion of both the HDI framework and the technical solutions we are
pursuing, as well as to engage in a broader conversation about the ways we
should approach the personal data ecosystem with other interested parties._&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>I Think Someone Else Is Also Following Me...</title>
        <published>2015-03-16T00:00:00+00:00</published>
        <updated>2015-03-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/being-followed-postscript/"/>
        <id>https://mort.io/blog/being-followed-postscript/</id>
        
        <content type="html" xml:base="https://mort.io/blog/being-followed-postscript/">&lt;p&gt;Turns out others were listening too – notably the USA’s &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.darpa.mil&#x2F;&quot;&gt;DARPA&lt;&#x2F;a&gt;. The recent
announcement of the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.darpa.mil&#x2F;NewsEvents&#x2F;Releases&#x2F;2015&#x2F;03&#x2F;11.aspx&quot;&gt;Brandeis&lt;&#x2F;a&gt; programme makes explicit reference to &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;ssrn.com&#x2F;abstract=2508051&quot;&gt;HDI&lt;&#x2F;a&gt;
and &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;hdiresearch.org&#x2F;&quot;&gt;our website&lt;&#x2F;a&gt;. This has been picked up by &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;gcn.com&#x2F;articles&#x2F;2015&#x2F;03&#x2F;12&#x2F;darpa-brandeis.aspx&quot;&gt;GCN&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.usatoday.com&#x2F;story&#x2F;nation&#x2F;2015&#x2F;03&#x2F;16&#x2F;data-privacy-darpa-brandeis&#x2F;70222556&#x2F;&quot;&gt;USAToday&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.nbcnews.com&#x2F;tech&#x2F;security&#x2F;darpa-unexpectedly-announces-program-improve-online-piracy-n322601&quot;&gt;NBCNews&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.engadget.com&#x2F;2015&#x2F;03&#x2F;12&#x2F;darpa-is-trying-to-reinvent-online-privacy&#x2F;&quot;&gt;Engadget&lt;&#x2F;a&gt; among others. With $60M potentially on the table, I
hope that there’ll be many more who get interested in pushing HDI forwards now
:)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>I Think Someone&#x27;s Following Me...</title>
        <published>2015-03-02T00:00:00+00:00</published>
        <updated>2015-03-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/someones-following-me/"/>
        <id>https://mort.io/blog/someones-following-me/</id>
        
        <content type="html" xml:base="https://mort.io/blog/someones-following-me/">&lt;p&gt;It’s always&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; nice when someone notices what you’re doing, and I was
pleasantly surprised recently to find that someone had indeed been watching.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Specifically, it appears that someone at MIT Technology Review has noticed the
work of me and some of my pals: our work on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.technologyreview.com&#x2F;2015&#x2F;01&#x2F;05&#x2F;169715&#x2F;the-emerging-science-of-human-data-interaction&#x2F;&quot;&gt;HDI&lt;&#x2F;a&gt; and a recent sketch of some
follow-on work we’re pursuing around building a personal &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.technologyreview.com&#x2F;2015&#x2F;01&#x2F;26&#x2F;169495&#x2F;how-a-box-could-solve-the-personal-data-conundrum&#x2F;&quot;&gt;Databox&lt;&#x2F;a&gt;.
Independently of that, the latter also happened to get picked up by
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.theguardian.com&#x2F;profile&#x2F;johnnaughton&quot;&gt;John Naughton&lt;&#x2F;a&gt; in the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.theguardian.com&#x2F;technology&#x2F;2015&#x2F;feb&#x2F;01&#x2F;control-personal-data-databox-end-user-agreement&quot;&gt;Guardian&lt;&#x2F;a&gt;, which ended up with a pretty
active comments thread, including one from Richard Stallman himself…&lt;&#x2F;p&gt;
&lt;p&gt;Guess we’d better get on and deliver it now then :)&lt;&#x2F;p&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Well, usually. Unless you’re doing something embarrassing like, e.g.,
dancing. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;Though in fact, given the pattern involved, I suspect it may be my
colleague, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.eecs.qmul.ac.uk&#x2F;~hamed&#x2F;&quot;&gt;Dr Hamed Haddadi&lt;&#x2F;a&gt; who’s
actually being followed. To whit, the fact that they also picked up on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.technologyreview.com&#x2F;2014&#x2F;09&#x2F;12&#x2F;171400&#x2F;the-murky-world-of-third-party-web-tracking&#x2F;&quot;&gt;a
study&lt;&#x2F;a&gt;
of third-party web-tracking from last year. &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Looping the Loop</title>
        <published>2015-02-17T00:00:00+00:00</published>
        <updated>2015-02-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/looping-the-loop/"/>
        <id>https://mort.io/blog/looping-the-loop/</id>
        
        <content type="html" xml:base="https://mort.io/blog/looping-the-loop/">&lt;p&gt;In a fit of blogging mania, here’s another one literally barely days after the
previous one. Maybe I’ll crack this yet.&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, this is just a short one with what verges on a Technical Contribution.
To whit: I recently sorted out &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mort.io&#x2F;&quot;&gt;this domain&lt;&#x2F;a&gt; and was having
some issues getting some consistency between what &lt;code&gt;dig&lt;&#x2F;code&gt;, Chrome and my
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;gandi.net&quot;&gt;domain provider&lt;&#x2F;a&gt; believed to be the correct state. In
particular, I was switching over to make the domain properly live rather than
simply a &lt;code&gt;301 Moved Permanently&lt;&#x2F;code&gt; redirect to my old pages at Nottingham.&lt;&#x2F;p&gt;
&lt;p&gt;It turns out this was probably mostly Chrome being confused. It seems that it
caches &lt;code&gt;301 Moved Permanently&lt;&#x2F;code&gt; redirects fairly aggressively and the cached
entries are &lt;strong&gt;not&lt;&#x2F;strong&gt; discarded when you go through the standard mechanisms to
clear caches.&lt;&#x2F;p&gt;
&lt;p&gt;After a bit of experimentation and browsing, it seems that one way to clear this
is to &lt;code&gt;view-source&lt;&#x2F;code&gt; on the page but pass a spurious parameter to defeat the
cache. So, to force the browser to fetch &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mort.io&quot;&gt;http:&#x2F;&#x2F;mort.io&lt;&#x2F;a&gt; properly, all I had to
do was &lt;code&gt;view-source:mort.io?spurious=parameter&lt;&#x2F;code&gt;. And lo! All was well.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Talks, Old and New</title>
        <published>2015-02-14T00:00:00+00:00</published>
        <updated>2015-02-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/talks-old-and-new/"/>
        <id>https://mort.io/blog/talks-old-and-new/</id>
        
        <content type="html" xml:base="https://mort.io/blog/talks-old-and-new/">&lt;p&gt;Thanks to an invitation from &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;research.microsoft.com&#x2F;en-us&#x2F;um&#x2F;people&#x2F;hiballan&#x2F;&quot;&gt;Hitesh&lt;&#x2F;a&gt;, I recently got the chance to revisit my
old stomping ground at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;research.microsoft.com&#x2F;en-us&#x2F;labs&#x2F;cambridge&#x2F;&quot;&gt;Microsoft Research Cambridge&lt;&#x2F;a&gt;. Well, I say “old”
– in the intervening 7 years, they’ve moved to a rather splendid new building
at the other end of Cambridge, just next to the station. (And improved the
coffee too, not that it wasn’t pretty good to start with!)&lt;&#x2F;p&gt;
&lt;p&gt;Anyway, this was a pleasant chance to catch up with some old colleagues, meet
some new ones, and even speak to my most recently graduated Ph.D. student,
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;research.microsoft.com&#x2F;en-us&#x2F;people&#x2F;a-ewluge&#x2F;&quot;&gt;Dr Ewa Luger&lt;&#x2F;a&gt; – and who’d’ve thought that I’d ever end up supervising
someone coming from the discipline of Political Science too!&lt;&#x2F;p&gt;
&lt;p&gt;The ostensible reason was to talk about the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;homenetworks.ac.uk&#x2F;&quot;&gt;Homework&lt;&#x2F;a&gt; project – a talk I’ve
given a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=AdtVSrazVaQ&quot;&gt;few times now&lt;&#x2F;a&gt; – and to lead from that into discussing some
of my current agenda, around &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;hdiresearch.org&#x2F;&quot;&gt;Human-Data Interaction&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;mort.io&#x2F;research&#x2F;&quot;&gt;User-Centred Systems&lt;&#x2F;a&gt;. It seemed to go pretty well – a few
questions, and some lively discussion over lunch followed.&lt;&#x2F;p&gt;
&lt;p&gt;Happily, the fine folk at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;research.microsoft.com&#x2F;en-us&#x2F;labs&#x2F;cambridge&#x2F;&quot;&gt;MSRC&lt;&#x2F;a&gt; recorded it and have made it available, so if
you’re really interested, you can take a look – direct your browser of choice to &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;research.microsoft.com&#x2F;apps&#x2F;video&#x2F;default.aspx?id=238157&quot;&gt;Interacting with Infrastructure: Home Networking and Beyond&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I have to say, when I checked that link in the course of writing this, one thing
that did come as something of a surprise was to notice that a talk I didn’t
remember giving – it was 8 years ago to be fair! – is also available. So if
you’ve a burning desire to find out about
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;research.microsoft.com&#x2F;apps&#x2F;video&#x2F;default.aspx?id=104278&quot;&gt;Measuring and Monitoring Microsoft’s Enterprise Network&lt;&#x2F;a&gt;,
it turns out you can do that too. The past haunts us they say. In my case, it
seems that the haunting has happened already, and turned my hair mostly white in
the process… :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Begin, Again!</title>
        <published>2015-01-15T00:00:00+00:00</published>
        <updated>2015-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/begin-again/"/>
        <id>https://mort.io/blog/begin-again/</id>
        
        <content type="html" xml:base="https://mort.io/blog/begin-again/">&lt;p&gt;Specifically, I’ve left &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.horizon.ac.uk&quot;&gt;Horizon&lt;&#x2F;a&gt; and the
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.cs.nott.ac.uk&quot;&gt;School of Computer Science&lt;&#x2F;a&gt; at the
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.nottingham.ac.uk&quot;&gt;University of Nottingham&lt;&#x2F;a&gt; to (re-)join the
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.cam.ac.uk&quot;&gt;Cambridge University&lt;&#x2F;a&gt;
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.cl.cam.ac.uk&quot;&gt;Computer Laboratory&lt;&#x2F;a&gt;. In celebration, and frankly
because it was long overdue anyway, I’ve reworked my website. What do you think?&lt;&#x2F;p&gt;
&lt;p&gt;For the curious, or the technically inclined, the site now uses
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;foundation.zurb.com&#x2F;&quot;&gt;ZURB Foundation&lt;&#x2F;a&gt; 5.5.0 (the current downloadable release as of
yesterday), with some slightly customised CSS. The site itself is largely
written in &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;daringfireball.net&#x2F;projects&#x2F;markdown&#x2F;&quot;&gt;Markdown&lt;&#x2F;a&gt; and currently generated using
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; to be hosted on &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;github.com&quot;&gt;Github&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It’s actually gone through an interim phase where it was parsed by the OCaml
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pw347&#x2F;omd&quot;&gt;OMD&lt;&#x2F;a&gt; parser before being crunched into a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-types&quot;&gt;Mirage KV_RO&lt;&#x2F;a&gt;
filesystem which is then compiled into a type-safe, self-contained web appliance
that serves these pages and no other using the OCaml &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;cowabloga&quot;&gt;Cowabloga&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;ocaml-cow&quot;&gt;COW&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;ocaml-cohttp&quot;&gt;CoHTTP&lt;&#x2F;a&gt; libraries. This could either be run as a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-platform&#x2F;tree&#x2F;master&#x2F;unix&quot;&gt;POSIX binary&lt;&#x2F;a&gt;
or a self-contained &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;mirage-platform&#x2F;tree&#x2F;master&#x2F;xen&quot;&gt;Xen VM&lt;&#x2F;a&gt; depending on what I felt like. Neat eh?
(And for the sceptical among you, yes, a thing &lt;em&gt;can&lt;&#x2F;em&gt; be neat and yet appear
curiously over-engineered at the same time… :)&lt;&#x2F;p&gt;
&lt;p&gt;For the time being however, I’m using it as an excuse to think about what I
might do to better support site generation like this in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mirage&#x2F;cowabloga&quot;&gt;Cowabloga&lt;&#x2F;a&gt; so that I
can more seamlessly switch between &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jekyllrb.com&#x2F;&quot;&gt;Jekyll&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;openmirage.org&#x2F;&quot;&gt;Mirage&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Longshaw Lodge to Higger Tor via Carl Wark, and back via Burbage Moor</title>
        <published>2014-10-05T00:00:00+00:00</published>
        <updated>2014-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2014-peaks-carl-wark-higger-tor-burbage-moor/"/>
        <id>https://mort.io/tracks/2014-peaks-carl-wark-higger-tor-burbage-moor/</id>
        
        <summary type="html">&lt;p&gt;A family walk in the Peak District on a rather fine mid-autumn day after what
looks like a relatively dry summer.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Monsal Hotel to Monsal Head Viaduct and back via the River Wye</title>
        <published>2014-06-08T00:00:00+00:00</published>
        <updated>2014-06-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/tracks/2014-peaks-monsall-head-cramside-river-wye/"/>
        <id>https://mort.io/tracks/2014-peaks-monsall-head-cramside-river-wye/</id>
        
        <summary type="html">&lt;p&gt;Another family walk in the Peak District.&amp;hellip;
&lt;&#x2F;p&gt;
</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>A 21st Century IDE</title>
        <published>2013-10-13T00:00:00+00:00</published>
        <updated>2013-10-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Richard Mortier
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mort.io/blog/21st-century-ide/"/>
        <id>https://mort.io/blog/21st-century-ide/</id>
        
        <content type="html" xml:base="https://mort.io/blog/21st-century-ide/">&lt;p&gt;I finally decided to sit down and get the shiny new &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;kiwi.iuwt.fr&#x2F;~asmanur&#x2F;blog&#x2F;merlin&#x2F;&quot;&gt;merlin&lt;&#x2F;a&gt; mode for OCaml
working with my emacs configuration. Basically, really rather simple in the end
although (in the usual fashion!) I did end up spending considerable time
tweaking various other customisations…&lt;&#x2F;p&gt;
&lt;p&gt;Most of the information below is based on the following sources:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;github.com&#x2F;def-lkb&#x2F;merlin#emacs-interface&quot;&gt;http:&#x2F;&#x2F;github.com&#x2F;def-lkb&#x2F;merlin#emacs-interface&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;zheng.li&#x2F;buzzlogs-ocaml&#x2F;2013&#x2F;08&#x2F;23&#x2F;irc.html&quot;&gt;http:&#x2F;&#x2F;zheng.li&#x2F;buzzlogs-ocaml&#x2F;2013&#x2F;08&#x2F;23&#x2F;irc.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ocamlpro.com&#x2F;blog&#x2F;2013&#x2F;03&#x2F;18&#x2F;monthly-03.html&quot;&gt;http:&#x2F;&#x2F;www.ocamlpro.com&#x2F;blog&#x2F;2013&#x2F;03&#x2F;18&#x2F;monthly-03.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Before we begin, install &lt;code&gt;merlin&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ opam install merlin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The complete &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mor1&#x2F;rc-files&#x2F;commit&#x2F;4a2b0be59081d6df0640af39b48c75c20443c8dc&quot;&gt;commit&lt;&#x2F;a&gt; change is in my &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;github.com&#x2F;mor1&quot;&gt;github&lt;&#x2F;a&gt; account (combined with a
large cleanup of various other aborted OCaml configurations). Breaking it down a
bit, first setup some paths: where to find &lt;code&gt;ocp-indent&lt;&#x2F;code&gt;, &lt;code&gt;merlin.el&lt;&#x2F;code&gt; for
&lt;code&gt;merlin-mode&lt;&#x2F;code&gt;, and the &lt;code&gt;ocamlmerlin&lt;&#x2F;code&gt; command itself. Note that this relies on
the current state of &lt;code&gt;opam&lt;&#x2F;code&gt;, so when you start &lt;code&gt;emacs&lt;&#x2F;code&gt; be sure to have selected
the &lt;code&gt;opam&lt;&#x2F;code&gt; compiler-switch that you installed the &lt;code&gt;merlin&lt;&#x2F;code&gt; package into, above.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; ocp-indent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(load-file (concat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            (substring (shell-command-to-string &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;opam config var prefix&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0 -1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;            &amp;quot;&#x2F;share&#x2F;typerex&#x2F;ocp-indent&#x2F;ocp-indent.el&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #586E75;font-style: italic;&quot;&gt;;; merlin-mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt; (concat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       (substring (shell-command-to-string &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;opam config var share&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0 -1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;       &amp;quot;&#x2F;emacs&#x2F;site-lisp&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      load-path)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span&gt; merlin-command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      (concat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       (substring (shell-command-to-string &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;opam config var bin&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D33682;&quot;&gt;0 -1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;       &amp;quot;&#x2F;ocamlmerlin&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       ))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(autoload &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;merlin-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;merlin&amp;quot; &amp;quot;Merlin mode&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt; t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now the meat: when we select &lt;code&gt;tuareg-mode&lt;&#x2F;code&gt;, use &lt;code&gt;ocp-indent&lt;&#x2F;code&gt; to indent lines,
turn on &lt;code&gt;merlin&lt;&#x2F;code&gt; auto-complete, and finally set a couple of local key bindings
so that I can fix up &lt;code&gt;merlin&lt;&#x2F;code&gt; to not conflict with my
now-neurologically-hardwired navigation keys.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(add-hook &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;tuareg-mode-hook&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;          &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;lambda&lt;&#x2F;span&gt;&lt;span&gt; ()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             (merlin-mode)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span&gt; indent-line-function &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;ocp-indent-line)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;setq&lt;&#x2F;span&gt;&lt;span&gt; merlin-use-auto-complete-mode &lt;&#x2F;span&gt;&lt;span style=&quot;color: #B58900;&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             (local-set-key (kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-S-&amp;lt;up&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;merlin-type-enclosing-go-up)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             (local-set-key (kbd &lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;C-S-&amp;lt;down&amp;gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;merlin-type-enclosing-go-down)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             ))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, do the usual to use &lt;code&gt;tuareg-mode&lt;&#x2F;code&gt; for OCaml&#x2F;F# editing.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #839496; background-color: #002B36;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(push&amp;#39;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.ml[iylp]?&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; tuareg-mode) auto-mode-alist)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #93A1A1;font-weight: bold;&quot;&gt;push&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #CB4B16;&quot;&gt;\\&lt;&#x2F;span&gt;&lt;span style=&quot;color: #2AA198;&quot;&gt;.fs[ix]?&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #268BD2;&quot;&gt; .&lt;&#x2F;span&gt;&lt;span&gt; tuareg-mode) auto-mode-alist)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that’s it!&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
