<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on Miek Gieben</title>
    <link>https://miek.nl/categories/linux/</link>
    <description>Recent content in Linux on Miek Gieben</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>© Copyright 2007-2024 Miek Gieben</copyright>
    <lastBuildDate>Sun, 26 Apr 2026 18:22:52 +0200</lastBuildDate>
    <atom:link href="https://miek.nl/categories/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Uncloud Prometheus</title>
      <link>https://miek.nl/2026/april/26/uncloud-prometheus/</link>
      <pubDate>Sun, 26 Apr 2026 18:22:52 +0200</pubDate>
      <guid>https://miek.nl/2026/april/26/uncloud-prometheus/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/psviderski/uncloud/pull/304&#34;&gt;Prometheus metrics&lt;/a&gt; are being worked on by&#xA;&lt;a href=&#34;https://ratms.nl/projects/uncloud/&#34;&gt;me&lt;/a&gt;, and will hopefully soon be merged in &lt;a href=&#34;https://uncloud.run&#34;&gt;Uncloud&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;em&gt;uncloudd&lt;/em&gt; metrics endpoint is exposed into the cluster network, so this makes it possible for a&#xA;Prometheus service running inside the cluster to scrape it. For this it just needs to be able to access the API&#xA;to get all machines in the cluster. This can be done by mounting the uncloud socket inside the container, and&#xA;using &lt;code&gt;uc&lt;/code&gt; with &lt;a href=&#34;https://github.com/psviderski/uncloud/issues/335&#34;&gt;structured output&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Uncloud L4</title>
      <link>https://miek.nl/2026/april/25/uncloud-l4/</link>
      <pubDate>Sat, 25 Apr 2026 13:21:52 +0200</pubDate>
      <guid>https://miek.nl/2026/april/25/uncloud-l4/</guid>
      <description>&lt;p&gt;Natively &lt;a href=&#34;https://uncloud.run&#34;&gt;Uncloud&lt;/a&gt; doesn&amp;rsquo;t do L4 forwarding. This is an &lt;a href=&#34;https://github.com/psviderski/uncloud/issues/108&#34;&gt;open&#xA;issue&lt;/a&gt; as we are figuring out how to actually do this. But&#xA;it turns out you can already do this with the current code - well almost.&lt;/p&gt;&#xA;&lt;p&gt;Buckle up, because there is quite some stuff you may need:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;A patched Uncloud, see &lt;a href=&#34;https://github.com/psviderski/uncloud/pull/358&#34;&gt;this PR&lt;/a&gt; for that.&lt;/li&gt;&#xA;&lt;li&gt;A custom &lt;a href=&#34;https://caddyserver.com&#34;&gt;Caddy&lt;/a&gt; build, with the &lt;a href=&#34;https://github.com/mholt/caddy-l4&#34;&gt;L4&lt;/a&gt; plugin.&lt;/li&gt;&#xA;&lt;li&gt;A DNS server, I use &lt;a href=&#34;https://atomdns.miek.nl&#34;&gt;atomdns&lt;/a&gt; of course.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;caddy&#34;&gt;Caddy&lt;/h1&gt;&#xA;&lt;p&gt;With the following Dockerfile you create a custom caddy image that we will use.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Uncloud Private Registries</title>
      <link>https://miek.nl/2026/april/14/uncloud-private-registries/</link>
      <pubDate>Tue, 14 Apr 2026 19:31:00 +0200</pubDate>
      <guid>https://miek.nl/2026/april/14/uncloud-private-registries/</guid>
      <description>&lt;p&gt;While pushing &lt;a href=&#34;https://github.com/psviderski/uncloud/pull/306&#34;&gt;this PR&lt;/a&gt;, the answer was that this &lt;em&gt;was already&#xA;working&lt;/em&gt;! But kind of unintuitive, but smart as it re-uses whatever docker setup you got (i.e. credentials&#xA;helpers).&lt;/p&gt;&#xA;&lt;p&gt;So to get this working you:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% docker login registry.science.ru.nl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Username: bla&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Password:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then use &lt;code&gt;uc deploy -f .../compose.yml&lt;/code&gt; just like you did before. Now it should pull from the private repo&#xA;and things &amp;ldquo;just work&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;See &lt;a href=&#34;https://uncloud.run/docs/guides/deployments/deploy-app/#pull-from-a-private-registry&#34;&gt;this guide&lt;/a&gt; for&#xA;canonical text on this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Uncloud</title>
      <link>https://miek.nl/2026/march/16/uncloud/</link>
      <pubDate>Mon, 16 Mar 2026 14:00:40 +0100</pubDate>
      <guid>https://miek.nl/2026/march/16/uncloud/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m playing with &lt;a href=&#34;https://uncloud.run&#34;&gt;Uncloud&lt;/a&gt; to see if it is something we can use at $WORK. Pretty&#xA;impressed with it already, as I&amp;rsquo;ve written something worse &lt;a href=&#34;https://github.com/miekg/pgo&#34;&gt;pgo&lt;/a&gt;, that was&#xA;(obviously) not good enough. Uncloud does: implement a subset of the Docker(-compose) API, uses gRPC and&#xA;wireguard to create mini network; just brilliant. Haven&amp;rsquo;t seen prometheus metrics yet, although Caddy is used&#xA;for the proxy, but more prometheus metrics would make sense. (Which you can then observe through a cluster&#xA;hosted prometheus&amp;hellip;?)&lt;/p&gt;</description>
    </item>
    <item>
      <title>PAM unixsock</title>
      <link>https://miek.nl/2025/march/14/pam-unixsock/</link>
      <pubDate>Fri, 14 Mar 2025 12:14:47 +0100</pubDate>
      <guid>https://miek.nl/2025/march/14/pam-unixsock/</guid>
      <description>&lt;p&gt;Ever felt the need to do something with PAM, like implementing 2FA in SSH? You are left with a few&#xA;bad choices, among others you&amp;rsquo;ll need to write something (complex) in C. I rather not do that, so&#xA;I&amp;rsquo;ve created &lt;a href=&#34;https://github.com/miekg/pam-unixsock&#34;&gt;pam-unixsock&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This is &lt;em&gt;tiny&lt;/em&gt;, the most trouble I had with concatenating strings with a space in between,&#xA;because, you know, C. Anyway &lt;em&gt;tiny&lt;/em&gt;. It doesn&amp;rsquo;t do much and gets you into another language quickly!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Format Go HTML templates</title>
      <link>https://miek.nl/2025/february/19/format-go-html-templates/</link>
      <pubDate>Wed, 19 Feb 2025 15:20:33 +0100</pubDate>
      <guid>https://miek.nl/2025/february/19/format-go-html-templates/</guid>
      <description>&lt;p&gt;Because I was fed up with the lack of options (none), I write a tool that&#xA;can format Go HTML templates: you can find it &lt;a href=&#34;https://github.com/miekg/gotmplfmt&#34;&gt;here&lt;/a&gt;. Includes&#xA;screenshots!&lt;/p&gt;&#xA;&lt;p&gt;Formatting Go &lt;em&gt;text&lt;/em&gt; templates is pure madness, but the above code works well on HTML templates. If&#xA;have find issues or need more functionality open a PR against the repo.&lt;/p&gt;&#xA;&lt;p&gt;Have this in neovim:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;au&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FileType&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gohtmltmpl&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;command&lt;/span&gt;! &lt;span style=&#34;color:#a6e22e&#34;&gt;Fmt&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;silent&lt;/span&gt; %!&lt;span style=&#34;color:#a6e22e&#34;&gt;gotmplfmt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;au&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FileType&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gohtmltmpl&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &amp;amp;&lt;span style=&#34;color:#a6e22e&#34;&gt;l&lt;/span&gt;:&lt;span style=&#34;color:#a6e22e&#34;&gt;formatprg&lt;/span&gt;=&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gotmplfmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;update-2025-05-31&#34;&gt;Update 2025-05-31&lt;/h2&gt;&#xA;&lt;p&gt;In my new neovim setup (with conform.lua) I have this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Matchup in Neovim for Go templates</title>
      <link>https://miek.nl/2024/december/07/matchup-in-neovim-for-go-templates/</link>
      <pubDate>Sat, 07 Dec 2024 12:04:24 +0100</pubDate>
      <guid>https://miek.nl/2024/december/07/matchup-in-neovim-for-go-templates/</guid>
      <description>&lt;p&gt;After dealing with &lt;a href=&#34;https://pkg.go.dev/text/template&#34;&gt;Go templates&lt;/a&gt; (also HTML templates) for more&#xA;than a year and keep loosing track of where each block &lt;code&gt;{{end}}s&lt;/code&gt; I finally &lt;a href=&#34;https://mastodon.cloud/@miek/113606613003828116&#34;&gt;did something about&#xA;it&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;But that didn&amp;rsquo;t work that good. So I&amp;rsquo;ve switch to the&#xA;&lt;a href=&#34;https://github.com/andymass/vim-matchup&#34;&gt;match-up&lt;/a&gt; plugin, which is better than the built-in&#xA;&lt;code&gt;matchit&lt;/code&gt; that I was using previously. With Neovim I&amp;rsquo;m using this setup:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;Plug&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;andymass/vim-matchup&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And this extra bit of config:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;nvim-treesitter.configs&amp;#39;&lt;/span&gt;.setup {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  matchup &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    enable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This in itself does not make template matching work, for this I just copied the&#xA;&lt;a href=&#34;https://github.com/andymass/vim-matchup/wiki/The-match-up-wiki#hugo&#34;&gt;Hugo template matcher&lt;/a&gt;&#xA;(which is just like Go templating) to the correct place. Doing this with &lt;em&gt;some&lt;/em&gt; automation from&#xA;inside Neovim:&lt;/p&gt;</description>
    </item>
    <item>
      <title>eBPF from Go - IV - Code generation</title>
      <link>https://miek.nl/2024/october/28/ebpf-from-go-iv-code-generation/</link>
      <pubDate>Mon, 28 Oct 2024 15:47:08 +0200</pubDate>
      <guid>https://miek.nl/2024/october/28/ebpf-from-go-iv-code-generation/</guid>
      <description>&lt;p&gt;Played more with TinyGo, but it always generates code for (minimal) reflection - i.e. the &lt;code&gt;reflect&lt;/code&gt;&#xA;package, because it requires that for its &lt;code&gt;map&lt;/code&gt; implementation. I could skip or not generate that,&#xA;but then that would mean using a map would be &amp;hellip; weird? Anyhow it looked that even TinyGo does too&#xA;much for eBPF. So plan D: generate eBPF code (and Go code) using Go. Cilium has done a lot of work&#xA;in this regard.&lt;/p&gt;</description>
    </item>
    <item>
      <title>eBPF from Go - III - Reducing the SSA</title>
      <link>https://miek.nl/2024/september/30/ebpf-from-go-iii-reducing-the-ssa/</link>
      <pubDate>Mon, 30 Sep 2024 15:47:08 +0200</pubDate>
      <guid>https://miek.nl/2024/september/30/ebpf-from-go-iii-reducing-the-ssa/</guid>
      <description>&lt;p&gt;Again some progress. I&amp;rsquo;m mostly focussing on removing code from the SSA representation&#xA;(&lt;code&gt;-internal-dumpssa&lt;/code&gt;), so that I can work with a clean slate. As BPF is so limited almost none of&#xA;the features from Go make sense, although in some far fetched future it would be super cool to have&#xA;channels and goroutines to something in BPF - but not today. First need to get to &amp;ldquo;Hello World&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m building this code:&lt;/p&gt;</description>
    </item>
    <item>
      <title>eBPF from Go - II</title>
      <link>https://miek.nl/2024/august/30/ebpf-from-go-ii/</link>
      <pubDate>Fri, 30 Aug 2024 15:47:08 +0200</pubDate>
      <guid>https://miek.nl/2024/august/30/ebpf-from-go-ii/</guid>
      <description>&lt;p&gt;Following up from the previous blog post&amp;hellip; I&amp;rsquo;ve got a JSON file with the string &amp;lsquo;bpf&amp;rsquo; in the&#xA;correct place. Let&amp;rsquo;s see what tinygo thinks of that:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;% ./build/tinygo build -o miekg/main.bpf -target bpf ./miekg/main.go&#xA;No available targets are compatible with triple &amp;quot;bpf-unknown-unknown&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;code&gt;clang&lt;/code&gt; indeed does not list bpf as a valid target, so this needs to be added.&lt;/p&gt;&#xA;&lt;p&gt;The llvm build is configured from the main&#xA;&lt;a href=&#34;https://github.com/tinygo-org/tinygo/blob/release/GNUmakefile&#34;&gt;GNUMakefile&lt;/a&gt;, with&#xA;&lt;code&gt;-DLLVM_TARGETS_TO_BUILD...&lt;/code&gt;. Using grep and find I found the &amp;ldquo;llvm/test/CodeGen&amp;rdquo; directory, which,&#xA;in addition to all listed targets also has a BPF directory. Let&amp;rsquo;s add BPF to that list and recompile.&lt;/p&gt;</description>
    </item>
    <item>
      <title>eBPF from Go; First Steps</title>
      <link>https://miek.nl/2024/august/29/ebpf-from-go-first-steps/</link>
      <pubDate>Thu, 29 Aug 2024 20:04:35 +0200</pubDate>
      <guid>https://miek.nl/2024/august/29/ebpf-from-go-first-steps/</guid>
      <description>&lt;p&gt;So I had this itch that I wanted to make a Go program compile to eBPF and be able to load that&#xA;program in the Linux kernel by use of &lt;code&gt;bpftool&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As I &lt;a href=&#34;https://github.com/miekg/ebpf/blob/main/README.md&#34;&gt;say in github.com/miekg/ebpf&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;eBPF in C? What am I, a farmer?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;After much reading about eBPF and thinking about how that would work from Go, I figured that would&#xA;involve writing a Go compiler.&lt;/p&gt;&#xA;&lt;p&gt;So I could:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;hack the official Go compiler and (try to) add a eBPF target (which would probably never&#xA;be added as an official target because of all the constraints eBPF has).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Printing from Android </title>
      <link>https://miek.nl/2024/february/24/printing-from-android/</link>
      <pubDate>Sat, 24 Feb 2024 20:03:54 +0100</pubDate>
      <guid>https://miek.nl/2024/february/24/printing-from-android/</guid>
      <description>&lt;p&gt;Quick note to self.&lt;/p&gt;&#xA;&lt;p&gt;Printing from Android &lt;em&gt;requires&lt;/em&gt; IPP. If your printing does not support this protocol out of the box&#xA;you will not be able to directly print from Android devices.&lt;/p&gt;&#xA;&lt;p&gt;CUPS can then be used to translate between IPP and JetDirect (in my case). Install and configure&#xA;CUPS and then on Android configure the printer. The later means connecting to a printer &lt;em&gt;by IP&#xA;address&lt;/em&gt;. In that form enter the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Config Management, part III: Rolling Back</title>
      <link>https://miek.nl/2024/february/02/config-management-part-iii-rolling-back/</link>
      <pubDate>Fri, 02 Feb 2024 15:20:33 +0100</pubDate>
      <guid>https://miek.nl/2024/february/02/config-management-part-iii-rolling-back/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miek.nl/2024/february/01/config-management-part-ii-microcode-language/&#34;&gt;The second part&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In the previous part we looked how a micro language would look like, now I want to focus on what it&#xA;means to roll back to a previous version. First take a look at an instruction that have no obvious&#xA;reverse: CHMOD&lt;/p&gt;&#xA;&lt;p&gt;When rolling back CHMOD you want to revert to the previous permissions. This would work&#xA;automatically &lt;em&gt;if&lt;/em&gt; there was an older CHMOD that would also set the permission, but in a lot of&#xA;situations you probably just go with the (package) defaults. This implies you don&amp;rsquo;t know what a&#xA;CHMOD reversal would be, and that implies we need to track that, like in a proper &lt;em&gt;journal&lt;/em&gt;. As said&#xA;each instruction has an implicit condition, if that condition doesn&amp;rsquo;t hold, it executes the&#xA;instruction, we can utilize that state and save it in the journal. Let&amp;rsquo;s see in detail how this&#xA;would work with something like CHMOD.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Config Management, part II: Microcode Language</title>
      <link>https://miek.nl/2024/february/01/config-management-part-ii-microcode-language/</link>
      <pubDate>Thu, 01 Feb 2024 15:20:33 +0100</pubDate>
      <guid>https://miek.nl/2024/february/01/config-management-part-ii-microcode-language/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miek.nl/2024/january/29/config-management/&#34;&gt;The first part&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This cfg mgmt system uses a micro language to perform the changes on the target&#xA;system. This language is limited in its scope and has the following &amp;ldquo;instructions&amp;rdquo;:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;INSTRUCTION&lt;/th&gt;&#xA;          &lt;th&gt;ARITY&lt;/th&gt;&#xA;          &lt;th&gt;ARGUMENTS&lt;/th&gt;&#xA;          &lt;th&gt;REMARK&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;REM&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;TEXT&lt;/td&gt;&#xA;          &lt;td&gt;a comment&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;MKDIR&lt;/td&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;MODE PATH&lt;/td&gt;&#xA;          &lt;td&gt;create a directory&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;COPY&lt;/td&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;SRC-PATH DST-PATH&lt;/td&gt;&#xA;          &lt;td&gt;copy a file&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CHMOD&lt;/td&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;MODE PATH&lt;/td&gt;&#xA;          &lt;td&gt;set the mode&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CHOWN&lt;/td&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;USER/ID PATH&lt;/td&gt;&#xA;          &lt;td&gt;set the owner&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CHGRP&lt;/td&gt;&#xA;          &lt;td&gt;2&lt;/td&gt;&#xA;          &lt;td&gt;GROUP/ID PATH&lt;/td&gt;&#xA;          &lt;td&gt;set the group&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RM&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;PATH&lt;/td&gt;&#xA;          &lt;td&gt;rm the file&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;EXEC&lt;/td&gt;&#xA;          &lt;td&gt;1&lt;/td&gt;&#xA;          &lt;td&gt;CMD&lt;/td&gt;&#xA;          &lt;td&gt;install a package&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;These micro-instruction basically all call a simple system call to make the changes.&#xA;Note, except for the latter this is the Unix API of everything is a file. &lt;code&gt;EXEC&lt;/code&gt; is now only used&#xA;to install/deinstall a package; of course such a generic instruction is ripe for abuse&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>OSC52: My Cut &amp; Paste Journey</title>
      <link>https://miek.nl/2024/january/31/osc52-my-cut-paste-journey/</link>
      <pubDate>Wed, 31 Jan 2024 11:03:41 +0000</pubDate>
      <guid>https://miek.nl/2024/january/31/osc52-my-cut-paste-journey/</guid>
      <description>&lt;p&gt;In the olden days with X11, you could just do x11-forwarding in SSH and remote cut and paste would&#xA;work. Now with Wayland, this is all broken and supposedly &amp;ldquo;there are better ways of doing it&amp;rdquo;. One&#xA;of those is&#xA;&lt;a href=&#34;https://www.reddit.com/r/vim/comments/k1ydpn/a_guide_on_how_to_copy_text_from_anywhere/&#34;&gt;OSC52&lt;/a&gt;&#xA;support in terminals, but not in &lt;a href=&#34;https://wiki.gnome.org/Apps/Terminal/VTE&#34;&gt;VTE&lt;/a&gt; based ones, like&#xA;&lt;a href=&#34;https://gnunn1.github.io/tilix-web/&#34;&gt;Tilix&lt;/a&gt;, which &lt;strike&gt;is&lt;/strike&gt; was my default terminal.&#xA;(See &lt;a href=&#34;https://gitlab.gnome.org/GNOME/vte/-/issues/2495&#34;&gt;https://gitlab.gnome.org/GNOME/vte/-/issues/2495&lt;/a&gt; for the 5(!) year old bug).&lt;/p&gt;&#xA;&lt;p&gt;So I wanted this to work, which meant changing terminal and configuring Neovim - where the latter&#xA;was way more complex, hard to debug and reason about.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Config Management</title>
      <link>https://miek.nl/2024/january/29/config-management/</link>
      <pubDate>Mon, 29 Jan 2024 14:20:33 +0100</pubDate>
      <guid>https://miek.nl/2024/january/29/config-management/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;this project needs a name and a domain.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;After many years of playing with YAML in k8s, I&amp;rsquo;ve returned to using CFEngine (at work). The last&#xA;config management software before that was Puppet. An issue I see with all modern config management&#xA;tooling is the lack of monitoring and the impossibility to cleanly roll back. In k8s it works&#xA;better, but that&amp;rsquo;s only for pods running in k8s (which are stateless), not the underlying machines.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graaf</title>
      <link>https://miek.nl/2023/december/28/graaf/</link>
      <pubDate>Thu, 28 Dec 2023 18:11:35 +0100</pubDate>
      <guid>https://miek.nl/2023/december/28/graaf/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://gitlab.science.ru.nl/cncz/go/-/blob/main/cmd/graaf/&#34;&gt;Graaf&lt;/a&gt; is a Go program that translates&#xA;simple dashboards written in YAML to Grafana JSON. It has an extensive &lt;a href=&#34;https://gitlab.science.ru.nl/cncz/go/-/blob/main/cmd/graaf/graaf.1&#34;&gt;manual&#xA;page&lt;/a&gt; that explains its usage.&#xA;This is also known as Grafana as code, but then for real.&lt;/p&gt;&#xA;&lt;p&gt;The following is a dashboard with 4 panels that I use for my own monitoring.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Overview i&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;uid&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dashboard-overview&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;panels&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;timeseries&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Network Bytes [5m] - edgemax.i&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;y&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;unit&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Bps&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;exprs&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;rate(ifHCOutOctets{ifAlias=&amp;#34;eth0&amp;#34;,job=&amp;#34;edgemax&amp;#34;}[5m])&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{{ifAlias}} transmit&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;rate(ifHCInOctets{ifAlias=&amp;#34;eth0&amp;#34;,job=&amp;#34;edgemax&amp;#34;}[5m])&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{{ifAlias}} receive&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;transform&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;negative-y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;timeseries&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;HTTPS Queries [5m]&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;y&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;unit&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;rps&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;exprs&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sum by (host) (rate(caddy_http_request_count_total{job=&amp;#34;caddy&amp;#34;}[5m]))&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{{host}}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sum (rate(caddy_http_request_count_total{job=&amp;#34;caddy&amp;#34;}[5m]))&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;total&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;transform&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;negative-y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;timeseries&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DNS Queries [5m]&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;y&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;unit&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;rps&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;exprs&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sum by (zone) (rate(coredns_dns_requests_total{job=&amp;#34;nsdns&amp;#34;,zone!=&amp;#34;dropped&amp;#34;}[5m]))&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{{zone}}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sum (rate(coredns_dns_requests_total{job=&amp;#34;nsdns&amp;#34;}[5m]))&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;total&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;transform&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;negative-y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sum (rate(coredns_dns_requests_total{job=&amp;#34;nsdns&amp;#34;,zone=&amp;#34;dropped&amp;#34;}[5m]))&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dropped&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;transform&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;negative-y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;timeseries&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Network Bytes [5m] - nuc.i&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;y&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;unit&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Bps&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;exprs&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;rate(node_network_transmit_bytes_total{job=&amp;#34;node&amp;#34;,device=&amp;#34;eno1&amp;#34;}[5m])&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{{device}} transmit&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;threshold&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ok{value=&amp;#34;0&amp;#34;}&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;expr&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;rate(node_network_receive_bytes_total{job=&amp;#34;node&amp;#34;,device=&amp;#34;eno1&amp;#34;}[5m])&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;legend&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{{device}} receive&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;transform&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;negative-y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This dashboard is 47 lines, the generated JSON dashboard is 500 lines, a ~10-fold reduction in&#xA;cruft. Not bad!&lt;/p&gt;</description>
    </item>
    <item>
      <title>ASCII art in motd</title>
      <link>https://miek.nl/2023/november/15/ascii-art-in-motd/</link>
      <pubDate>Wed, 15 Nov 2023 06:17:36 +0000</pubDate>
      <guid>https://miek.nl/2023/november/15/ascii-art-in-motd/</guid>
      <description>&lt;p&gt;I wanted a nicer login experience (see image above) when logging into my server.&lt;/p&gt;&#xA;&lt;p&gt;For this I used the following sites, tools and steps.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.svgrepo.com/&#34;&gt;https://www.svgrepo.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://asciiart.club/&#34;&gt;https://asciiart.club/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Little Go program from below&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Steps:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Search a nice SVG image at &amp;ldquo;svgrepo&amp;rdquo; and save it;&lt;/li&gt;&#xA;&lt;li&gt;Upload it to &amp;ldquo;asciiart&amp;rdquo;, and generate an ASCII art you are happy with;&lt;/li&gt;&#xA;&lt;li&gt;Download the BBCode variant of the image and (if you want colors) run the program to&#xA;translate &lt;code&gt;[color=#...]&lt;/code&gt; to terminal control characters.&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go run replace.go &amp;lt;image&amp;gt; &amp;amp;&amp;amp; cat out&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The used program is hacky, but does the job. Also used &amp;ldquo;inkscape&amp;rdquo; to fiddle with another logo, and&#xA;made that output something decent as well.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nvim Debian Pkg</title>
      <link>https://miek.nl/2023/september/10/nvim-debian-pkg/</link>
      <pubDate>Sun, 10 Sep 2023 11:20:31 +0200</pubDate>
      <guid>https://miek.nl/2023/september/10/nvim-debian-pkg/</guid>
      <description>&lt;p&gt;NVIM stopped making Debian packages a while back, so here is a short note on how to&#xA;do this yourself. Had a hard time finding this info, hence reproduced here. Assuming you&amp;rsquo;ve&#xA;got the source.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;make CMAKE_BUILD_TYPE=Release&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;cd build &amp;amp;&amp;amp; cpack -G DEB&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;sudo dpkg -i nvim-linux64.deb&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&amp;hellip; and of course you then find the &lt;a href=&#34;https://github.com/neovim/neovim/wiki/Building-Neovim#quick-start&#34;&gt;authoritative&#xA;text&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If you use &lt;code&gt;RelWithDebInfo&lt;/code&gt; an ever growing log file will be created in &lt;code&gt;~/.local/state/nvim/log&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Provisioning Services</title>
      <link>https://miek.nl/2022/november/15/provisioning-services/</link>
      <pubDate>Tue, 15 Nov 2022 07:35:00 +0000</pubDate>
      <guid>https://miek.nl/2022/november/15/provisioning-services/</guid>
      <description>&lt;p&gt;There is a large gap between folks running their own machines and provisioning those and folks&#xA;running Kubernetes and having Gitops at their disposal. In the latter case you can just put some&#xA;YAML in Git and apply it in Kubernetes. Folks running their own machines on the other hand&amp;hellip; are&#xA;not so lucky.&lt;/p&gt;&#xA;&lt;p&gt;Several &amp;ldquo;solutions&amp;rdquo; have existed for years, the umbrella term being &amp;ldquo;provisioning systems&amp;rdquo;, cfengine&#xA;(one of the first), puppet, ansible and more. These work, but are (too?) powerful in that they allow&#xA;actions and edits on the system being provisioned. This creates (hidden) problems when you&amp;rsquo;re asking&#xA;yourself questions like: &amp;ldquo;Is the system&amp;rsquo;s state correct and in sync?&amp;rdquo;; &amp;ldquo;Can we easily rollback to a&#xA;previously working version?&amp;rdquo;; &amp;ldquo;What content should file /path/to/file actually have?&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to install xml2rfc on Debian</title>
      <link>https://miek.nl/2019/november/13/how-to-install-xml2rfc-on-debian/</link>
      <pubDate>Wed, 13 Nov 2019 07:17:36 +0000</pubDate>
      <guid>https://miek.nl/2019/november/13/how-to-install-xml2rfc-on-debian/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://trac.tools.ietf.org/tools/xml2rfc/trac/&#34;&gt;Xml2rfc&lt;/a&gt; is &lt;em&gt;the&lt;/em&gt; tool the IETF uses to convert&#xA;the canonical XML for an Internet-Draft into text, HTML or a PDF. This utility has seen many&#xA;releases while the XML schema was being finalized. It&amp;rsquo;s important (if you write I-Ds) that you have&#xA;the latest version of xml2rfc installed.&lt;/p&gt;&#xA;&lt;p&gt;Installing it as a Debian package is done with:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;go to &lt;a href=&#34;https://pypi.org/project/xml2rfc/#files&#34;&gt;https://pypi.org/project/xml2rfc/#files&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;download the tar archive (say &amp;ldquo;xml2rfc-2.35.0.tar.gz&amp;rdquo;)&lt;/li&gt;&#xA;&lt;li&gt;execute: &lt;code&gt;py2dsc-deb xml2rfc-2.35.0.tar.gz&lt;/code&gt; (&amp;ldquo;py2dsc-deb&amp;rdquo; can be found in the &amp;ldquo;python-stdeb&amp;rdquo; package)&lt;/li&gt;&#xA;&lt;li&gt;execute: &lt;code&gt;sudo dpkg -i deb_dist/python-xml2rfc_2.35.0-1_all.deb&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Note a &lt;code&gt;py2dsc&lt;/code&gt; also exists, but that doesn&amp;rsquo;t create a Debian package.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Terminal Setup</title>
      <link>https://miek.nl/2019/august/12/my-terminal-setup/</link>
      <pubDate>Mon, 12 Aug 2019 07:24:27 +0000</pubDate>
      <guid>https://miek.nl/2019/august/12/my-terminal-setup/</guid>
      <description>&lt;p&gt;Every so often I tweak my setup which includes the shell, terminal, mutt, Vim and their color&#xA;configuration. Currently I&amp;rsquo;m using a setup that I&amp;rsquo;ve tweaked a couple of &lt;strong&gt;years&lt;/strong&gt; back - it seems I&#xA;like this one. The color setup between my often used application are all unified, giving everything&#xA;a consistent look.&lt;/p&gt;&#xA;&lt;p&gt;As for colors; I like contrast: I have a black background terminal and the main text is white.&#xA;I&amp;rsquo;m also using a &lt;em&gt;minimal&lt;/em&gt; color scheme, just a few tints here and there. Most of the text is just&#xA;white.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A k8s LB using ARP</title>
      <link>https://miek.nl/2017/december/16/a-k8s-lb-using-arp/</link>
      <pubDate>Sat, 16 Dec 2017 09:33:57 +0000</pubDate>
      <guid>https://miek.nl/2017/december/16/a-k8s-lb-using-arp/</guid>
      <description>&lt;h1 id=&#34;a-k8s-lb-using-arp&#34;&gt;A k8s LB using ARP&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/google/metallb&#34;&gt;Metallb&lt;/a&gt; now supports ARM LBs. This is great, because it allows you&#xA;to create an working LB in your (shitty) home network with off-the-shelve, cheap, router hardware. Running&#xA;k8s at home (on &lt;a href=&#34;https://blog.hypriot.com/post/setup-kubernetes-raspberry-pi-cluster/&#34;&gt;ARM&lt;/a&gt;), became a whole&#xA;lot more interesting!&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Note: this will all be different in metallb 0.3.0, but if you want to play with this now&#xA;you can follow this little guide.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;We follow some of steps in the &lt;a href=&#34;https://metallb.universe.tf/tutorial/&#34;&gt;tutorial&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enable Prometheus metrics in Caddy</title>
      <link>https://miek.nl/2016/march/02/enable-prometheus-metrics-in-caddy/</link>
      <pubDate>Wed, 02 Mar 2016 07:53:58 +0000</pubDate>
      <guid>https://miek.nl/2016/march/02/enable-prometheus-metrics-in-caddy/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://caddyserver.com/&#34;&gt;Caddy webserver&lt;/a&gt; is a modern webserver written in Go.&#xA;I like it because I can easily extend it by writing some middleware (in&#xA;Go). One of the things missing is&#xA;&lt;a href=&#34;https://github.com/mholt/caddy/issues/577&#34;&gt;metrics&lt;/a&gt;, which prompted me&#xA;to implement &lt;a href=&#34;https://github.com/miekg/caddy-prometheus/&#34;&gt;enough metrics&lt;/a&gt; to make me happy.&lt;/p&gt;&#xA;&lt;p&gt;Using this is relatively straight forward, but you&amp;rsquo;ll need to compile Caddy yourself and add this&#xA;middleware.&lt;/p&gt;&#xA;&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;&#xA;&lt;p&gt;(Assuming you have Go installed), first get the goodies:&lt;/p&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;Caddy:&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;go get github.com/mholt/caddy&lt;/code&gt;&lt;/dd&gt;&#xA;&lt;dt&gt;Caddyext:&lt;/dt&gt;&#xA;&lt;dd&gt;This is needed to compile in the new middleware, &lt;code&gt;go get github.com/caddyserver/caddyext&lt;/code&gt;&lt;/dd&gt;&#xA;&lt;dt&gt;Caddy-prometheus:&lt;/dt&gt;&#xA;&lt;dd&gt;&lt;code&gt;go get github.com/miekg/caddy-prometheus&lt;/code&gt;&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;p&gt;Then, with &lt;code&gt;caddyext&lt;/code&gt; register the new middleware:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Monitoring with SSH and Prometheus</title>
      <link>https://miek.nl/2016/february/24/monitoring-with-ssh-and-prometheus/</link>
      <pubDate>Wed, 24 Feb 2016 11:35:01 +0000</pubDate>
      <guid>https://miek.nl/2016/february/24/monitoring-with-ssh-and-prometheus/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;I just wanted to see some qps metrics from BIND9.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This is a bit of hand wavey post on how to set up remote monitoring with&#xA;&lt;a href=&#34;https://prometheus.io&#34;&gt;Prometheus&lt;/a&gt;, &lt;a href=&#34;http://grafana.org&#34;&gt;Grafana&lt;/a&gt; and SSH tunnels.&lt;/p&gt;&#xA;&lt;p&gt;Initially I &lt;em&gt;just&lt;/em&gt; wanted to monitor BIND9 because it actually exports some reasonable&#xA;&lt;a href=&#34;https://kb.isc.org/article/AA-01123&#34;&gt;metrics&lt;/a&gt;, that can be made usable with&#xA;&lt;a href=&#34;https://github.com/digitalocean/bind_exporter&#34;&gt;bind_exporter&lt;/a&gt;. But of course BIND is BIND so this&#xA;is different in &lt;a href=&#34;https://github.com/digitalocean/bind_exporter/issues/7&#34;&gt;BIND 9.10&lt;/a&gt; which is what&#xA;I have on my server&amp;hellip;. &lt;em&gt;sigh&lt;/em&gt;. &lt;a href=&#34;https://twitter.com/@jpmens&#34;&gt;@jpmens&lt;/a&gt; also has some&#xA;&lt;a href=&#34;http://jpmens.net/2010/10/21/using-binds-statistics-server-to-list-zones-and-axfr-the-list/&#34;&gt;interesting tidbits&lt;/a&gt;&#xA;about this BIND9 feature.&lt;/p&gt;</description>
    </item>
    <item>
      <title>lean prompt (for zsh)</title>
      <link>https://miek.nl/2015/november/24/lean-prompt-for-zsh/</link>
      <pubDate>Tue, 24 Nov 2015 17:36:00 +0000</pubDate>
      <guid>https://miek.nl/2015/november/24/lean-prompt-for-zsh/</guid>
      <description>&lt;p&gt;After having used &lt;a href=&#34;https://github.com/sindresorhus/pure&#34;&gt;prompt pure&lt;/a&gt; for about&#xA;a year, I felt that a two-line prompt was not for me. Also not utilizing the&#xA;right side of the terminal seemed a missed opportunity. Still there is much to&#xA;like: the elapsed time of a process, the coloring of the prompt if the exit code&#xA;of the process isn&amp;rsquo;t 0, git integration and the stay out of my way. So I took&#xA;&amp;ldquo;pure&amp;rdquo;, mixed in my ideas of what a prompt should look like and came up with&#xA;&amp;ldquo;lean&amp;rdquo; - a 1 line prompt that stays out of your face.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spontaneous wake ups from suspend</title>
      <link>https://miek.nl/2015/june/27/spontaneous-wake-ups-from-suspend/</link>
      <pubDate>Sat, 27 Jun 2015 13:34:00 +0000</pubDate>
      <guid>https://miek.nl/2015/june/27/spontaneous-wake-ups-from-suspend/</guid>
      <description>&lt;p&gt;When I upgraded my Ubuntu 14.04 to use kernel 4.0 (and now kernel 4.1) it apparently&#xA;got a new feature: it would wake up from suspend in the middle of the day&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;This &lt;a href=&#34;https://bugs.launchpad.net/dell-sputnik/&amp;#43;bug/1161962&#34;&gt;bug&lt;/a&gt; provides a good read&#xA;and has pointers to articles with more background. I&amp;rsquo;m seeing this on my &lt;a href=&#34;http://miek.nl/posts/2013/Aug/31/macbook-air-61-2013-model-with-ubuntu/&#34;&gt;Macbook&#xA;Air&lt;/a&gt;&#xA;and I am still not sure what the root cause is. I&amp;rsquo;m also not sure if it &lt;em&gt;is&lt;/em&gt;&#xA;&amp;ldquo;Intel Rapid Start Technology&amp;rdquo;, as Apples don&amp;rsquo;t have a BIOS to speak off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go and Alpine Linux</title>
      <link>https://miek.nl/2015/june/06/go-and-alpine-linux/</link>
      <pubDate>Sat, 06 Jun 2015 11:13:00 +0000</pubDate>
      <guid>https://miek.nl/2015/june/06/go-and-alpine-linux/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.alpinelinux.org/&#34;&gt;Alpine Linux&lt;/a&gt; is &lt;em&gt;the&lt;/em&gt; small Linux OS everybody&#xA;is using for Docker images. It is super small and has a sh*tload of packages.&#xA;It&amp;rsquo;s libc is &lt;a href=&#34;http://www.musl-libc.org/&#34;&gt;musl libc&lt;/a&gt;, which is different than&#xA;glibc most other Linux distros are using. When deploying Go on such a image you&#xA;want a truly static binary.&lt;/p&gt;&#xA;&lt;p&gt;Building a static binary can be done with the following command (this is for&#xA;&lt;a href=&#34;https://github.com/miekg/skydns&#34;&gt;SkyDNS&lt;/a&gt;):&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;% go build -ldflags &amp;quot;-linkmode external -extldflags -static&amp;quot;&#xA;# github.com/miekg/skydns&#xA;/var/tmp/go-link-FI6Ox0/000000.o: In function `_cgo_632c88804cec_C2func_getaddrinfo&#39;:&#xA;/home/miek/upstream/go/src/net/cgo_unix.go:55: warning: Using &#39;getaddrinfo&#39; in&#xA;statically linked applications requires at runtime the shared libraries from the&#xA;glibc version used for linking&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;That ugly warning is because glibc uses nss(5) &amp;ldquo;Nameserver Service Switch&amp;rdquo; which&#xA;uses dlopen(3) to &lt;em&gt;dynamically&lt;/em&gt; load the correct resolver library. The end&#xA;result is that the Go binary &lt;em&gt;can&amp;rsquo;t resolve any DNS records&lt;/em&gt;!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker Alpine Linux Image for ARM</title>
      <link>https://miek.nl/2015/may/25/docker-alpine-linux-image-for-arm/</link>
      <pubDate>Mon, 25 May 2015 15:25:00 +0000</pubDate>
      <guid>https://miek.nl/2015/may/25/docker-alpine-linux-image-for-arm/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.alpinelinux.org/&#34;&gt;Alpine Linux&lt;/a&gt; is a super small Linux distribution&#xA;which targets Docker. The only downside is that they use &lt;a href=&#34;http://www.musl-libc.org/&#34;&gt;musl libc&lt;/a&gt;&#xA;instead of glibc, which causes some issues for&#xA;Golang programs. But I want this as a base image for SkyDNS on my Raspberry Pi,&#xA;running &lt;a href=&#34;http://blog.hypriot.com/&#34;&gt;HypriotOS&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;After reading a modest amount of documentation I found the&#xA;&lt;a href=&#34;https://raw.githubusercontent.com/lifeeth/docker-arm/master/contrib/mkimage-alpine.sh&#34;&gt;mkimage-alpine.sh&lt;/a&gt;&#xA;script which build a docker image ala&#xA;&lt;a href=&#34;https://registry.hub.docker.com/_/alpine/&#34;&gt;alpine&lt;/a&gt;, but makes it possible to&#xA;select different archs. I had to tweak this script a little to make it do what&#xA;I want, but after that it worked.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pi cluster fun</title>
      <link>https://miek.nl/2015/february/15/pi-cluster-fun/</link>
      <pubDate>Sun, 15 Feb 2015 16:21:00 +0000</pubDate>
      <guid>https://miek.nl/2015/february/15/pi-cluster-fun/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve bought 3 Raspberry Pis (B+, a week before the announcement of the Pi 2), and created&#xA;a little cluster with them. Each Pi is connected to wireless (192.168.1.0/24) and they share an&#xA;internal, wired, 10.248.0.0/16 network.&lt;/p&gt;&#xA;&lt;h2 id=&#34;virtual-ip&#34;&gt;Virtual IP&lt;/h2&gt;&#xA;&lt;p&gt;I want one IP address to be load balanced across the three Pis. This can be with the&#xA;&lt;a href=&#34;http://security.maruhn.com/iptables-tutorial/x8906.html&#34;&gt;CLUSTERIP&lt;/a&gt; target in &lt;code&gt;iptables&lt;/code&gt;. In&#xA;&lt;a href=&#34;http://www.raspbian.org/&#34;&gt;raspbian&lt;/a&gt; the kernel module for this was not enabled, but luckily&#xA;this was &lt;a href=&#34;https://github.com/raspberrypi/linux/issues/812&#34;&gt;fixed&lt;/a&gt; very quickly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>xmodmap is dead</title>
      <link>https://miek.nl/2014/october/28/xmodmap-is-dead/</link>
      <pubDate>Tue, 28 Oct 2014 20:18:00 +0000</pubDate>
      <guid>https://miek.nl/2014/october/28/xmodmap-is-dead/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m using an Apple keyboard at work since a day or two, but for some reason this keyboard&#xA;has a special key for eject, because in 1898 that was useful when you wanted to eject&#xA;a cdrom.&lt;/p&gt;&#xA;&lt;img alt=&#34;Apple Keyboard&#34; width=&#34;300px&#34; src=&#34;https://miek.nl/images/apple.jpg&#34; title=&#34;Apple keyboard with the eject key&#34; /&gt;&#xA;&lt;p&gt;Anyway making this key do something useful proved incredible painful, especially since&#xA;&lt;code&gt;xmodmap&lt;/code&gt; is deprecated and we should all use xkb (&lt;code&gt;setxkbmap&lt;/code&gt; and&lt;code&gt;xkbcomp&lt;/code&gt;). In our new&#xA;world of hotplugging everything this kinda makes sense (xmodmap settings are lost when your&#xA;USB keyboard goes to sleep).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vim live preview (sort of)</title>
      <link>https://miek.nl/2014/october/08/vim-live-preview-sort-of/</link>
      <pubDate>Wed, 08 Oct 2014 22:40:00 +0000</pubDate>
      <guid>https://miek.nl/2014/october/08/vim-live-preview-sort-of/</guid>
      <description>&lt;p&gt;When editing Markdown files or internet drafts in&#xA;&lt;a href=&#34;https://tools.ietf.org/html/rfc7328.html&#34;&gt;Pandoc&amp;rsquo;s Markdown&lt;/a&gt;, I wanted&#xA;to see some live preview window. I looked around a bit, but the solutions presented on the&#xA;Internet, seemed to be insufficient, either to clumsy or don&amp;rsquo;t work at all.&lt;/p&gt;&#xA;&lt;p&gt;My usual routine is: edit -&amp;gt; write -&amp;gt; make -&amp;gt; reload &amp;ldquo;rendered&amp;rdquo; file.&lt;/p&gt;&#xA;&lt;p&gt;Turns out you can automate most of this. Vim has a feature: &lt;code&gt;--servername &amp;lt;id&amp;gt;&lt;/code&gt; which&#xA;allows you to send commands to another vim instance using that &lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt;.&#xA;So we need two pieces to make this work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>grub_term_highlight_color</title>
      <link>https://miek.nl/2014/april/21/grub_term_highlight_color/</link>
      <pubDate>Mon, 21 Apr 2014 19:38:00 +0000</pubDate>
      <guid>https://miek.nl/2014/april/21/grub_term_highlight_color/</guid>
      <description>&lt;p&gt;During two Ubuntu 14.04 upgrades, both on a Mac (so needing an EFI boot), grub was borked&#xA;after the install resulting in a &lt;code&gt;grub rescue&lt;/code&gt; prompt when booting.&lt;/p&gt;&#xA;&lt;p&gt;The actual error was &lt;code&gt;error: symbol &#39;grub_term_highlight_color&#39; not found&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Needless to say I couldn&amp;rsquo;t get the system to boot from this prompt.&lt;/p&gt;&#xA;&lt;p&gt;I had a Fedora boot USB stick laying around, but using that did not really fix the problem, in any&#xA;case I could use it to copy off &lt;code&gt;/home&lt;/code&gt; if I could not rescue the system.&lt;/p&gt;</description>
    </item>
    <item>
      <title>i3</title>
      <link>https://miek.nl/2014/march/08/i3/</link>
      <pubDate>Sat, 08 Mar 2014 07:34:00 +0000</pubDate>
      <guid>https://miek.nl/2014/march/08/i3/</guid>
      <description>&lt;p&gt;GNOME 3 finally pushed me over the edge. After I brief stint with &lt;a href=&#34;http://cinnamon.linuxmint.com/&#34;&gt;cinnamon&lt;/a&gt;,&#xA;I decided the only thing left was to configure a tiling window manager and some tweaks to make it more&#xA;usable. For no reason at all, I settled on &lt;a href=&#34;http://i3wm.org/&#34;&gt;i3&lt;/a&gt;, which seems really nice and&#xA;simple to configure.&lt;/p&gt;&#xA;&lt;p&gt;But how to use i3 comfortable? i3 is a tiling window manager, which makes it ubercool, but with it&#xA;you loose things like automount, brightness keys, etc.; all the things you expect from a Linux&#xA;desktop nowadays. This blog item deals with getting the goodies from i3, without giving up&#xA;on all the other things you like. I basically use a lot of GNOME tools, but let them run&#xA;in the background.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Short kernel compile howto for Debian/Ubuntu</title>
      <link>https://miek.nl/2013/september/10/short-kernel-compile-howto-for-debian/ubuntu/</link>
      <pubDate>Tue, 10 Sep 2013 08:18:00 +0000</pubDate>
      <guid>https://miek.nl/2013/september/10/short-kernel-compile-howto-for-debian/ubuntu/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Download the kernel&amp;rsquo;s source from &lt;a href=&#34;http://kernel.org&#34;&gt;http://kernel.org&lt;/a&gt;;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Unpack it somewhere (will use &lt;code&gt;~/src/linux-3.11&lt;/code&gt; here);&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Copy the config from the distribution over;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt; cp /boot/config-3.8.0.30-generic ~/src/linux-3.11/.config&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Apply any patches;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Go to the kernel source and create an up to date config.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt; make oldconfig&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Just use the defaults for all the questions you&amp;rsquo;ll get;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Compile the kernel into a debian package for easy installation and&#xA;removal.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt; fakeroot make-kpkg --initrd -j 8 --revision 3.11custom kernel_image&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Install the resulting .deb file and reboot.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Macbook Air (6,1) 2013 model with Ubuntu</title>
      <link>https://miek.nl/2013/august/31/macbook-air-61-2013-model-with-ubuntu/</link>
      <pubDate>Sat, 31 Aug 2013 11:48:00 +0000</pubDate>
      <guid>https://miek.nl/2013/august/31/macbook-air-61-2013-model-with-ubuntu/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Assorted notes, not a step-by-step HOWTO!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;How to get Ubuntu Raring (13.04) up and running on your shining new MacbookAir. Note some things&#xA;are not working (yet). This is with 3.11:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;audio (speakers don&amp;rsquo;t work, plugged in headset does work), however see this&#xA;&lt;a href=&#34;https://bugzilla.kernel.org/attachment.cgi?id=107811&#34;&gt;latest patch&lt;/a&gt;;&lt;/li&gt;&#xA;&lt;li&gt;webcam (see &lt;a href=&#34;http://mactaris.blogspot.co.uk/2013/07/webcam-settings-20-will-support.html&#34;&gt;http://mactaris.blogspot.co.uk/2013/07/webcam-settings-20-will-support.html&lt;/a&gt; for a list of changes, it is not a UVC device anymore);&lt;/li&gt;&#xA;&lt;li&gt;after a resume the screen brightness only knows on/off.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Expectation for 3.12 (when released), everything is working, except:&lt;/p&gt;</description>
    </item>
    <item>
      <title>vim and editing pandoc2rfc</title>
      <link>https://miek.nl/2013/june/16/vim-and-editing-pandoc2rfc/</link>
      <pubDate>Sun, 16 Jun 2013 14:27:00 +0000</pubDate>
      <guid>https://miek.nl/2013/june/16/vim-and-editing-pandoc2rfc/</guid>
      <description>&lt;p&gt;&amp;hellip; or any other document format for that matter.&lt;/p&gt;&#xA;&lt;p&gt;I thought it might be nice to have some sort of split window view in that allows you to edit&#xA;a Pandoc file on the left and see the generated I-D on the right (in vim, with no extra daemons&#xA;and not relying on inotify).&lt;/p&gt;&#xA;&lt;p&gt;Turns out you can do that, though it is not optimal, but it works. The jury is still out if this&#xA;works well enough to actually make it useful.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Make GNOME3 usable</title>
      <link>https://miek.nl/2013/june/03/make-gnome3-usable/</link>
      <pubDate>Mon, 03 Jun 2013 18:50:00 +0000</pubDate>
      <guid>https://miek.nl/2013/june/03/make-gnome3-usable/</guid>
      <description>&lt;p&gt;GNOME3 in the default install is unusable, not as bad as Unity, but bad. Luckily&#xA;with some &lt;strike&gt;minor&lt;/strike&gt; tweaking it can be made to work quite nicely.&lt;/p&gt;&#xA;&lt;p&gt;These are some assorted notes on how I got stuff working the way I like.&lt;/p&gt;&#xA;&lt;p&gt;From a fresh Ubuntu install, install GNOME3:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo apt-get install gnome-desktop-environment&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Normal focus mode:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt; gsettings set org.gnome.desktop.wm.preferences focus-mode &#39;sloppy&#39;&#xA; gsettings set org.gnome.desktop.wm.preferences auto-raise false &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Extensions:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Persistent Synaptic Touchpad settings in Ubuntu 12.10&#43;</title>
      <link>https://miek.nl/2013/february/27/persistent-synaptic-touchpad-settings-in-ubuntu-12.10/</link>
      <pubDate>Wed, 27 Feb 2013 20:29:00 +0000</pubDate>
      <guid>https://miek.nl/2013/february/27/persistent-synaptic-touchpad-settings-in-ubuntu-12.10/</guid>
      <description>&lt;p&gt;I was wondering how to make my touchpad settings permanent in Ubuntu.&#xA;I could find a few pointers on the net, like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://tombuntu.com/index.php/2011/11/06/persistent-touchpad-configuration-in-ubuntu-11-10/&#34;&gt;http://tombuntu.com/index.php/2011/11/06/persistent-touchpad-configuration-in-ubuntu-11-10/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://ubuntuforums.org/archive/index.php/t-1538147.html&#34;&gt;http://ubuntuforums.org/archive/index.php/t-1538147.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;But sometimes it makes sense to look at your own system&amp;rsquo;s documentation:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;% cd /usr/share/X11/xorg.conf.d&#xA;% head 50-synaptics.conf&#xA;# Example xorg.conf.d snippet that assigns the touchpad driver&#xA;# to all touchpads. See xorg.conf.d(5) for more information on&#xA;# InputClass.&#xA;# DO NOT EDIT THIS FILE, your distribution will likely overwrite&#xA;# it when updating. Copy (and rename) this file into&#xA;# /etc/X11/xorg.conf.d first.&#xA;# Additional options may be added in the form of&#xA;#   Option &amp;quot;OptionName&amp;quot; &amp;quot;value&amp;quot;&#xA;#&#xA;Section &amp;quot;InputClass&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Which seems pretty obvious to me. I added&lt;/p&gt;</description>
    </item>
    <item>
      <title>Make me a sandwich, MAKE me a sandwich</title>
      <link>https://miek.nl/2013/january/30/make-me-a-sandwich-make-me-a-sandwich/</link>
      <pubDate>Wed, 30 Jan 2013 23:17:00 +0000</pubDate>
      <guid>https://miek.nl/2013/january/30/make-me-a-sandwich-make-me-a-sandwich/</guid>
      <description>&lt;p&gt;We all know this comic:&lt;/p&gt;&#xA;&lt;img src=&#34;http://imgs.xkcd.com/comics/sandwich.png&#34; /&gt;&#xA;&lt;p&gt;And now in &lt;code&gt;zsh&lt;/code&gt;!&lt;/p&gt;&#xA;&lt;p&gt;With the following snippet all commands that are started with an uppercase word&#xA;will be prefixed with &lt;code&gt;sudo &lt;/code&gt; and then executed.&lt;/p&gt;&#xA;&lt;p&gt;So &lt;em&gt;MAKE me a sandwich&lt;/em&gt;, becomes &lt;em&gt;sudo make me a sandwich&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;accept-line() {&#xA;    local B&#xA;    B=(${=BUFFER})&#xA;    if [[ &amp;quot;$B[1]&amp;quot; != [A-Z]* ]]; then&#xA;        zle .accept-line&#xA;        return&#xA;    fi&#xA;    if [[ $B[1] != &amp;quot;&amp;quot; &amp;amp;&amp;amp; $B[1] == $B[1]:u ]]; then&#xA;        BUFFER=&amp;quot;sudo $B[1]:l $B[2,-1]&amp;quot;&#xA;    fi&#xA;    zle .accept-line&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;And activate with:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vim as MANPAGER</title>
      <link>https://miek.nl/2013/january/19/vim-as-manpager/</link>
      <pubDate>Sat, 19 Jan 2013 18:59:00 +0000</pubDate>
      <guid>https://miek.nl/2013/january/19/vim-as-manpager/</guid>
      <description>&lt;p&gt;I like Vim, so I try to use it at many places. Like in my shell (&lt;code&gt;set -o vi&lt;/code&gt;), and&#xA;when writing and coding.&lt;/p&gt;&#xA;&lt;p&gt;After some Googling I found that Vim can also be used as a MANPAGER. But there is&#xA;one nagging issue. To quit viewing the manual page you have to type &amp;lsquo;:q&amp;rsquo;, which is&#xA;one keystroke more then when using &lt;code&gt;less&lt;/code&gt; as your MANPAGER&amp;hellip; Needless to say: this&#xA;is unacceptable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dynamic Syntax Highlighting in Vim</title>
      <link>https://miek.nl/2012/september/20/dynamic-syntax-highlighting-in-vim/</link>
      <pubDate>Thu, 20 Sep 2012 09:57:00 +0000</pubDate>
      <guid>https://miek.nl/2012/september/20/dynamic-syntax-highlighting-in-vim/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a huge fan of syntax highlighting in my editor Vim. One thing I started to&lt;br&gt;&#xA;miss was that user defined type miss out on the highlighting, because Vim does&lt;br&gt;&#xA;not know about them. Wouldn&amp;rsquo;t it be cool to have some sort of automatic support that&lt;br&gt;&#xA;detect &lt;em&gt;your&lt;/em&gt; types and adds them to the correct highlighting group? I call  &lt;br&gt;&#xA;this &amp;ldquo;dynamic syntax highlighting&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;As a proof-of-concept I took the &lt;a href=&#34;http://majutsushi.github.com/tagbar/&#34;&gt;tagbar                                     &lt;br&gt;&#xA;plugin&lt;/a&gt;, and modified it a little to take&#xA;advantage of the language detection (specifically the types). The modified code&#xA;can be found &lt;a href=&#34;https://github.com/miekg/tagbar&#34;&gt;in my fork on github&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
