<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Paul&#39;s page</title>
    <link>https://paul.totterman.name/</link>
    <description>Recent content on Paul&#39;s page</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 01 Feb 2024 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://paul.totterman.name/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>NixOS Mailer</title>
      <link>https://paul.totterman.name/posts/nixos-mailer/</link>
      <pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/nixos-mailer/</guid>
      <description>&lt;p&gt;There has been a lot of talk in recent years how running your own email server
is too hard. But it&amp;rsquo;s quite healthy for the email ecosystem to not have everyone
use Gmail and Outlook. In my experience it isn&amp;rsquo;t too hard, just takes some work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Caddy plugins on NixOS</title>
      <link>https://paul.totterman.name/posts/caddy-plugins-nixos/</link>
      <pubDate>Mon, 12 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/caddy-plugins-nixos/</guid>
      <description>&lt;p&gt;Caddy is a very handy HTTP server with lots of built-in features. But every once
in a while you need something more. Fortunately Caddy has a plugin API. But
Caddy being written in Go, the plugins need to be added at compile-time. On
NixOS, there are no plugins added by default, and there are a couple of things
to note when adding them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generic &#34;must&#34; helper for Go</title>
      <link>https://paul.totterman.name/posts/golang-generic-must/</link>
      <pubDate>Fri, 19 May 2023 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/golang-generic-must/</guid>
      <description>&lt;p&gt;Go error handling can be a bit verbose. There are a lot of places where errors
are unlikely or where they are so critical that a panic is preferred. Because of
this there are lots of &lt;code&gt;Must*&lt;/code&gt; -helpers in various packages. E.g.
&lt;a href=&#34;https://pkg.go.dev/regexp#MustCompile&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;regexp.MustCompile&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker Multiarch Builds</title>
      <link>https://paul.totterman.name/posts/docker-multiarch-builds/</link>
      <pubDate>Fri, 28 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/docker-multiarch-builds/</guid>
      <description>&lt;p&gt;Like many other developers, I have to work with computers with different
processor architectures. For me it&amp;rsquo;s amd64 (x86_64) on the laptop and arm64
(aarch64) on the server. For some it may be the other way around. Fortunately I
mostly write Go, which makes cross-compilation quite easy. Docker adds some
extra steps, but is very nice for deploying software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploy Hugo to NixOS on Push to Gitea</title>
      <link>https://paul.totterman.name/posts/gitea-push-deploy-nixos/</link>
      <pubDate>Tue, 28 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/gitea-push-deploy-nixos/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;There are several ways to automate blog publishing from git push. This one is
mine. Mostly notes for future self. I use &lt;a href=&#34;https://gitea.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gitea&lt;/a&gt;,
&lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt;, &lt;a href=&#34;https://caddyserver.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Caddy&lt;/a&gt; and
&lt;a href=&#34;https://nixos.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NixOS&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>WebAuthn &amp; Base64 encoding</title>
      <link>https://paul.totterman.name/posts/webauthn-base64/</link>
      <pubDate>Thu, 16 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/webauthn-base64/</guid>
      <description>&lt;p&gt;I recently ran into a problem that seems to be present in a wide range of
&lt;a href=&#34;https://www.w3.org/TR/webauthn-2/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;WebAuthn&lt;/a&gt;  tutorials, but I don&amp;rsquo;t know where
it originated.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH PKI on top of Web PKI</title>
      <link>https://paul.totterman.name/posts/ssh-pki-web-pki/</link>
      <pubDate>Tue, 28 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/ssh-pki-web-pki/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Reading &lt;a href=&#34;https://utcc.utoronto.ca/~cks/space/blog/tech/InternetPKIViaWebPKI&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Future Internet PKI schemes need to be bootstrapped through web
PKI&lt;/a&gt; I was
reminded by all the problems I&amp;rsquo;ve had with SSH (Secure SHell) PKI (Public Key
Infrastructure). SSH host verification is trust-on-first-use (TOFU). So SSH is
protected from man-in-the-middle (MITM) attacks unless the first connection
falls prey to the attack.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Molly Guard for Ansible</title>
      <link>https://paul.totterman.name/posts/ansible-molly-guard/</link>
      <pubDate>Fri, 11 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/ansible-molly-guard/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;http://catb.org/jargon/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Jargon File&lt;/a&gt; defines &lt;a href=&#34;http://catb.org/jargon/html/M/molly-guard.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Molly
Guard&lt;/a&gt; as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A shield to prevent tripping of some Big Red Switch by clumsy or ignorant
hands. Originally used of the plexiglass covers improvised for the BRS on an
IBM 4341 after a programmer&amp;rsquo;s toddler daughter (named Molly) frobbed it twice
in one day. Later generalized to covers over stop/reset switches on disk
drives and networking equipment. In hardware catalogues, you&amp;rsquo;ll see the much
less interesting description “guarded button”.&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Menu-driven Matrix Bot Interaction</title>
      <link>https://paul.totterman.name/posts/matrix-menu-bot/</link>
      <pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/matrix-menu-bot/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a huge fan of &lt;a href=&#34;https://matrix.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Matrix&lt;/a&gt;. A lot of the user value of
modern chat platforms like Slack, Matrix and Discord (even IRC) comes from
integrations to other services via bots. I had high hopes for &lt;a href=&#34;https://github.com/matrix-org/matrix-spec-proposals/pull/3006&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MSC3006: Bot
Interactions&lt;/a&gt;,
but unfortunately it isn&amp;rsquo;t currently being pushed further. However, there exists
an implementation of &lt;a href=&#34;https://github.com/matrix-org/matrix-spec-proposals/pull/3381&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;MSC3381:
Polls&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectively running single role in Ansible</title>
      <link>https://paul.totterman.name/posts/ansible-role/</link>
      <pubDate>Wed, 10 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/ansible-role/</guid>
      <description>&lt;p&gt;While I&amp;rsquo;ve been switching from Ansible to Nix lately, I still use Ansible and
have written a fair share of Ansible YAML. A common trick I&amp;rsquo;ve used is to only
run a specific Ansible role instead of the whole playbook. That can be achieved
by using tags, but usually I haven&amp;rsquo;t tagged everything before I have the need.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shorter wrapped error handling in Go</title>
      <link>https://paul.totterman.name/posts/golang-shorter-wrapped-errors/</link>
      <pubDate>Mon, 30 May 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/golang-shorter-wrapped-errors/</guid>
      <description>&lt;p&gt;With &lt;a href=&#34;https://go.dev/blog/go1.13-errors&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go 1.13&lt;/a&gt; error wrapping was
standardised with an interface in the standard library. When properly handling
errors, you end up dealing with it a lot. The blog post suggests the following:&lt;/p&gt;
&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-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;QueryError&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;errors&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;As&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#75715e&#34;&gt;// err is a *QueryError, and e is set to the error&amp;#39;s value
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Generic pointer of value with Go</title>
      <link>https://paul.totterman.name/posts/golang-generic-pointer/</link>
      <pubDate>Wed, 18 May 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/golang-generic-pointer/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been writing a decent amount of Go during the past 8 years. While I like many
things about Go, some of the design choices result in repetitive or longer
than necessary code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GlitchTip on arm64</title>
      <link>https://paul.totterman.name/posts/glitchtip-arm64/</link>
      <pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/glitchtip-arm64/</guid>
      <description>&lt;p&gt;Why does everything have to be so hard on arm64? Well, maybe not directly hard,
but a lot more work. And the reason is simple, we live almost in a amd64
monoculture. Mobile phones are changing that, as is Apple M1, but also arm64
servers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Roborock S6 Pure Troubleshooting</title>
      <link>https://paul.totterman.name/posts/roborock-s6-pure-troubleshooting/</link>
      <pubDate>Fri, 15 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/roborock-s6-pure-troubleshooting/</guid>
      <description>&lt;p&gt;We have a &lt;a href=&#34;https://en.wikipedia.org/wiki/Roborock&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Roborock&lt;/a&gt; &lt;a href=&#34;https://global.roborock.com/pages/roborock-s6&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;S6 Pure robotic
vacuum cleaner&lt;/a&gt;. It&amp;rsquo;s very nice
having a device that more or less cleans the floors by itself. When it works.
Ours stopped working a week ago, after working well for months.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Matrix Bot for the reMarkable eInk Tablet</title>
      <link>https://paul.totterman.name/posts/remarkable-matrix/</link>
      <pubDate>Tue, 12 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/remarkable-matrix/</guid>
      <description>&lt;p&gt;I own a &lt;a href=&#34;https://remarkable.com/referral/B3NW-4LBN&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;reMarkable 2 (referral
link)&lt;/a&gt; eInk tablet. It&amp;rsquo;s pretty nice
(except lately the manufacturer has tacked on a subscription service). And it
can send documents as PDFs via email. But unlike the Kindle, you cannot send
documents to the tablet via email. Well, there exists a &lt;a href=&#34;https://remailable.getneutrality.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;third party
service&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I saw &lt;a href=&#34;https://old.reddit.com/r/RemarkableTablet/comments/sbz707/telegram_bot_instead_of_mobile_app_and_connect/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;someone post on
reddit&lt;/a&gt;
that they wrote a Telegram bot that can be used to upload documents to their
reMarkable. That sounded interesting, but I&amp;rsquo;m partial to
&lt;a href=&#34;https://matrix.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Matrix&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>coturn for Ubuntu Jammy (22.04 LTS)</title>
      <link>https://paul.totterman.name/posts/coturn-ubuntu-jammy/</link>
      <pubDate>Mon, 11 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/coturn-ubuntu-jammy/</guid>
      <description>&lt;p&gt;Today I had to install &lt;a href=&#34;https://github.com/coturn/coturn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;coturn&lt;/a&gt; on Ubuntu
22.04 (Jammy Jellyfish). It doesn&amp;rsquo;t have
&lt;a href=&#34;https://packages.ubuntu.com/search?keywords=coturn&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;package&lt;/a&gt; available because
of a &lt;a href=&#34;https://bugs.launchpad.net/ubuntu/&amp;#43;source/coturn/&amp;#43;bug/1967018&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;bug&lt;/a&gt;. But
there&amp;rsquo;s a solution on the bugtracker, so I decided to build my own package. It
has been a while since I last did it, so here are the steps for reference:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blog Comments with Matrix Using Cactus Comments</title>
      <link>https://paul.totterman.name/posts/cactus-comments/</link>
      <pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/cactus-comments/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not sure if comments improve blogs, but I&amp;rsquo;m willing to try. But my blog is a
static site and I don&amp;rsquo;t like the idea of forcing &lt;!-- raw HTML omitted --&gt;Disqus&lt;!-- raw HTML omitted --&gt; on readers of my blog. Luckily there exists a project
built on &lt;a href=&#34;https://matrix.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;matrix&lt;/a&gt; for adding comments to your site.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Login Using Already Existing Matrix Account</title>
      <link>https://paul.totterman.name/posts/matrix-login/</link>
      <pubDate>Thu, 31 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/matrix-login/</guid>
      <description>&lt;p&gt;I have a deep interest in both &lt;a href=&#34;https://matrix.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;matrix&lt;/a&gt; and different
authentication schemes. When I saw the &lt;a href=&#34;https://news.ycombinator.com/item?id=29240154&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;HN discussion about &amp;ldquo;Sign in with
Matrix&amp;rdquo;&lt;/a&gt;, I thought I could
probably come up with something better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Guide for Free Matrix Home Server</title>
      <link>https://paul.totterman.name/posts/matrix-server-guide/</link>
      <pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/matrix-server-guide/</guid>
      <description>&lt;p&gt;Having been on the Internet for decades, I&amp;rsquo;ve seen the growth of walled gardens
and the associated problems. I hate it. Especially the messaging walled gardens.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RFC7807 - Problem Details for HTTP APIs</title>
      <link>https://paul.totterman.name/posts/rfc7807/</link>
      <pubDate>Thu, 24 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/rfc7807/</guid>
      <description>&lt;p&gt;At some point when implementing HTTP APIs, just logging &amp;ldquo;error&amp;rdquo; and returning an
empty response doesn&amp;rsquo;t cut it anymore. Good practise with REST APIs suggests
returning a suitable HTTP status code, i.e. something other than 200 OK.&lt;/p&gt;</description>
    </item>
    <item>
      <title>JWT Debugging</title>
      <link>https://paul.totterman.name/posts/jwt/</link>
      <pubDate>Wed, 23 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/jwt/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;I need to remember to not stop at the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>NixOS on Oracle Cloud</title>
      <link>https://paul.totterman.name/posts/nixos-oracle-cloud/</link>
      <pubDate>Thu, 17 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/nixos-oracle-cloud/</guid>
      <description>&lt;p&gt;Oracle Cloud offers nice free virtual machines, but there was no installation
image for NixOS. Luckily &lt;a href=&#34;https://github.com/elitak/nixos-infect&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NixOS-infect&lt;/a&gt;
worked really great.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Free clouds</title>
      <link>https://paul.totterman.name/posts/free-clouds/</link>
      <pubDate>Tue, 15 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/free-clouds/</guid>
      <description>&lt;p&gt;Comparison of free cloud offerings (2023/08):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unprofessional Support in MacHuolto, start of a blog</title>
      <link>https://paul.totterman.name/posts/machuolto/</link>
      <pubDate>Sat, 15 Sep 2007 00:00:00 +0000</pubDate>
      <guid>https://paul.totterman.name/posts/machuolto/</guid>
      <description>&lt;p&gt;First, some background. I have an iBook G4 12&amp;quot; that I bought in August 2005, so
that I would have a handy laptop during my studies. I also bought AppleCare,
because I thought it would be better to pay 300€ extra to be sure that the
laptop would serve me at least three years, instead of the one year default
warranty. Of that decision, I&amp;rsquo;m glad.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
