<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de"><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://blog.uvokchee.de/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.uvokchee.de/" rel="alternate" type="text/html" hreflang="de" /><updated>2026-03-01T12:16:46+01:00</updated><id>https://blog.uvokchee.de/feed.xml</id><title type="html">Uvoks Blog</title><subtitle>Ein Blog über Technik - und gelegentlich über Leben. Blog und Homepage von uvok cheetah.</subtitle><entry xml:lang="en"><title type="html">Using Passkeys under GrapheneOS with KeePassDX</title><link href="https://blog.uvokchee.de/2026/03/using-passkeys-under-grapheneos-with-keepassdx.html" rel="alternate" type="text/html" title="Using Passkeys under GrapheneOS with KeePassDX" /><published>2026-03-01T12:07:00+01:00</published><updated>2026-03-01T12:07:00+01:00</updated><id>https://blog.uvokchee.de/2026/03/using-passkeys-under-grapheneos-with-keepassdx</id><content type="html" xml:base="https://blog.uvokchee.de/2026/03/using-passkeys-under-grapheneos-with-keepassdx.html"><![CDATA[<p>I’m a (relatively) long-time user of GrapheneOS. As password manager, I’ve been using
        <a href="https://f-droid.org/en/packages/com.kunzisoft.keepass.libre/">KeePassDX</a> for quite
        a while. I’ve been happy to hear when they introduced
        <a href="https://github.com/Kunzisoft/KeePassDX/blob/4.3.2/CHANGELOG#L52">passkey support</a>,
        but for some reason, it never worked for me, and I always shrugged it off.</p>
      <p>Today, I encountered a service that uses passkeys again, and I wondered,
        “wtf, this can’t be”. The browser (Firefox, Vanadium) always showed an error
        and did nothing.</p>
      <p>So, I checked
        <code class="language-plaintext highlighter-rouge">Settings &gt; Passwords, Passkeys and accounts &gt; Preferred service</code>,
        and indeed it said “KeePassDX”. So I checked KeePassDX settings - nothing
        said “enable passkey support” in particular. So… I set the preferred service
        to <code class="language-plaintext highlighter-rouge">None</code>, reset it to <code class="language-plaintext highlighter-rouge">KeePassDX</code>, and… suddenly, passkeys worked.</p>
      <p>Yeah. Whatever. Introducing new features to software can break things, I know
        this from my own job. No idea if the bug lies in KeePassDX, or GrapheneOS
        (passkeys were a new feature there as well?). But now, apparently, I could use
        passkeys.</p>
      <p>Aside, personally, I find storing passkeys in a password database no different to
        storing secure randomly generated ~20 character passwords. But I am no security expert,
        so don’t count on my opinion.</p>
      ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[How to properly enable Passkey usage under GrapheneOS with KeePassDX]]></summary></entry><entry xml:lang="en"><title type="html">Quick Link: European Alternatives</title><link href="https://blog.uvokchee.de/2026/02/european-alternatives.html" rel="alternate" type="text/html" title="Quick Link: European Alternatives" /><published>2026-02-24T19:53:00+01:00</published><updated>2026-02-24T19:53:00+01:00</updated><id>https://blog.uvokchee.de/2026/02/european-alternatives</id><content type="html" xml:base="https://blog.uvokchee.de/2026/02/european-alternatives.html"><![CDATA[<p>Just in case you haven’t found the page yet,
      <a href="https://european-alternatives.eu/">european-alternatives.eu</a>
      lists, well, as the name says, European alternatives for various internet
      services. You might give it a look.</p>
    <p>I actually went to this page to find my new mail provider(s).</p>
    <p>Aside: I find it funny that there are mail provider that offer you
      cheap plans which limit the number of mails you can send/receive per day.
      Which is funny, since I fucked something up when upgrading my servers, which
      resulted in me getting a “cronjob failed” mail every five minutes, and I only
      noticed that in the evening.</p>
    ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Just in case you haven’t found the page yet, european-alternatives.eu lists, well, as the name says, European alternatives for various internet services. You might give it a look.]]></summary></entry><entry><title type="html">Updating my servers to Trixie</title><link href="https://blog.uvokchee.de/2026/02/updating-my-servers-to-trixie.html" rel="alternate" type="text/html" title="Updating my servers to Trixie" /><published>2026-02-21T16:06:00+01:00</published><updated>2026-02-21T16:06:00+01:00</updated><id>https://blog.uvokchee.de/2026/02/updating-my-servers-to-trixie</id><content type="html" xml:base="https://blog.uvokchee.de/2026/02/updating-my-servers-to-trixie.html"><![CDATA[<p>It’s about time.
    Debian Trixie has been released in August 2025. I finally got around
    to gather my motivation to execute the update.</p>
  <p>I have like 5 VPS, all running Debian. Still running Bookworm until recently.
    So over the past two weeks, I upgraded the servers step by step, going with
    the “least problematic” servers first. (Gut feeling).</p>
  <p>Turns out, my intuition was relatively right.
    What confused me extremely is that the upgrade notes appear to have moved to
    <a href="https://www.debian.org/releases/trixie/release-notes/upgrading.html">a readthedocs look like page</a>.
    Previously, iirc, it was always a chapter in the Debian Handbook.</p>
  <p>So, the pain points of Debian updates, for me, always is the config file
    updates. Usually, I want to keep my changes, but use some of the
    package maintainers changes. It’s frustrating for me that Debian asks me for
    a decision in the middle of an upgrade. I’d actually like an option,
    “just continue with the upgrade, keeping my config, for now”. Which
    could be problematic for major upgrades with option deprecations I guess?
    There probably is even some option for this (dpkg-reconfigure debconf?),
    and I just haven’t RTFM. As it happened in the past.</p>
  <p>The actual <strong>major</strong> pain point was indeed the last server.
    I’ve been accumulating various questionable packages on this one,
    for some reason, I installed ffmpeg in the past, which means there were
    lot of X-related libraries pulled in. During the cleanup, I unwisely
    must’ve fired off some purge command<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>… Which I acknowledged without
    looking properly. The result was that my entire /etc/letsencrypt
    directory was erased, as I used the distro-supplied certbot in the past.
    I just removed the package at some point and installed certbot via pip.
    So Debian/dpkg still thought that directory needed cleanup. Ooops.
    So I spent yesterday evening, extremely frustrated, fiddling with the
    nginx config manually, adding temporary fake certs/keys, so that nginx
    would start at all, so that certbot could work, and I could re-add
    the certificates again.</p>
  <p>The second biggest pain point is Python virtual environments. Since
    Debian upgrades always(?) update the Python minor version, all existing
    venv’s stop working, since a) they are created with a pointer to,
    e.g. <code class="language-plaintext highlighter-rouge">/usr/bin/python3.11</code>, and b) packages/modules go into a
    version-specific site-packages subdirectory. So, the procedure always
    is go through all of them, recreate the venv, reinstall all packages,
    hope it still works. In my case, even the Python script that 
    triggers buildbot builds didn’t work anymore, because
    <code class="language-plaintext highlighter-rouge">from future.utils import itertools</code><sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> didn’t work anymore,
    and needed to be replaced by <code class="language-plaintext highlighter-rouge">dict.items()</code>. And my looking glass
    didn’t work no more because apparently Python stopped shipping
    the <code class="language-plaintext highlighter-rouge">cgi</code> module. The current “replacement” seems to be
    <a href="https://pypi.org/project/legacy-cgi/">legacy-cgi</a>.
    I have no “proper” solution for this yet.</p>
  <p>Lesson learned: Read the fucking output before you hit enter.</p>
  <div class="footnotes" role="doc-endnotes">
    <ol>
      <li id="fn:1" role="doc-endnote">
        <p>Via ansible, nonetheless. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
      <li id="fn:2" role="doc-endnote">
        <p><a href="https://github.com/buildbot/buildbot/blob/master/master/contrib/git_buildbot.py#L26">contrib script</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
    </ol>
  </div>
  ]]></content><author><name>uvok</name></author><summary type="html"><![CDATA[Reports on upgrading Debians servers. What went well. What went wrong.]]></summary></entry><entry xml:lang="en"><title type="html">Getting started with Verilog</title><link href="https://blog.uvokchee.de/2026/01/getting-started-with-verilog.html" rel="alternate" type="text/html" title="Getting started with Verilog" /><published>2026-01-06T15:52:00+01:00</published><updated>2026-01-06T15:52:00+01:00</updated><id>https://blog.uvokchee.de/2026/01/getting-started-with-verilog</id><content type="html" xml:base="https://blog.uvokchee.de/2026/01/getting-started-with-verilog.html"><![CDATA[<p>After I got my <a href="/2025/12/fpga-dev-board.html">FPGA dev board</a>, I
    have several books in my virtual library (Humble Bundle etc.) and decided to
    start with Verilog. The book contained a few exercises which I tried to
    implement. After getting a feeling for the language - which took some time to be
    honest - my second step was to implement the CPU from
    <a href="https://nandgame.com/">Nandgame</a>. (1)</p>
  <p>I actually even thought about writing an assembler for the “machine” (2).  But
    then again, I only tested the CPU and the Verilog modules in test benches so
    far.  I haven’t loaded anything of that on my dev board, nor did I think about
    how I can “properly” simulate the CPU, including “loading” a program and viewing
    its state.</p>
  <p>I <em>think</em> I need to play around with Verilator for that, which allows
    translating Verilog code to C++. This way, I should be able to control the CPU
    and also view its state.  I’ll take a look at
    <a href="https://www.nand2tetris.org/">nand2tetris</a>, which, to my knowledge, also
    contains a section about that topic. Its architecture is similar, though it uses
    a different instruction set.</p>
  <p>Even playing Nandgame the first time - way back then - gave me a good insight on
    how CPUs work.  Implementing one in Verilog makes things click further.  Well,
    at least for simple architectures. I still have no idea how pipelining works,
    and all the details that entails, nor how multi-cycle-instructions work.  That’s
    probably for another time.</p>
  <p>You can view the code I wrote so far <a href="https://git.uvok.de/fpga-exper/tree/?h=main">in my git
      repository</a>.</p>
  <p>(1) Tools that helped me were Icarus Verilog, Verilator and GTKwave, which are
    all contained on the <a href="https://github.com/YosysHQ/oss-cad-suite-build">OSS CAD
      Suite</a>.  That is, both linting
    and test benches.</p>
  <p>(2) So I started with writing a disassembler first. I wanted to develop a nice
    syntax first, because I don’t like the syntax nand2tetris introduces. That’s not
    “proper assembler” for me. One of the special things of the architecture is that
    you can have multiple “destinations” for an operation, though - or none at all.
    To my shame, I used an LLM to get inspiration how the language could look like.</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[First experiments with Verilog, mostly simuluated.]]></summary></entry><entry xml:lang="en"><title type="html">FPGA development board</title><link href="https://blog.uvokchee.de/2025/12/fpga-dev-board.html" rel="alternate" type="text/html" title="FPGA development board" /><published>2025-12-26T16:31:00+01:00</published><updated>2025-12-26T16:31:00+01:00</updated><id>https://blog.uvokchee.de/2025/12/fpga-dev-board</id><content type="html" xml:base="https://blog.uvokchee.de/2025/12/fpga-dev-board.html"><![CDATA[<p>For quite some time now, I wanted to experiment with FPGAs. As it is,
    there’s lack of time, energy and motivation. And, also for me, the
    urge to “find the perfect solution”, in this case, the perfect
    development board.</p>
  <p>As COVID hit me for this years’ Christmas, I had a lot of time. And also boredom.
    By chance I stumbled upon the Tang Nano 9K development board. It’s surprisingly cheap,
    and it could even run a picoRISC-V, something I wanted to play around with as well.</p>
  <p>Alas. When looking at where to get it, the only solution was to get it from
    AliExpress / China. It’s not available at any European distributors, apparently.
    (For ecological reasons, I don’t want to order there anymore. I don’t want to
    participate in this Temu, and whatever these the other shops are called, hype.)</p>
  <p>So I already put the project off the table, When suddenly EBay notified me
    a German individual put one for sale. Yes, you may criticize me for that,
    since the board still comes from China, but I find in more bearable for myself
    to buy used stuff.</p>
  <p>So anyway, here it is:</p>
  <p><img src="https://pics.uvokchee.de/i.php?/upload/2025/12/26/20251226151945-1fcae629-la.jpg" alt="Photo of an PCB. It is a Sipeed Tang Nano 9K, an FPGA development board." /></p>
  <p>I already started playing around with it, you can follow my learning progress
    on my <a href="https://git.uvok.de/fpga-exper/">Git repository</a>.</p>
  <p>I have next to no knowledge of this topic altogether, so it’s something entirely
    new for me! Exciting!</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Showing off my FPGA dev board.]]></summary></entry><entry xml:lang="en"><title type="html">GLC 2025 Con report</title><link href="https://blog.uvokchee.de/2025/12/glc-2025-con-report.html" rel="alternate" type="text/html" title="GLC 2025 Con report" /><published>2025-12-18T18:23:00+01:00</published><updated>2025-12-18T18:23:00+01:00</updated><id>https://blog.uvokchee.de/2025/12/glc-2025-con-report</id><content type="html" xml:base="https://blog.uvokchee.de/2025/12/glc-2025-con-report.html"><![CDATA[<p>A very late con report. There’s not that much memories left of it. This report is
    stitched together from notes I made. I probably forgot some things. Oh well :D.
    It must still be mentioned!</p>
  <h2 id="tuesday-2025-10-28">Tuesday, 2025-10-28</h2>
  <p>The trip from Würzburg in one go is too long for me. Also,
    the best train connection from Frankfurt starts at like 8 a.m.
    I’d have to start from Würzburg about one hour before that.</p>
  <p>Since that’s too early in the morning for me, I started one day early.
    A fellow furry, F1fth, offered to let me stay the night on the couch :D.
    Warm thanks for that.</p>
  <h2 id="wednesday-2025-10-29">Wednesday, 2025-10-29</h2>
  <p>In the train to Switzerland. Traveling is so much nicer in company!</p>
  <p>With F1fth, Leso, schMA, H3xe and Jonas, the time went by quickly.
    The first view of the alps was as beautiful as ever.</p>
  <p><img src="https://pics.uvokchee.de/i.php?/upload/2025/12/18/20251218170031-9a2277a1-la.jpg" alt="Photo taken from inside the bus, showing the mountains." /></p>
  <p>There was “Schienenersatzverkehr” because of construction work, so part
    of the trip was by bus instead of by train. It went pretty well, though.
    For the last part of the trip, we saw a cow pissing (from inside the bus
    while driving by). That was pretty funny. Situationskomik.</p>
  <p>Registration at the con went smoothly and relatively quickly,
    and I already did the first tasks for the scavenger hunt.</p>
  <p><img src="https://pics.uvokchee.de/_data/i/upload/2025/12/18/20251218170032-8b05b7ec-me.jpg" alt="Photo of the con book listing the scavenger hunt tasks." /></p>
  <p>Also on the first day, I already met so many people I either haven’t met in
    a long time, or only knew from the internet:
    FoxbrushTailwag, Ookami, LabWolf, Nerkitt, Neirin, CJ, StripeyYena and Takiwuff.
    That makes me happy, especially since I struggle with that mentally
    (“I know nobody” / “Nobody knows me anyway…”).</p>
  <h2 id="thursday-2025-10-30">Thursday, 2025-10-30</h2>
  <p>Took a small walk in the morning. The climb made it quite exhausting.
    But the view was worth it!</p>
  <p><img src="https://pics.uvokchee.de/i.php?/upload/2025/12/18/20251218170032-1383a7f7-la.jpg" alt="Photo of a mountain path/street, going downhill, showing some houses of the village,       the mountains, and the valleys filled with clouds." /></p>
  <p>So, what else were the events that day? The snack exchange! 
    There were many nice snacks, and I even tried some of the licorice liqueur.
    The whole day ended in a food coma.</p>
  <p>The place around the campfire was popular as well.
    It was down by the hostel, where you had a superb view on the mountains,
    and also where the pool was located.</p>
  <p><img src="https://pics.uvokchee.de/i.php?/upload/2025/12/18/20251218170033-bafa9166-me.jpg" alt="Photo of Kazookie, the dinosaur-lynx, wearing armor, a sword, and a shield.       The green fur blends well with the green grass." /></p>
  <p>Also, I bought some furry artwork in the Dealers Den, and then watched the
    dance competition in the evening. Everyone performed really well.</p>
  <h2 id="friday-2025-10-31">Friday, 2025-10-31</h2>
  <p>I helped cutting bread for breakfast in the kitchen - with an industrial machine.
    And I even managed to keep all my fingers :D.
    Also, I helped drying the dishes the day before. Helping in the kitchen is
    important for a furry-only managed convention.</p>
  <p>Also, that day was the Maid Cafe, which was pretty popular.
    And I also got a massage from a fellow furry, which was really nice,
    since I had some shoulder problems during the con.</p>
  <h2 id="saturday-2025-11-01">Saturday, 2025-11-01</h2>
  <p>I did a night-time walk at 2 a.m. because I woke up in the middle of the night (again)
    and couldn’t go back to sleep. After the walk, I could sleep some more, though.
    The sleep problems continued the other days, though. I blame the mattress.
    Or my back in general.</p>
  <p>That day, there was the group photo, I went down to Meiringen with schMA via the gondola,
    and in the afternoon, there was the jam session, in which I even played some guitar.</p>
  <p><img src="https://pics.uvokchee.de/i.php?/upload/2025/12/18/20251218170034-606a0dba-la.jpg" alt="photo taken from inside a gondola going downwards. A village and the mountains can be seen." /></p>
  <p>In the evening, I go to do some mixing at the video table for the live stream!
    A whole new experience for me.</p>
  <p><img src="https://pics.uvokchee.de/_data/i/upload/2025/12/18/20251218170035-8242bc98-me.jpg" alt="Photo of a video mix table." /></p>
  <h2 id="sunday-2025-11-02">Sunday, 2025-11-02</h2>
  <p>After breakfast, packing, helping cleaning the tables in the dining room, I returned
    to my room to find the con cat on the bedding :o. I left the window to the room tiled open,
    so he or she must’ve slipped in.</p>
  <p><img src="https://pics.uvokchee.de/i.php?/upload/2025/12/18/20251218170035-f6e9cb34-me.jpg" alt="Photo of a cat (black-brown striped) on bedding, looking smug." /></p>
  <p>Then it was already time to travel back to Frankfurt.
    It was a nice journey, with the same group as the way to Switzerland.</p>
  <p>The last part back to Würzburg was a catastrophe, though.
    The train was running late, <em>and</em> had to be re-routed around Aschaffenburg.
    I arrived sometime around 11 or shortly before midnight back at home.</p>
  ]]></content><author><name>uvok</name></author><category term="furry" /><summary type="html"><![CDATA[How the GLC 2025 went for me.]]></summary></entry><entry xml:lang="en"><title type="html">Packing Worries</title><link href="https://blog.uvokchee.de/2025/10/packing-worries.html" rel="alternate" type="text/html" title="Packing Worries" /><published>2025-10-28T16:31:00+01:00</published><updated>2025-10-28T16:31:00+01:00</updated><id>https://blog.uvokchee.de/2025/10/packing-worries</id><content type="html" xml:base="https://blog.uvokchee.de/2025/10/packing-worries.html"><![CDATA[<p>So, the next furry con is coming up (Golden Leaves Con) and I’m
    hella stressed about packing.</p>
  <p>I like to travel with minimum luggage, so I don’t have to
    haul around several kilograms.
    (I’m going by train, of course).
    Sure, some things can be bought
    at the destination, but that 1) might be more expensive and
    2) I either need to carry everything back or toss it, which
    is a waste of resources and/or money. Especially when I think
    about those small cosmetics containers with toothpaste, shampoo,
    and stuff.</p>
  <p>Only from volume, clothing takes up a lot. Which is why I want
    to take as little as possible. Which mostly results in me taking
    only one pair of shoes. Although two would be more appropriate
    sometimes. Anyway, the “cosmetics” bag alone is 1.4 kilograms.
    (Including the toothbrush, electric shaver, soap, etc.)</p>
  <p>And then there’s this thing “did I pack everything I need”.
    Most worrying are things you can’t buy at the destination
    (e.g. medical supplies).
    Or maybe those are just “proxy worries” for the con itself.
    I don’t know myself enough to assess that.</p>
  <p>Anyway, I’m actually looking forward to the con, and hope I
    can “switch off” my worries to actually enjoy it.</p>
  <p>PS: You know this “ohhh, wait, let me open the bag again and
    check if I packed that specific thing”?</p>
  ]]></content><author><name>uvok</name></author><category term="furry" /><summary type="html"><![CDATA[A con is coming up. What should I pack?]]></summary></entry><entry xml:lang="en"><title type="html">Gadgetbridge won’t sync my calendar events to my Pebble</title><link href="https://blog.uvokchee.de/2025/09/gadgetbridge-won-t-sync-my-calendar-events-to-my-pebble.html" rel="alternate" type="text/html" title="Gadgetbridge won’t sync my calendar events to my Pebble" /><published>2025-09-15T18:40:00+02:00</published><updated>2025-09-15T18:40:00+02:00</updated><id>https://blog.uvokchee.de/2025/09/gadgetbridge-won-t-sync-my-calendar-events-to-my-pebble</id><content type="html" xml:base="https://blog.uvokchee.de/2025/09/gadgetbridge-won-t-sync-my-calendar-events-to-my-pebble.html"><![CDATA[<p><strong>TL;DR</strong>: Create a new calendar event.</p>
  <p>After a friend of mine 3d-printed me a new back cover for my Pebble classic
    (I fucked up the screw holes, probably by screwing them too tight), I
    reactivated my Pebble, by pairing it with Gadgetbridge again.</p>
  <p>First, pairing itself was a PITA. Gadgetbridge would show the pairing screen,
    Android would show its pairing screen, I would acknowledge on Android, then
    on the Pebble, and then Gadgetbridge would endlessy show a spinner.
    Also, the Pebble wasn’t paired with Android.</p>
  <p>So I manually paired the watch with Android in the OS, and then in GB. Fine.</p>
  <p>But then, calendar events wouldn’t be synced, although I enabled the setting in GB.
    Disconnecting/Reconnecting multiple times didn’t help. What <strong>did</strong> help was
    creating a new calendar event. For some reason, only this seems to trigger syncing.</p>
  <p>Infuriating.</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Working around non-working event sync.]]></summary></entry><entry xml:lang="en"><title type="html">Installing CA certificates on Android (also 16)</title><link href="https://blog.uvokchee.de/2025/09/installing-ca-certificates-on-android-also-16.html" rel="alternate" type="text/html" title="Installing CA certificates on Android (also 16)" /><published>2025-09-10T19:35:00+02:00</published><updated>2025-09-10T19:35:00+02:00</updated><id>https://blog.uvokchee.de/2025/09/installing-ca-certificates-on-android-also-16</id><content type="html" xml:base="https://blog.uvokchee.de/2025/09/installing-ca-certificates-on-android-also-16.html"><![CDATA[<p>Are you tired of getting “Private key required to install a certificate‎‏‎‎‏‎” when trying to
    install a CA certificate under Android via the settings app?
    (It never works via the file browser directly. You have to go via, and I only paraphrase, as I only have GrapheneOS here, no LOS:
    Settings &gt; something security &gt; (more privacy and security?) &gt; something login data/credentials/encryption &gt; Install a certificate)</p>
  <p>Just check</p>
  <ul>
    <li>The certificate must be <em>in PEM format</em>. If it is in DER, you get the error above.</li>
    <li>The file extension must be <code class="language-plaintext highlighter-rouge">.crt</code> or <code class="language-plaintext highlighter-rouge">.cer</code>. Not <code class="language-plaintext highlighter-rouge">.pem</code>. Otherwise you get a different error.</li>
  </ul>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Installing CA certificates on Android.]]></summary></entry><entry xml:lang="en"><title type="html">Activating CSP for my blog</title><link href="https://blog.uvokchee.de/2025/09/activating-csp-for-my-blog.html" rel="alternate" type="text/html" title="Activating CSP for my blog" /><published>2025-09-03T19:29:00+02:00</published><updated>2025-09-03T19:29:00+02:00</updated><id>https://blog.uvokchee.de/2025/09/activating-csp-for-my-blog</id><content type="html" xml:base="https://blog.uvokchee.de/2025/09/activating-csp-for-my-blog.html"><![CDATA[<p>Recently, I stumbled across a <a href="https://media.ccc.de/">media.ccc.de</a> talk about <a href="https://internet.nl/">internal.nl</a>.
    Basically, this is a website that tests your website security.</p>
  <p>For me, it deducted points for missing HTTP headers. Amongst them,
    <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP"><code class="language-plaintext highlighter-rouge">Content-Security-Policy</code></a>.
    Basically, that header says what content may be loaded on the website.
    Especially, it can prevent loading stuff from external sites. (Cross Site Scripting as attack scenario).</p>
  <p>So, basically, it doesn’t add <em>much</em> value for my blog, since this is a static site and I control the content.
    Sure, there is my comment system, but even that I consider safe enough to handle escaping. So
    setting the header was mostly done to score fake internet points only. But also, a chance to learn something.</p>
  <p>Because, even after adding <code class="language-plaintext highlighter-rouge">self</code> and my domains to the respective header fields, some stuff would not work.
    Mainly because of inline scripts and inline styles. So I put them in separate js files and created CSS classes.</p>
  <p>One thing that doesn’t work anymore are avatars for the ActivityPub comments (and probably for the Isso comments?).
    This is because I have no idea from what servers I will get comments. So, I replaced the avatars by a grey square.</p>
  <p>And that’s it already, really.</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Web stuff! Configuring Content-Security-Policy for my blog.]]></summary></entry><entry xml:lang="en"><title type="html">Building an ePaper badge</title><link href="https://blog.uvokchee.de/2025/08/building-an-epaper-badge.html" rel="alternate" type="text/html" title="Building an ePaper badge" /><published>2025-08-10T18:30:00+02:00</published><updated>2025-09-01T19:45:00+02:00</updated><id>https://blog.uvokchee.de/2025/08/building-an-epaper-badge</id><content type="html" xml:base="https://blog.uvokchee.de/2025/08/building-an-epaper-badge.html"><![CDATA[<h2 id="foreword">Foreword</h2>
  <p>Two weeks before <a href="/2025/07/awoostria-con-report.html">Awoostria</a>:</p>
  <blockquote>
    <p>Hey, I should build something for my Tinkering Projects Show And Tell panel!</p>
  </blockquote>
  <p>So it begins… The story how I built myself an ePaper badge.</p>
  <p>Actually, the story begins way earlier (unrelated, when I still had a physical
    Raspberry Pi running stuff in my home network). I wanted to tinker around a bit
    and bought myself a Waveshare ePaper. These are simple black-and-white displays
    which maintain their content when the power switches off. They are also inside
    eBook readers.</p>
  <p>This was also when I wanted to build myself an electronic door sign for the
    EAST convention with these, and I wanted to go “as minimal as possible”. I
    wanted to use one of the MSP430 controllers I had laying around, and I wanted
    to change motives via MiFare RFID transponders (using an MFRC5xx reader). Work
    on that development never really took off. (Ugh, too little flash for all the
    pictures, too much stuff to code myself!)</p>
  <h2 id="requirements">Requirements</h2>
  <p>So this time, I simply said “fuck it”, and threw an ESP32 on the problem.
    Also, I decided to use <a href="https://platformio.org/">PlatformIO</a>, a
    toolchain/SDK/library manager. I started with the Arduino framework, which is…
    pretty wasteful in terms of resources (Flash, RAM, CPU etc.), but speeds up
    development significantly.</p>
  <p>I had a simple ESP32 devboard, and one of the Waveshare modules, and started
    coding.</p>
  <p>…</p>
  <p>But wait, what do I even want to achieve? Well, I wanted to “mood badge”, i.e.
    show my current mood with funny pictures. I couldn’t get one on previous
    conventions, so I was just gonna build one myself.</p>
  <p>This involves several sub-problems:</p>
  <ul>
    <li><a href="#control">Control the ePaper display</a></li>
    <li><a href="#pic">Get the pictures on the display</a></li>
    <li><a href="#setdisp">Set what is displayed</a></li>
    <li><a href="#powersave">Power-saving</a></li>
    <li><a href="#attach">Attach the badge to myself</a></li>
  </ul>
  <p><span id="control"></span></p>
  <h2 id="control-the-display">Control the display</h2>
  <p>Usually, you never talk to the displays themselves, but to a display
    controller. You talk to these via a digital interface, e.g. SPI. There are
    different display controllers with different command sets.</p>
  <p>But why bother with implementing this myself? There are ready-made libraries.
    For myself, I decided to use <a href="https://github.com/ZinggJM/GxEPD2">GxEPD2</a>. They
    support <em>some</em> Waveshare displays. The problem with Waveshare displays is, they
    don’t disclose which display controller they use. So it’s kind of an
    trial-or-error procedure. Or rather, you can look at their example code, figure
    out which commands they are using, and compare what commands GxEPD2 uses.
    That’s a bit cumbersome. But still better than writing everything myself. Also,
    it supports graphics primitives!</p>
  <p><span id="pic"></span></p>
  <h2 id="get-the-picture-on-the-display">Get the picture on the display</h2>
  <p>You can’t just simply throw a JPEG onto the display. The display doesn’t
    understand that. It only understands pixel data. Also, the display can only
    draw black and white pixels. I also have a display with yellow color support,
    but that makes it even more complicated, actually. Even when you don’t use it,
    refresh is slow.</p>
  <p>So, you definitely can’t throw a color picture on the display, nor a monochrome
    one. There are displays which support a few gray-levels, but I don’t have one
    of those.</p>
  <p>So. What to? The solution is “dithering”. I.e. you trick your eye into
    perceiving grey by having clusters of black and white pixels. There is some
    technical background to dithering (see the Reference section), but I simply
    used either GIMP with the Floyd-something algorithm, or one of the “ordered”
    modes of ImageMagick. It was a bit of trial-and-error and
    seeing-what-looks-best.</p>
  <p>The result, then, looks like this:</p>
  <p><img src="https://pics.uvokchee.de/upload/2025/09/01/20250901174428-eac9e946.jpg" alt="a dithered image of my fursona" /></p>
  <p>Now, about the image format… GxEPD2 supports “XBitmaps”, or XBMs, which are
    basically just a C array declaration, so you can GCC that file and throw in the
    array into the GxEPD2 function call. And voilá, it works. You need to set the
    rotation first, though.</p>
  <p><span id="attach"></span></p>
  <h2 id="how-to-attach-the-badge-to-myself">How to attach the badge to myself</h2>
  <p>I have a Waveshare module/PiHat (which is too heavy), and a simple “ePaper
    sheet” including a plastic housing for it. The housing can only fit the ePaper,
    not the devboard, though. Also, it would be too cumbersome to attach to the
    devboard - loose wires! So, at this point, I decided to switch from the
    prototyping platform onto something better.</p>
  <p>Fortunately, Elecrow provides a
    <a href="https://www.elecrow.com/wiki/CrowPanel_ESP32_E-paper_2.9-inch_HMI_Display.html">CrowPanel</a>,
    which is exactly what I need. It has a display, a built-in ESP32 controller, a
    housing, and even some switches! As a huge plus, they even specify which
    display controller they use. I had to try some of the GxEPD2 display classes,
    but finally found one working.</p>
  <p>I decided to glue magnets onto the housing, and attach the display via magnets
    on the inner side of my shirt — not ideal. I positioned the magnets in
    the (vertical) middle of the housing, so it wobbles and is not readable. Also,
    I accidentally washed the shirt after Awoostria with the magnets still sticking
    inside — and now there’s a hole in it :( . This problem is still
    unsolved. I can kinda attach the magnets to the housing screws at the top, but
    that’s not <em>very</em> stable.</p>
  <p>When starting to work with the Elecrow display, at first nothing would work.
    When I looked at their example code I noticed there’s an additional power pin
    that needs to be toggled.</p>
  <p><span id="setdisp"></span></p>
  <h2 id="set-what-is-displayed">Set what is displayed</h2>
  <p>In addition to these switches, which allow choosing the motive, I wanted
    something “more direct”, so I added the
    <a href="https://github.com/h2zero/NimBLE-Arduino">NimBLE-Arduino</a> library. With a bit
    of coding, I added a service and some characteristics, so the available motives
    could be read via BLE. Also, the motive could be selected via another
    characteristic. I started writing the characteristic with <em>nRF Connect For
      Mobile</em>, but started writing an app <a href="#theapp">later</a>.</p>
  <p>Actually, the switch-selection was a bit troublesome. Redrawing the whole
    display takes around 2 seconds — but that is not acceptable when
    navigating the presets one-by-one. By looking at the API, I found out you can
    select a “partial region”.</p>
  <p>What I didn’t mention yet, the text that shows the mood is drawn at runtime,
    not integrated into the picture. So, I simply update a region in the
    vertical-center-right of the display with the mood text. The picture stays the
    same, but the text reflects the selected mood. The selection is confirmed my
    pressing the rotary switch.</p>
  <p>This is still not ideal. The first update after power-up must be a full one,
    and I don’t save the selected preset in NVS — I don’t want to destroy the
    flash by lots of write cycles. I don’t have a solution to this, yet. Maybe I’m
    gonna integrate an microSD card (there’s a slot for that in the CrowPanel).
    I’m gonna research a good wear-levelling file system for that.  Probably not
    FAT.  That doesn’t need to be readable on the PC. (And even if, simple stuff
    can be written in FUSE). Alternatively, drawing the first motive on power-up
    would also be an option, but I don’t like it that much.</p>
  <p><span id="powersave"></span></p>
  <h2 id="power-saving">Power saving</h2>
  <p>I first measured the current and was shocked. The whole thing draws around
    80-100 mA. Not a big surprise, given that Arduino basically calls <code class="language-plaintext highlighter-rouge">loop()</code> over
    and over again.</p>
  <p>Using a bit of experimenting, and failing to cancel light sleep with a GPIO
    interrupt, I implemented power saving by using a timer-based light sleep (10
    ms, gives good user response) and reducing the CPU frequency to 80 MHz. And lo
    and behold, my USB current measuring equipment (resolution 10mA) showed 0 mA.
    Success.</p>
  <p>Actually, reducing the CPU frequency was a requirement! If I didn’t do that,
    the CPU would constantly crash when entering or exiting light sleep. No idea
    why!</p>
  <p>Apropos of powering: The badge is normally unpowered and only powered if I need
    to change the motive. I don’t want to have an USB cable hanging on me the whole
    time! Using a battery might be an option, but I had problems with mismatched
    connectors — the Elecrow display doesn’t have a standard JST connector
    like the LiPo battery I bought (Li-Ion might even be the safer option? I have
    no clue about this stuff. With a quick search, I only found these cylindrical
    Li-Ion batteries and have no idea how I would connect them). The badge seems to
    have a “mini” variant of that connector.</p>
  <p>For the time being, I power it with a USB power bank, but this I still consider
    an unsolved problem.</p>
  <p><span id="theapp"></span></p>
  <h2 id="the-app">The app</h2>
  <p>Writing the BLE characteristics with nRF Connect is all and well, but not
    really user-friendly. I didn’t want to install the Android SDK, so I looked at
    cloud based development for a start. I found <a href="https://appinventor.mit.edu/">MIT
      AppInventor</a>. First, I was disgusted, because
    apparently they require Login with Google. But I found <a href="https://code2.appinventor.mit.edu/">an alternative
      way</a> by which you simply get a
    “Passphrase-like” codeword you use for login.</p>
  <p>The graphical programming is unusual to me. I used Scratch shortly in the past,
    so it was not completely foreign. Actually, it was kinda fun coding this, in
    “event style”, once I figured out how to to like stripping, list filtering,
    etc.</p>
  <p><img src="https://pics.uvokchee.de/upload/2025/09/01/20250901174428-91da9ca4.gif" alt="Screenshot of AppInventor showing part of the program." /></p>
  <p>This was good enough for a while, but then I decided I wanted to actually have
    the source code available. So I looked again at development options, and
    settled for Flutter.</p>
  <p>Again, this was completely new to me. I started off with a popular BLE library,
    which turned out to be an unfortunate choice, as Linux support had a few
    quirks. That was probably a good thing in hindsight, as this made me abstract
    away the BLE stuff in implementation classes, so I could easily try out
    different libraries, and only use the abstract base classes in the code. Well,
    you can see what the code looks like, I linked my repo below. This is what the
    motive selection looks like:</p>
  <p><img src="https://pics.uvokchee.de/upload/2025/09/01/20250901174428-f3f0d032.gif" alt="Screenshot of the Flutter app, allowing selection from   sleepy, hungry, hugs?, uvok, overstim, contact, games?" /></p>
  <h2 id="resources">Resources</h2>
  <ul>
    <li><a href="https://surma.dev/things/ditherpunk/">surma.dev about dithering</a></li>
    <li><a href="https://git.uvok.de/espadge/">git repo with badge source code</a></li>
    <li><a href="https://git.uvok.de/espadge-flutter/">git repo with app source code</a></li>
  </ul>
  ]]></content><author><name>uvok</name></author><category term="Tinkering" /><category term="with" /><category term="ePapers" /><category term="and" /><category term="building" /><category term="a" /><category term="badge." /><summary type="html"><![CDATA[Foreword]]></summary></entry><entry xml:lang="en"><title type="html">Awoostria Con Report 2025</title><link href="https://blog.uvokchee.de/2025/07/awoostria-con-report.html" rel="alternate" type="text/html" title="Awoostria Con Report 2025" /><published>2025-07-30T19:16:00+02:00</published><updated>2025-07-30T19:16:00+02:00</updated><id>https://blog.uvokchee.de/2025/07/awoostria-con-report</id><content type="html" xml:base="https://blog.uvokchee.de/2025/07/awoostria-con-report.html"><![CDATA[<p>It’s time for another con report. I’m back from the second iteration of
    <a href="https://awoostria.at/">Awoostria</a>, the Austrian furry convention in Vienna.</p>
  <h2 id="day-0--wednesday">Day 0 / Wednesday</h2>
  <p>As usual, more or less, I decided to go by train. It’s only about 5 hours, anyway.
    And I can sleep during the trip. Which I couldn’t do if I went by car.</p>
  <p>Before the convention even started, I got into a Signal group with Tuxel, Nightraccoon and LynxOnRails.
    From them, I knew that LynxOnRails was in the same train. We actually sat together for some time and talked a bit, before
    I went back into my first class seat ;) to take a nap.</p>
  <p>Actually, I ran across another furry in the same train (easily recognizable, what other kind of person would wear a
    tail and have a big fox plushie? ^^). That turned out to be NoteFox, which I should learn on the next day.
    In the end, the train was only 5 minutes late.</p>
  <p>In the evening, I went eating with Tuxel, Nightraccoon, LynxOnRails to 5 Guys.
    I wanted a BLT, which turned out to be a CLT (Charcoal-Lettuce-Tomato Sandwich). Meh.</p>
  <p>My three fellow furries played some rounds of Uno, but I had to go to bed early, so I couldn’t play with.</p>
  <h2 id="day-1--thursday">Day 1 / Thursday</h2>
  <p>The bed in the guesthouse I got was… meh. Might be because I have shoulder-neck issues anyway.
    I booked the guesthouse without breakfast, because I wanted to save money. So I looked around and went
    to get breakfast in an “eastern shop”. It was a regular breakfast, bread rolls with jam and a far-too-hard-boiled egg.</p>
  <p>Since the con didn’t really start yet, I went to the “Haus des Meeres” with Nightraccoon.
    This is an aquatic animal exhibit. It is located in a former flak tower.
    Actually, I’d have loved to visit the Zoo Schönbrunn, but that would’ve taken a whole day probably.
    I need to remember to book a few extra days next year.</p>
  <p><img src="https://pics.uvokchee.de/_data/i/upload/2025/07/30/20250730155904-e30e3043-me.jpg" alt="Tower with aquarium." /></p>
  <p>Next to that was a computer gaming museum, which we didn’t have the time/stamina to visit.</p>
  <p><img src="https://pics.uvokchee.de/_data/i/upload/2025/07/30/20250730155904-346f7e81-me.jpg" alt="Entrance to gaming museum." /></p>
  <p>In the evening, I enjoyed the CoVahr concert, and was really blown away to see fursuiters play
    instruments. A truly special experience.</p>
  <p><img src="https://pics.uvokchee.de/_data/i/upload/2025/07/30/20250730155904-c8160807-me.jpg" alt="Stage of the concert, with CoVahr, Seishin, LightOfSolaris, NoteFox." /></p>
  <h2 id="day-2--friday">Day 2 / Friday</h2>
  <p>Went looking for breakfast again, and got desperate, because all cafés apparently only open at 9 a.m. or so, or even later.
    In the end, I settled for a café, where the owners were coughing a lot, which made me feel very uncomfortable.
    I sat outside, so it was probably okay. I got an omelette, which is not what I eat usually.
    Also, a fucking wasp decided to visit me again, but this time I was prepared, I brought a spray bottle with water,
    infused with lavender oil, which drove that insect away, so I could eat in peace.</p>
  <p>During the day, I met quite a few familiar faces, namely Ookami, Labwolf and Karpour. This made me quite happy.
    (I was already overwhelmed by the crowded Wimberger lobby the day before, with lots of people I didn’t know.
    That stresses me out for some reason.)</p>
  <p>Also, I got to meet Kianga, which I only knew from online before. Yay!</p>
  <p>I even held a panel, the “Tinkering Show And Tell”, which I already did at EAST last year.
    We had leather masks, several electronic badges, moth wings with a quite sophisticated foldout mechanism, and
    a very old VHS camera with some upgrades. I got some positive feedback for the panel in the end :).
    Sadly, I missed the fursuit striptease charity event, which was happening at the same time :(.</p>
  <p>I got some food at the nearby “Loving Hut”, which offered a special menu for furries even.
    Sadly, it turned out that the Carbonara portion was way too much for me, so I had to forgo the cake.</p>
  <p>Then, in the evening, I attended the Riichi Mahjong panel held by Blujay and Viper. It was very nice to play
    that game again after over 10 years. I think I last played it at one of the Berlicon conventions I went to.</p>
  <h2 id="day-3--saturday">Day 3 / Saturday</h2>
  <p>As I got fed up looking for breakfast places, I simply went to get it at Flemings, since they has a superb
    offer. One could attend the breakfast buffer for only 15 €. This had the added benefit I could enjoy breakfast in
    company, with Nightraccoon, Tuxel and LynxOnRails.</p>
  <p>After breakfast, I got a nice massage from a learning physiotherapist. This was really needed.
    That day was also the Whsprs concert which I enjoyed for a whole, before I decided to leave early to get
    food at the lovely Maid Café the convention organized. It was in the Fleming’s café/restaurant,
    and fursuiters were roaming around serving the guests. That was lovely.
    I also got a snep shirt in the dealers den later.</p>
  <p>I finally met Tabbie in person that day. I haven’t seen him in suit during the whole convention, probably as
    I was more around at Flemings. Also, I met Fox and Gustl that day.</p>
  <p>Also, during the days, I participated for a bit in the game that was prepared for the convention.
    It had “reality” elements, but also had online elements. For the theme, they had the con space
    nicely decorated.</p>
  <p><img src="https://pics.uvokchee.de/_data/i/upload/2025/07/30/20250730155905-20137def-me.jpg" alt="Table with various scientific equipment." /></p>
  <h2 id="day-4--sunday">Day 4 / Sunday</h2>
  <p>I got breakfast at Flemings again, in nice company; later, I had lunch with Kianga and Keeya;
    and in the evening, I had dinner with Fox and Gustl. CoVahr played the piano in the hotel lobby that day.</p>
  <p>Sadly, I didn’t win any bids in the art show :( But I got a mail saying I won the lottery at GLC, though :).</p>
  <p>After the closing, I actually met Runo shortly, whom I haven’t met in real life before, either.</p>
  <p>In the evening. I played some last rounds of Mahjong with Blujay, Perrydotto, Sylpheon and Sharky,
    before we had to leave because the bar was closing.</p>
  <h2 id="monday">Monday</h2>
  <p>I got some breakfast at bakery at West station (because I needed to buy some stuff there), said my goodbyes,
    hoping I didn’t forget anyone, before heading back to the Meidling station together with Nightraccoon, where we both
    had a coffee, before parting ways. The trip back home was quite boring, though.</p>
  <h2 id="summary">Summary</h2>
  <p>It’s been a while since I had so much to do, felt some FOMO. The first few days I “panicked” a bit in the hotels,
    because there were so many people around I didn’t know, even if they were furries. In these situations, it
    helped me to retreat to the community room. It wasn’t exactly quiet, but at least it wasn’t crowded.
    Also, the feeling subsided once I met a few familiar faces.</p>
  <p>Now what’s left for me is to wait for GLC, and then for next years Awoostria.</p>
  ]]></content><author><name>uvok</name></author><category term="furry" /><summary type="html"><![CDATA[How the 2025 Awoostria went for me.]]></summary></entry><entry><title type="html">Blog now on Gemini - with DN42</title><link href="https://blog.uvokchee.de/2025/06/blog-now-on-gemini-with-dn42.html" rel="alternate" type="text/html" title="Blog now on Gemini - with DN42" /><published>2025-06-22T17:42:00+02:00</published><updated>2025-06-22T17:42:00+02:00</updated><id>https://blog.uvokchee.de/2025/06/blog-now-on-gemini-with-dn42</id><content type="html" xml:base="https://blog.uvokchee.de/2025/06/blog-now-on-gemini-with-dn42.html"><![CDATA[<p>The Gemini protocol is a minimal protocol to serve content, and is
    the “spiritual successor” to the Gopher protocol.
    (Do not confuse with Google’s AI Gemini. I hate naming collissions),</p>
  <p>It took some tinkering, especially because Gemini’s markup language 
    (“Gemtext”)
    is deliberately
    minimal, and Jekyll can’t output/convert Markdown to Gemini, so I had to
    take “the ugly route” to convert the “finished” Jekyll HTML page to Gemtext
    via the below-mentioned tool, which basically does
    HTML &gt; Markdown &gt; Gemtext.
    I can’t directly use the raw Markdown files of my blog, since I use
    Liquid tags.</p>
  <p>Anyway, my blog is now accessible in “Geminispace”, alas, only within DN42,
    because I’m too lazy right now to do it properly. (With the DN42 namespace
    isolation and all). And also, it’s a really “nerdy” protocol, with I don’t
    know how many users.</p>
  <p><code class="language-plaintext highlighter-rouge">gemini://uvok.dn42/</code></p>
  <p>Addendum: What I really like is the “feed” specification, which basically consists
    of separate lines of <br />
 <code class="language-plaintext highlighter-rouge">=&gt; $link $date $heading</code>, <br />
     and browsers like
    Lagrange can subscribe
    to these (like RSS feeds, but the format is much simpler!).</p>
  <ul>
    <li><a href="https://en.wikipedia.org/wiki/Gemini_(protocol)">Gemini Protocol on Wikipedia</a></li>
    <li><a href="https://en.wikipedia.org/wiki/Gopher_(protocol)">Gopher Protocol on Wikipedia</a></li>
    <li><a href="https://geminiprotocol.net/">Gemini Protocol homepage</a></li>
    <li><a href="https://geminiquickst.art/">Gemini “Quickstart”</a></li>
    <li><a href="https://gemini.flounder.online/docs/gemtext.gmi">Gemtext intro</a></li>
    <li><a href="https://github.com/Aarontheissueguy/Html2GeminiPy">Html2Gemini</a></li>
    <li><a href="https://git.skyjake.fi/gemini/lagrange">Lagrange browser</a></li>
  </ul>
  ]]></content><author><name>uvok</name></author><summary type="html"><![CDATA[My blog is now on Gemini.]]></summary></entry><entry xml:lang="en"><title type="html">Oops, DN42 stopped working</title><link href="https://blog.uvokchee.de/2025/06/oops-dn42-stops-working.html" rel="alternate" type="text/html" title="Oops, DN42 stopped working" /><published>2025-06-16T20:39:00+02:00</published><updated>2025-06-17T18:12:00+02:00</updated><id>https://blog.uvokchee.de/2025/06/oops-dn42-stops-working</id><content type="html" xml:base="https://blog.uvokchee.de/2025/06/oops-dn42-stops-working.html"><![CDATA[<p>As you might know, I participate in <a href="/dn42.html">DN42</a>.
    I have a somewhat peculiar setup, in
    which some VPS run the routing daemons, and my home router simply has a VPN
    connection to them and statically routes everything <code class="language-plaintext highlighter-rouge">fd00::/8</code> to them. The router
    runs OpenWRT, and has dnsmasq setup to resolve DN42 domains via the DN42 anycast
    servers. I set this up <em>months ago</em>, it worked, I was happy, and didn’t need it
    since.</p>
  <p>Cue last weekend. “Suddenly” the resolution didn’t work anymore. It simply timed
    out. So I connected to my VPS (which is running DN42
    <a href="/2025/02/dn42-put-it-in-a-box-linux-network-namespace.html">in a namespace</a>)
    and took a look at tcpdump. Inside the namespace, I saw the strange lines</p>
  <div class="language-plaintext highlighter-rouge">
    <div class="highlight">
      <pre class="highlight"><code>18:49:05.296629 eth0  In  IP6 fd7a:115c:a1e0::xxx &gt; fd42:d42:d42:53::1.53: 42631+ [1au] AAAA? wiki.dn42. (50)
18:49:05.296679 kioubit Out IP6 fd3e:bc05:2d6::80.50255 &gt; fd42:d42:d42:53::1.53: 42631+ [1au] AAAA? wiki.dn42. (50)
18:49:05.302946 tinc_dn42 In  IP6 fd42:d42:d42:53::1.53 &gt; fd3e:bc05:2d6::80.50255: 42631 1/0/1 AAAA fd42:d42:d42:80::1 (66)
18:49:05.302990 kioubit Out IP6 fd3e:bc05:2d6::80 &gt; fd42:d42:d42:53::1: ICMP6, destination unreachable, unreachable route fd3e:bc05:2d6::80, length 122
</code></pre>
    </div>
  </div>
  <p>And all the time I was thinking… “huh??? Why is <code class="language-plaintext highlighter-rouge">fd3e:bc05:2d6::80</code> unreachable???
    It is <strong>clearly</strong> in the <code class="language-plaintext highlighter-rouge">ip -6 a</code> output!!!”.  I looked through all the
    iptables statistics and couldn’t find the culprit.</p>
  <p>A join in the DN42 IRC and some back and forth later, someone suggested
    “Hey, what’s with the <code class="language-plaintext highlighter-rouge">fd7a:…</code> address? Is there a route for <em>that</em>?”.</p>
  <p>And of course, no, it wasn’t! I was so focused on the ICMP6 message that I
    didn’t notice the incoming line.  As you can read in my other article linked
    above, I perform NAT. Of course in that case it probably wouldn’t make sense for the
    ICMP6 message to tell someone that there’s no route for the original IP (before NAT).</p>
  <p><strong>So, but… where does the <code class="language-plaintext highlighter-rouge">fd7a:…</code> address come from?</strong><br />
    The answer is <a href="/2024/12/trying-out-tailscale.html">Tailscale</a>.
    Unfortunately, they decided to use the <code class="language-plaintext highlighter-rouge">fd00::/8</code> IP range, which collides with DN42.
    I didn’t do any DN42 stuff since installing it, so I didn’t notice that.<br />
    <strong>But… why is that address used at all for the DNS request?</strong><br />
    Weeeeell… I found out as well. It comes from OpenWRT. I simply set up
    a static route there, and Linux does its best to determine the source address for the
    DNS request. And it seems the Tailscale one was a closer match than 
    the address from my own DN42 prefix.<br />
    <strong>So, how to fix that?</strong><br />
    <a href="https://github.com/openwrt/openwrt/issues/13720">It’s not as easy as you think!</a>.
    Merely using the “source” option in the config file would work for IPv4, but
    for IPv6 it has a different meaning!<br />
    <strong>But why does it say “no route to host” instead of using a default route?</strong><br />
    Because I configured bird to insert an “unreachable” route for the <code class="language-plaintext highlighter-rouge">fd::/8</code> prefix
    to avoid leaking traffic.</p>
  <div class="language-plaintext highlighter-rouge">
    <div class="highlight">
      <pre class="highlight"><code># ip -6 route show fd00::/8 table dn42
unreachable fd00::/8 dev lo proto bird src fd3e:bc05:2d6::1 metric 500 pref medium
</code></pre>
    </div>
  </div>
  <p>At this point, it’s Monday evening. Unnerved, I threw my hands in the air and
    simply put a line of</p>
  <div class="language-plaintext highlighter-rouge">
    <div class="highlight">
      <pre class="highlight"><code>ip -6 route replace fd00::/8 ... src &lt;my-openwrt-dn42-address&gt;
</code></pre>
    </div>
  </div>
  <p>in <code class="language-plaintext highlighter-rouge">/etc/rc.local</code> and called it a day.  My setup
    works again, and I learned something again. Don’t just look at the last line,
    look at the whole picture.  A lesson I actually already learned in the
    ubuntuusers forums when asking for help compiling a package and only posted the
    last few make output lines, which of course didn’t contain the actual
    compilation error…</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Fixing a broken DN42 DNS after namespacing the processes.]]></summary></entry><entry xml:lang="en"><title type="html">Furdew Valley</title><link href="https://blog.uvokchee.de/2025/05/furdew-valley.html" rel="alternate" type="text/html" title="Furdew Valley" /><published>2025-05-29T15:21:00+02:00</published><updated>2025-05-29T15:21:00+02:00</updated><id>https://blog.uvokchee.de/2025/05/furdew-valley</id><content type="html" xml:base="https://blog.uvokchee.de/2025/05/furdew-valley.html"><![CDATA[<p><a href="/2025/03/games-i-play_ed.html">In my last blog post</a> about gaming,
    I think I already mentioned I played Stardew Valley. Back then, on an Android
    tablet. Due to <a href="https://woof.tech/@Pan_H_Shiroi@toot.cat">Pan on Mastodon</a>
    streaming that game recently, I picked it up again.</p>
  <p>I found it can even be modded! The mod in question is
    <a href="https://www.moddrop.com/stardew-valley/mods/1119098-fs-shs-animals-and-myths-pack">Animals and Myths Pack</a>.</p>
  <p><img src="https://pics.uvokchee.de/upload/2025/05/29/20250529132445-6dbbe14d.jpg" alt="Screenshot of modded Stardew Valley, showing the player character with anthro legs   and a fox tail" /></p>
  <p>That adds to the fun. I might even get a mod that adds NPC lines. The build-in
    ones can get monotonous after some time.</p>
  ]]></content><author><name>uvok</name></author><category term="gaming" /><summary type="html"><![CDATA[Furry-fying Stardew Valley.]]></summary></entry><entry xml:lang="en"><title type="html">CPU usage problems on my VPS again</title><link href="https://blog.uvokchee.de/2025/05/cpu-usage-problems-again.html" rel="alternate" type="text/html" title="CPU usage problems on my VPS again" /><published>2025-05-25T19:29:00+02:00</published><updated>2025-05-25T19:29:00+02:00</updated><id>https://blog.uvokchee.de/2025/05/cpu-usage-problems-again</id><content type="html" xml:base="https://blog.uvokchee.de/2025/05/cpu-usage-problems-again.html"><![CDATA[<p><a href="/2025/02/dn42-put-it-in-a-box-linux-network-namespace.html">As reported previously</a>, I had problems with the CPU usage on my VPS
    again, even after namespace isolation. This time, it was dnsmasq causing the
    loadavg to rise. “This is a problem for future me to solve properly”, is the
    motto. For the time being, I simply added a service restart when I detect a high
    loadavg. Works well enough. I’ll keep monitoring it to see if this occurs more
    than once a week or so.</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Just a small rant/report on probelems I have with my server.]]></summary></entry><entry xml:lang="en"><title type="html">Table Tennis!</title><link href="https://blog.uvokchee.de/2025/05/table-tennis.html" rel="alternate" type="text/html" title="Table Tennis!" /><published>2025-05-11T08:16:00+02:00</published><updated>2025-05-11T08:16:00+02:00</updated><id>https://blog.uvokchee.de/2025/05/table-tennis</id><content type="html" xml:base="https://blog.uvokchee.de/2025/05/table-tennis.html"><![CDATA[<p>Recently, I was at a seminar. I learned a lot. It was an exquisite group of inquisitive people.
    But we also had some free time in which we played some table tennis.
    I have no idea how to play it besides “hit the ball with the racket”.
    Actually makes me want to join the local sports club for once, which does have a
    table tennis department.</p>
  ]]></content><author><name>uvok</name></author><category term="life" /><summary type="html"><![CDATA[Just a mention that I played and enjoyed table tennis.]]></summary></entry><entry xml:lang="en"><title type="html">I don’t get Kubernetes</title><link href="https://blog.uvokchee.de/2025/04/i-don-t-get-kubernetes.html" rel="alternate" type="text/html" title="I don’t get Kubernetes" /><published>2025-04-06T15:59:00+02:00</published><updated>2025-04-06T15:59:00+02:00</updated><id>https://blog.uvokchee.de/2025/04/i-don-t-get-kubernetes</id><content type="html" xml:base="https://blog.uvokchee.de/2025/04/i-don-t-get-kubernetes.html"><![CDATA[<p>No real content, just me ranting.</p>
  <p>There are <a href="https://xeiaso.net/talks/2025/surreal-joy-homelab/">some ;)</a> who take
    great joy in Kubernetes. I never really understood how I could use it.</p>
  <p>Okay, so, very simplified, K8s let’s you say “I wanna run these services (Docker
    containers) on my cluster (various computers/servers), optionally with
    redundancy”? Well, I only have one “server” in my “homelab”, and then 3 VPS or
    so. Only one of them runs something in Docker/Podman.</p>
  <p>I <em>can’t imagine</em>/don’t understand how I would run, say, Nextcloud in K8s. I
    <em>want</em> to know which server is currently running it, and where the data is
    stored.  Especially with something like Nextcloud, I want to have the Nextcloud
    application, the database, and the data store on <strong>one</strong> VPS, without any
    indirections, without any communication over the internet or a VPN, via some
    proxy software. From what little I’ve heard about K8s (forgive me my ignorance),
    I had more questions that I could answer. K8s seems really complex, because it
    <del>has</del> can have so many moving parts (yes, you can probably run a very basic
    setup, most of the components seem optional). I don’t want my database suddenly
    moved around to somewhere else.</p>
  <p>That is to say: I never had a use case of trying out K8s. No <em>actual, real</em> one.
    I could probably construct one if I tried really hard. But, eh. “My current
    setup works”.</p>
  <p>My attempt to run K8s on my Proxmox via LXC all failed, even if they’re
    privileged containers, probably because I need to mount Linux Namespaces, or
    load specific kernel modules on Proxmox itself so they can be loaded in the LXC
    containers as well (???).</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Just a… not-quite-rant… about I don't get how and why to use Kubernetes.]]></summary></entry><entry xml:lang="en"><title type="html">Random Thought: Smartphones with old technology</title><link href="https://blog.uvokchee.de/2025/04/random-thought-smartphones-with-old-technology.html" rel="alternate" type="text/html" title="Random Thought: Smartphones with old technology" /><published>2025-04-05T20:23:00+02:00</published><updated>2025-04-05T20:23:00+02:00</updated><id>https://blog.uvokchee.de/2025/04/random-thought-smartphones-with-old-technology</id><content type="html" xml:base="https://blog.uvokchee.de/2025/04/random-thought-smartphones-with-old-technology.html"><![CDATA[<p>How would smartphones look with old technology? What if we never invented flash
    storage?  (Leave aside the answer “the smartphone would not have been
    possible”).  Like, what if they were using tapes / tape drives as primary
    storage?  Or floppy disks?</p>
  <p>&lt;insert AI generated image here - hah, you wish. I’ll have none of that on my
    blog.&gt;</p>
  <p>This thought was presented to me while listening to the <a href="https://www.stayforever.de/">“Stay
      Forever”</a> podcast, a German-language podcasts about
    old games and their technology.</p>
  ]]></content><author><name>uvok</name></author><category term="tech" /><summary type="html"><![CDATA[Random brain fart.]]></summary></entry><entry xml:lang="en"><title type="html">Computer games I (used to) play</title><link href="https://blog.uvokchee.de/2025/03/games-i-play_ed.html" rel="alternate" type="text/html" title="Computer games I (used to) play" /><published>2025-03-18T10:17:00+01:00</published><updated>2025-03-18T10:17:00+01:00</updated><id>https://blog.uvokchee.de/2025/03/games-i-play_ed</id><content type="html" xml:base="https://blog.uvokchee.de/2025/03/games-i-play_ed.html"><![CDATA[<p>I’m not big on computer games. Usually “I don’t have the time” to deal with
    them. Or rather, spending so much time on the computer at work, I’m quickly fed
    up with sitting on the computer.  Also, I get frustrated quickly at times, when
    I can’t make progress or repeatedly fail.  So I usually only play computer games
    on vacation.</p>
  <p>So, as for games I played (recently-ish)? Roughly sorted by time last played
    ascending:</p>
  <ul>
    <li>Waaaaaaaaaaaaaaay back in my childhood (in no specific order):
      <ul>
        <li><a href="https://archive.org/details/msdos_sid_meier_civilization">Civilization</a>
          <sup id="fnref:civ1" role="doc-noteref"><a href="#fn:civ1" class="footnote" rel="footnote">1</a></sup>, <sup id="fnref:civ2" role="doc-noteref"><a href="#fn:civ2" class="footnote" rel="footnote">2</a></sup>. Yes, the original one! If I remember correctly, I always
          got destroyed sooner or later… - <a href="https://www.freeciv.org/">FreeCiv</a> is an
          open source game inspired by it.</li>
        <li><a href="https://alula.github.io/SpaceCadetPinball/">3D Pinball Space Cadet</a>. I
          spent hours on that one. Never quite succeeding on hitting the targets…</li>
        <li>Anno 1602. I think the first game I searched for cheats to improve my
          chances… - <a href="https://unknown-horizons.org">Unknown Horizons</a> is a similar
          game in open source. <sup id="fnref:unkhor" role="doc-noteref"><a href="#fn:unkhor" class="footnote" rel="footnote">3</a></sup></li>
        <li>SimCity 2000 <sup id="fnref:simcit" role="doc-noteref"><a href="#fn:simcit" class="footnote" rel="footnote">4</a></sup> -
          <a href="https://github.com/lincity-ng/lincity-ng">LinCity-NG</a> is a similar open
          source game.</li>
        <li>Need For Speed III</li>
        <li>Empire Earth (quite like Age Of Empires, as I found out later) - As far as
          open source goes, <a href="https://play0ad.com/">0 A.D.</a> is probably the closest?</li>
        <li>“Die Völker” (apparently, “Alien Nations” in English, “The Nations” was
          actually the sequel. Yeah, what?). I sunk quite some time into that one as
          well.</li>
        <li>“Funk-Flitzer”, which was on a “Mickey Maus” comic magazine. Go search for
          “3-D Ultra Radio Control Racers”.</li>
        <li>Worms 2 - <a href="http://www.hedgewars.org/">Hedgewars</a> seems to be the open source
          alternative.</li>
        <li>Moorhuhn, Winter Edition</li>
      </ul>
    </li>
    <li>Sometime later deep in the past: Minecraft (I stopped way before Microsoft
      acquired it), recently followed by <a href="https://www.luanti.org/">Minetest, or rather,
        Luanti</a> (Though, “it’s just not the same anymore”.
      I’m not sure what exactly it is, maybe my changed mindset, maybe I liked the
      original soundtrack and game elements more…).</li>
    <li><a href="https://playstarbound.com/">Starbound</a>, very shortly</li>
    <li><a href="https://www.openttd.org/">OpenTTD</a>: Trains and buses! Though, admittedly, I
      never quite “got it” (why do you have to manually “park” passengers on train
      stations, instead of unloading them completely, so they continue taking the
      train?)</li>
    <li><a href="https://www.bay12games.com/dwarves/">Dwarf Fortress</a>. Go with
      <a href="https://dwarffortresswiki.org/index.php/Utility:Lazy_Newb_Pack">LNP</a> if you
      wanna give it a try, or the Steam version.</li>
    <li><a href="https://www.stardewvalley.net/">Stardew Valley</a> (on Android tablet)</li>
    <li><a href="https://www.factorio.com/">Factorio</a> - Shaking my head over the people
      arguing over how to perfectly optimize everything ;). I disabled biters in
      recent play-throughs, it got to annoying for me.</li>
    <li><a href="https://terraria.org/">Terraria</a>. Another one where I had to resort to the
      Wiki for the bosses.</li>
    <li><a href="https://cattailsgame.com/">Cattails: Wildwood Story</a>. Got through the main
      story, had to resort to YouTube for looking up how to beat the final boss.</li>
    <li><a href="https://turingcomplete.game/">Turing Complete</a></li>
    <li>And, the most recent one,
      <a href="https://www.michelepirovano.com/dotage.html">dotAge</a></li>
  </ul>
  <p>The latter <sup id="fnref:dotnote1" role="doc-noteref"><a href="#fn:dotnote1" class="footnote" rel="footnote">5</a></sup> one is a “turn-based village builder”, with challenges. I
    <em>guess</em> I can <em>kinda</em> compare it to Dwarf Fortress, as in, it can be incredibly
    hard, and you have to build a civilization <sup id="fnref:dotdwarf" role="doc-noteref"><a href="#fn:dotdwarf" class="footnote" rel="footnote">6</a></sup> and take care of it, as
    in terms of food and drink, for example. Only you don’t have to deal with goblin
    or forgotten beast invasion, but, basically, nature. And DF doesn’t have tech
    research… Okay, maybe they’re not comparable after all.</p>
  <p>The first play-throughs are rather rough, since you will only unlock additional
    content, such as farming, with play time. So your first villages will cease to
    exist quite quickly, I think. That’s expected. Probably to show you the failure
    modes?</p>
  <p>From personal experience: Don’t build some new buildings too quickly. The game
    allows you to build them even though they’re “useless” at that specific point in
    the game, and you need additional tech research to make them usable.</p>
  <p><a href="https://pics.uvokchee.de/upload/2025/03/17/20250317185230-40c102c2.jpg"><img src="https://pics.uvokchee.de/_data/i/upload/2025/03/17/20250317185230-40c102c2-me.jpg" alt="Screenshot of the game dotAge, of fairly early game play." /></a></p>
  <div class="footnotes" role="doc-endnotes">
    <ol>
      <li id="fn:civ1" role="doc-endnote">
        <p>Go drop archive.org a small donation, won’t you? <a href="#fnref:civ1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
      <li id="fn:civ2" role="doc-endnote">
        <p>You can actually still play it thanks to <a href="https://www.dosbox.com/">DOSBox</a> <a href="#fnref:civ2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
      <li id="fn:unkhor" role="doc-endnote">
        <p>Not sure about the current state. The port to the Godot
          engine seems still to be a WIP. Last blog post is quite some time ago, but
          the <a href="https://github.com/unknown-horizons/godot-port">GitHub repo</a> is active. <a href="#fnref:unkhor" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
      <li id="fn:simcit" role="doc-endnote">
        <p>I didn’t like SimCity 3000 as much. And <em>don’t get me started with Cities:
            Skylines</em>. <a href="#fnref:simcit" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
      <li id="fn:dotnote1" role="doc-endnote">
        <p>Yes, kinda unfair I only go into detail into one. I wanted to start
          “reviewing” only this one, but then thought, “well, might as well list all
          games I played so far”. Maybe that’s a chance for future blog posts. <a href="#fnref:dotnote1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
      <li id="fn:dotdwarf" role="doc-endnote">
        <p>General advice seems to be not to go over 50 in dotAge. In Dwarf Fortress,
          you have to deal with the pesky Nobles instead. Something similar seems to
          exist in dotAge as well? <a href="#fnref:dotdwarf" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
      </li>
    </ol>
  </div>
  ]]></content><author><name>uvok</name></author><category term="game" /><summary type="html"><![CDATA[I muse over computer games I played recently(-ish).]]></summary></entry></feed>