<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://jan.alphadev.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jan.alphadev.net/" rel="alternate" type="text/html" /><updated>2026-09-08T13:47:27+00:00</updated><id>https://jan.alphadev.net/feed.xml</id><title type="html">Jan’s Stuff</title><subtitle>Der alltägliche Wahnsinn</subtitle><author><name>Jan Seeger</name></author><entry><title type="html">Media Report 2/2026</title><link href="https://jan.alphadev.net/blog/2026/media-report-2/" rel="alternate" type="text/html" title="Media Report 2/2026" /><published>2026-08-26T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/media-report-2</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/media-report-2/"><![CDATA[<p>The first half of the year I have been busy reading through the Rincewind Arc of the Discworld novels in the following order:</p>

<ul>
  <li>
    <p>The Colour of Magic</p>

    <p>Everybody says this is a rough read because it is one of Pratchett’s earlier works. I cannot see what the fuss is about. It <em>does</em> take some effort to ease into the world, but have you read any introduction into the world by Stephen King?</p>

    <p>All around a fun read even though the plot conveniently fell into place too easily and the end of the book rushed through the world scapes.</p>

    <p>But perhaps it’s all just a Rincewind thing for things to work out in the end 🤷</p>
  </li>
  <li>
    <p>The Light Fantastic</p>
  </li>
  <li>
    <p>Sourcery</p>
  </li>
  <li>
    <p>Eric Faust</p>
  </li>
  <li>
    <p>Interesting Times</p>

    <p>This book is worth reading for the epic and ridiculous battle alone. Also several heroes of previous stories make an appearance.</p>
  </li>
  <li>
    <p>The Last Hero</p>
  </li>
  <li>
    <p>The Last Continent</p>

    <p>The book starts out alright but it felt tedious to work through. The weird “Australian” accent combined with multiple intertwining story strands and hard jumps between them made it harder to enjoy.</p>
  </li>
  <li>
    <p>Unseen Academicals</p>

    <p>I went into the book being highly skeptical whether a book about football would hold up.</p>

    <p>But the (side-)plot about the university staff made it more than worthwhile.</p>

    <p>While the heavy accents in The Last Continent made it less appealing, I felt that the British slang here added to the charm.</p>
  </li>
  <li>
    <p>Troll Bridge</p>
  </li>
</ul>

<p>The order was roughly chosen to match <a href="https://upload.wikimedia.org/wikipedia/commons/1/12/Discworld_Reading_Order_Guide_3.0_%28cropped%29.jpg">the guide</a>. All in all I enjoyed the Rincewind arc. Now on to the Witches novels.</p>]]></content><author><name>Jan Seeger</name></author><category term="media" /><category term="reading" /><category term="discworld" /><summary type="html"><![CDATA[The first half of the year I have been busy reading through the Rincewind Arc of the Discworld novels in the following order:]]></summary></entry><entry><title type="html">Keychron Layout Tweaks</title><link href="https://jan.alphadev.net/blog/2026/keychron-layout-tweaks/" rel="alternate" type="text/html" title="Keychron Layout Tweaks" /><published>2026-08-16T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/keychron-layout-tweaks</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/keychron-layout-tweaks/"><![CDATA[<p>While moving clutter around my desk I often accidentally actuate the backlight cycle button in the upper right of my Keychron Keyboard and then it moves in a light pattern until I press it again until the light is permanently on again.</p>

<p>This had been an <a href="/blog/2022/keyboard-firmware-updates/#keychron-k2">annoyance with my old Keychron K2</a> and again with my K3 version 3. But now there is an easy way to permanently change the layout using their <a href="https://launcher.keychron.com/">Launcher Webapp</a>.</p>

<p>It only works for Chromium-based browsers (because it directly communicates via WebUSB API), but Chrome will always be just a download away.</p>

<p>Using the software I now have swapped the Backlight Toggle and Backlight Cycle keys. Pressing the button now turns the backlight on or off, and Fn+Backlight cycles through the light modes, but it is far more unlikely that I trigger that combination accidentally.</p>

<p>You can find the configuration for the ANSI layout <a href="/assets/Keymap-Keychron-K3-Version-3-WHITE-11-15-8.json">here</a>.</p>]]></content><author><name>Jan Seeger</name></author><category term="playground" /><category term="keychron" /><summary type="html"><![CDATA[While moving clutter around my desk I often accidentally actuate the backlight cycle button in the upper right of my Keychron Keyboard and then it moves in a light pattern until I press it again until the light is permanently on again.]]></summary></entry><entry><title type="html">Slowly moving my projects off GitHub</title><link href="https://jan.alphadev.net/blog/2026/moving-projects-off-github/" rel="alternate" type="text/html" title="Slowly moving my projects off GitHub" /><published>2026-08-12T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/moving-projects-off-github</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/moving-projects-off-github/"><![CDATA[<p>My <a href="https://github.com/janseeger">GitHub Account</a> is actually my second one. The first I created in 2010 after I was introduced to Git the OG way, you know, like one did back in the day:</p>

<p>Beer in hand from a fellow nerd, saying: There’s this new thing from the Linux guy where you can track source code not like Subversion does by sending in files and counting up numbers, but by hashing the contents of the code and syncing it that way.</p>

<p>Back then you couldn’t have private repos with the free tier while BitBucket did allow them (you could even choose between Git and <a href="https://www.mercurial-scm.org">Mercurial</a> repos back then, now I feel old). Because of that all my projects lived in BitBucket and I deleted the GitHub account again.</p>

<p>About a year later, after almost all open source projects had gravitated towards GitHub, I signed up again and used it to keep track and contribute to other people’s code.</p>

<p>I have since gone full circle via GitLab Self-Hosted, GitLab, and back to GitHub. Even work now takes place for me on GitHub.</p>

<p>But as of late I’m more and more irritated by GitHub. Their constant push for their AI features, their janky Token settings, Actions reliability and Package Registry behaviour are a constant pain. And them forcing you to log in to browse public code or download artifacts doesn’t make it any more palatable.</p>

<h1 id="gitea">Gitea</h1>

<p>Since I had set up a Gitea-instance that privately runs and mirrors various upstream mirrors (and writes them into a single data directory that I then can back up properly), I had slowly started to use it to host small non-mirror repos, like my Dotfiles and Dockerfile repos. It was ultra reliable and performant so that I moved more and more of my code there.</p>

<p>There’s a renovate-bot to check dependencies and I got Gitea Actions running builds better than they ever did on GitHub. The only reason to keep my GitHub account now is for work and contributing to other people’s repos.</p>

<p>So, from now on if you’re searching for a repo of mine you will find it <a href="https://git.alphadev.net/explore/repos">over there</a>, but I won’t delete my account (yet).</p>]]></content><author><name>Jan Seeger</name></author><category term="dev" /><category term="github" /><category term="git" /><category term="gitea" /><summary type="html"><![CDATA[My GitHub Account is actually my second one. The first I created in 2010 after I was introduced to Git the OG way, you know, like one did back in the day:]]></summary></entry><entry><title type="html">Trip Report: Nabada</title><link href="https://jan.alphadev.net/blog/2026/trip-report-nabada/" rel="alternate" type="text/html" title="Trip Report: Nabada" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/trip-report-nabada</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/trip-report-nabada/"><![CDATA[<p>As is tradition now, I attended Nobada in Ulm and since I had a few extra days of vacation left to spare, I connected a mid-sized road trip through Bavaria.</p>

<p><img src="/assets/2026/d5c90b04-d65b-4c35-b22b-0c91876d2d2c.jpeg" alt="Map depicting the route through the Swabian Alps, Schwaben, Franken Main-Tauber, Heilbronner Land and Schönbuch" /></p>

<h1 id="ulm">Ulm</h1>

<p>For the first time in years the weather was forecast to be nice before the event and no possible rain or thunderstorms threatened to cancel everything at the last minute.</p>

<p>Like every year we entered at the Eisenbahnbrücke and exited at the Friedrichsau. The ride on the Danube was both more crowded and more chill than the years before.</p>

<h1 id="augsburg">Augsburg</h1>

<p>First stop was in Augsburg. Nothing to report here, except for <em>all</em> the LEW chargers being out of service.</p>

<h1 id="nürnberg">Nürnberg</h1>

<p>Happened to find a dedicated motorcycle parking spot a short walk away from the hotel. Speaking of hotel, for motorcycle travels the list of requirements for a hotel room is pretty low but this hotel underbid by a wide margin: One shared toilet in the hallway where the door lock wasn’t working and no shower.</p>

<p>I always omitted the breakfast offerings at the hotels and went for a combined charging and breakfast trip to the nearest Kaufland.</p>

<h1 id="coburg">Coburg</h1>

<p>Had one additional day to spend and decided to go further north. And it was with it. Beautiful landscape and nice roads.</p>

<h1 id="wertheim">Wertheim</h1>

<p>On your <a href="/blog/2026/trip-report-wiesbaden/">last trip through the beautiful Hohenlohe Region</a> it had rained hard and I made a mental note to revisit when there is nicer weather.</p>

<h1 id="schwäbisch-hall">Schwäbisch Hall</h1>

<p>Paid my brother a visit in Hall. We all met up with friends who’d happened to be visiting there too.</p>

<p>Rented an apartment in the old town. Was nice clean and fully equipped. They even had a washing machine for me to do laundry.</p>

<p>And of course, while packing I overlooked my white AirPods on the white bedsheets and left them there and had to arrange for them to be picked up by my brother.</p>

<h1 id="bad-friedrichshall">Bad Friedrichshall</h1>

<p>The forecast had predicted rain, which is why I had planned a day of downtime.</p>

<p>After I had waited out the rain I made my way back home in one uneventful go.</p>

<h1 id="aftermath">Aftermath</h1>

<p>The roads in Bavaria are way nicer and the power consumption seemed way lower than in BW.</p>

<p>The whole trip was 9 days (of which traveled for 7) totaling 1042 kilometers and cost me 19,26€ in energy. Combining charging with food breaks is the way.</p>

<p>The day after my return I had scheduled an appointment for a technical inspection, which the bike passed without issues.</p>]]></content><author><name>Jan Seeger</name></author><category term="trip report" /><category term="motorcylcle" /><category term="zero s 2024" /><summary type="html"><![CDATA[As is tradition now, I attended Nobada in Ulm and since I had a few extra days of vacation left to spare, I connected a mid-sized road trip through Bavaria.]]></summary></entry><entry><title type="html">10.000</title><link href="https://jan.alphadev.net/blog/2026/10000/" rel="alternate" type="text/html" title="10.000" /><published>2026-07-13T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/10000</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/10000/"><![CDATA[<p><img src="/assets/2026/IMG_5134.jpeg" alt="Ten thousand kilometers on the odometer" /></p>

<p>After having driven the Zero S for 10.000 Kilometers, <a href="/blog/2025/motorcycle-post-mortem/">one crash</a> and <a href="/category/trip-report">lots of trips</a> in cold, hot and rainy weather, here’s a quick résumé.</p>

<h1 id="reach-anxiety-doesnt-exist-in-practice">Reach anxiety doesn’t exist in practice</h1>

<p>When riding solo for several hours, it is a welcome change to make a quick charging stop. Both to rest mentally and physically.</p>

<p>And when riding with others, the required speeds and acceleration decrease the bigger the group gets. I have never gotten better mileages than when riding with larger groups.</p>

<p>Naturally this assumes that you’re smart about your route planning.</p>

<p>I have not kept exact records, but the consumption is so low that the wear on the tires ends up being more expensive than the electricity itself.</p>

<h1 id="is-it-a-motorcycle">Is it a motorcycle?</h1>

<p>Several of my trips were along bigger motorcycles (650cc, 800cc, 1000cc) and I’ve never had a problem keeping up. The acceleration and the higher top speed never betray that it is a 125cc(-equivalent) bike.</p>

<p>The only place where it <em>actually is</em> too underpowered is at sustained highway speeds.</p>

<h1 id="noise">Noise</h1>

<p>The bike itself doesn’t come with an artificial noise generator.</p>

<p>All the noises it does make, are an effect of it driving.</p>

<p>Biggest noise contributor is the belt drive. It is near silent except for certain load situations (when the throttle is slightly above cruising and slowly accelerating), it begins to wail.</p>

<p>The wailing gets louder and more high pitched the faster you go. On the Autobahn it often cuts in and out abruptly at certain speeds and loads.</p>

<h1 id="canyon-mode">Canyon Mode</h1>

<p>Every time I go for a trip to the Black Forest or Swabian Alps I set the bike to Canyon Mode. This enables both full torque and max regen breaking. While it is slightly more annoying to keep speed, it makes it more than up in total savings and ride comfort. Especially speeding up steep hills or cruising down a long windy serpentine road.</p>

<h1 id="longevity">Longevity</h1>

<p>Apart from the tires the bike needs almost no maintenance. The only fluid in the entire bike is the breaking fluid.</p>

<p>This is the 3rd year and I have not encountered any change in the max range. It holds its charge like on the first day.</p>

<h2 id="hibernation">Hibernation</h2>

<p>You simply charge it to 80% before the winter and park it in a dry area. It will automatically enter a hibernation mode after some time. After the winter you charge it back up and it is ready to go.</p>

<h1 id="outlook">Outlook</h1>

<p>I plan to acquire the big motorcycle license sometime next year, but will keep riding this bike.</p>

<p>I am more than happy with what I’ve got. And would go for a Zero bike again, that is if they are still selling them by then. But my next bike will <em>need</em> to have a CCS plug and ideally a better, more modern battery chemistry.</p>

<p><strong>On to the next major milestone!</strong></p>]]></content><author><name>Jan Seeger</name></author><category term="misc" /><category term="motorcycle" /><category term="zero s 2024" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Missing iOS features</title><link href="https://jan.alphadev.net/blog/2026/missing-ios-features.md/" rel="alternate" type="text/html" title="Missing iOS features" /><published>2026-07-04T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/missing-ios-features.md</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/missing-ios-features.md/"><![CDATA[<p>Lately there was an <a href="https://weblog.rogueamoeba.com/2026/06/26/free-the-icons/">uproar of people against the new overly simplified new macOS App Icons</a>.</p>

<p>I do find the new icons less creative and less legible in a sea of same-y icons.</p>

<p>I’m glad somebody is taking matters into their hands, but there’s things that bother me far more (than <a href="https://unsung.aresluna.org/something-that-probably-bothered-us-more-than-anyone/">rounded corner radii</a>):</p>

<h1 id="exclude-from-spotlight-indexing">Exclude from Spotlight Indexing</h1>

<p>Apple has announced a new and improved Siri and in preparation for that, they have beefed up their Spotlight indexing.</p>

<p>On macOS you could always just drop an empty <code class="language-plaintext highlighter-rouge">.noindex</code> file into any directory and it will henceforth be ignored by Spotlight indexing.</p>

<h2 id="no-dot-files-in-filesapp">No Dot-files in Files.app</h2>

<p>Not on iOS, where the Files.app won’t let you create Dot-files in the first place.</p>

<p>Even workarounds like the “Save File” Shortcut will silently ignore them (and when creating a file without shortcuts append .txt<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup>)</p>

<h2 id="siri-settings">Siri Settings</h2>

<p>Given that there is no power user reachable lever, I’d have expected to find excluded directions in the Settings.</p>

<p>Alas, no luck.</p>

<h1 id="custom-search-providers">Custom Search Providers</h1>

<p>Google search sucks (not as much as others, but still), has sucked for years and isn’t going to get better anytime soon.</p>

<p>Safari’s Search Engine setting doesn’t provide a custom option where a URL pattern like <code class="language-plaintext highlighter-rouge">https://kagi.com/search?q=%s</code> can be set.</p>

<p>This has been table stakes for decades in all other Browsers out there.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>I thought UTI was supposed to allow determining file types without having to rely on the extension. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Jan Seeger</name></author><category term="rant" /><category term="iOS" /><category term="apple" /><summary type="html"><![CDATA[Lately there was an uproar of people against the new overly simplified new macOS App Icons.]]></summary></entry><entry><title type="html">Apple Container as Docker replacement</title><link href="https://jan.alphadev.net/blog/2026/apple-container/" rel="alternate" type="text/html" title="Apple Container as Docker replacement" /><published>2026-06-20T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/apple-container</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/apple-container/"><![CDATA[<p>With macOS 26 Tahoe, support for running <a href="https://github.com/opencontainers/image-spec">OCI-style containers</a> is directly built into the OS. Similar to <a href="https://support.microsoft.com/en-us/windows/enable-virtualization-on-windows-c5578302-6e43-4b4b-a449-8ced115f58e1">Microsoft’s Virtual Machine Platform</a>, which is a subset of their Hyper-V offering.</p>

<p>Docker for macOS is free for personal use, but their constant nag-screens, forgetting of credentials, ceaseless telemetry collecting and them pushing users hard to try their AI functionality, made me dread each new version for the past few months. It also doesn’t help that most of the newly added features are designed with their corporate customers in mind.</p>

<p>There’s other options that run entirely in Userland, like <a href="https://github.com/abiosoft/colima">Colima</a> and <a href="https://podman-desktop.io">Podman</a>, but I wanted to give the Apple variant a try.</p>

<h1 id="installation">Installation</h1>

<p>Tahoe comes with the underlying Virtualisation Framework. All that is needed is the Userland client, called <a href="https://github.com/apple/container">Container</a> to operate it, as the rest will be downloaded on first use.</p>

<p>The client can either be obtained via <a href="https://formulae.brew.sh/formula/container">homebrew</a> (<code class="language-plaintext highlighter-rouge">brew install container</code>) or via the standalone package from <a href="https://github.com/apple/container/releases/">GitHub Releases</a>.</p>

<h1 id="getting-started">Getting Started</h1>

<p>To be able to use it the Virtual Machine with the Linux Container has to be started:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>container system start
</code></pre></div></div>

<p>It will automatically download everything it needs, like the Linux VM the Containers run and build in.</p>

<h2 id="start-with-system">Start with System</h2>

<p>Unfortunately the VM has to be manually started after each reboot. While a <a href="https://github.com/apple/container/issues/158">solution is currently underway</a>, in the meantime we can define our own LaunchAgent:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cat</span> <span class="o">&gt;</span> ~/Library/LaunchAgents/com.user.container.autostart.plist <span class="o">&lt;&lt;</span> <span class="sh">'</span><span class="no">EOF</span><span class="sh">'
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
    &lt;key&gt;Label&lt;/key&gt;
    &lt;string&gt;com.user.container.autostart&lt;/string&gt;
    &lt;key&gt;ProgramArguments&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/usr/local/bin/container&lt;/string&gt;
        &lt;string&gt;system&lt;/string&gt;
        &lt;string&gt;start&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;RunAtLoad&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;StandardOutPath&lt;/key&gt;
    &lt;string&gt;/tmp/container-autostart.log&lt;/string&gt;
    &lt;key&gt;StandardErrorPath&lt;/key&gt;
    &lt;string&gt;/tmp/container-autostart.log&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</span><span class="no">EOF
</span></code></pre></div></div>

<h1 id="builder-without-rosetta">Builder without Rosetta</h1>

<p>I don’t have Rosetta installed and don’t want to install it. <a href="https://github.com/apple/container/issues/103#issuecomment-3003675213">But since Apple can’t know what platform a container is targeting until after it is brought up, they always enable Rosetta support</a>, which fails the build if it isn’t installed.</p>

<p>This behaviour can be configured out by disabling Rosetta globally for all Containers:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">mkdir</span> <span class="nt">-p</span> ~/.config/container
<span class="nv">$ </span><span class="nb">echo</span> <span class="s2">"[build]</span><span class="se">\n</span><span class="s2">rosetta = false"</span> <span class="o">&gt;&gt;</span> ~/.config/container/config.toml
</code></pre></div></div>

<h1 id="uses">Uses</h1>

<p>Once it is up and running it acts as a drop-in replacement for Docker. In command invocations, <code class="language-plaintext highlighter-rouge">docker</code> can be replaced with <code class="language-plaintext highlighter-rouge">container</code>, except for a few fringe use-cases, like inotify and IPv6 forwards.</p>

<p>This post was written using a Jekyll image continuously rendering previews for changes to this document running in the Container Framework. Works perfectly fine.</p>

<p>But unfortunately there’s one specific use-case that currently prevents me from uninstalling Docker.app from my machine: Permanent Gitea Action Runner in the background.</p>]]></content><author><name>Jan Seeger</name></author><category term="playground" /><category term="docker" /><category term="container" /><summary type="html"><![CDATA[With macOS 26 Tahoe, support for running OCI-style containers is directly built into the OS. Similar to Microsoft’s Virtual Machine Platform, which is a subset of their Hyper-V offering.]]></summary></entry><entry><title type="html">Chinese Domain Scam</title><link href="https://jan.alphadev.net/blog/2026/chinese-domain-scam/" rel="alternate" type="text/html" title="Chinese Domain Scam" /><published>2026-06-15T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/chinese-domain-scam</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/chinese-domain-scam/"><![CDATA[<p>About once a year I receive an email from a Chinese (Domain) Registry that claims to supposedly inquire for a company that is about to register the <em>alphadev.cn</em>, <em>alphadev.com.cn</em>, <em>alphadev.net.cn</em> and <em>alphadev.org.cn</em> domains.</p>

<p>It starts by setting a false urgency:</p>

<blockquote>
  <p>If you are not the person who is in charge of this, please forward this to your CEO, because this is urgent. Thanks!</p>
</blockquote>

<p>Then they ask whether I have any business with said entity:</p>

<blockquote>
  <p>But after checking it, we find this name conflict with your company name or trademark. In order to deal with this matter better, it’s necessary to send email to you and confirm whether your company have affiliation with this CN company or not?</p>
</blockquote>

<p>If I don’t answer, another follow-up broadly repeating the initial message is sent.</p>

<p>But regardless of me responding, or whether I “permit” or “deny” the “company” to go through with the registration, a third email from a supposed representative of the registering company is sent that claims that they intend to register the domains in any case:</p>

<blockquote>
  <p>We are waiting for Mr. $name_of_registry_official approval and think these CN domains and internet keyword are very important for our business. Even though Mr. $name_of_registry_official advises us to change another name, we will persist in this name.</p>
</blockquote>

<p>After that last message there is silence for about a year and neither of the domains are ever being registered.</p>

<p>I assume this is a high-pressure sales tactic to have people register .cn-<acronym title="Top-Level Domain">TLD</acronym>s. I haven’t checked their <acronym title="Terms of Service">ToS</acronym> and I don’t even know what registering a Chinese domain entails or costs.</p>

<p>But what I <em>am</em> certain about is that I don’t want to register these domains and should I ever “expand my business” to China, I’m sure I will be able to find a suitable domain myself, and so will you if you made your way here by searching for strings from such an email.</p>]]></content><author><name>Jan Seeger</name></author><category term="misc" /><summary type="html"><![CDATA[About once a year I receive an email from a Chinese (Domain) Registry that claims to supposedly inquire for a company that is about to register the alphadev.cn, alphadev.com.cn, alphadev.net.cn and alphadev.org.cn domains.]]></summary></entry><entry><title type="html">Running modern Git on ancient Synology kernels - revisited</title><link href="https://jan.alphadev.net/blog/2026/git-on-synology-2/" rel="alternate" type="text/html" title="Running modern Git on ancient Synology kernels - revisited" /><published>2026-06-05T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/git-on-synology-2</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/git-on-synology-2/"><![CDATA[<p>In the <a href="/blog/2026/git-on-synology/">original post</a> I had made small shim that redirects calls from libc getrandom to the Kernel device.</p>

<p>Since I had used alpine images, linking against libmusl was a reasonable choice, but that meant this hack would be limited to libmusl-based images.</p>

<p>I have since found a way to generalise this to work with any flavor of libc:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// getrandom_shim.c  — no libc dependency</span>
<span class="cp">#include</span> <span class="cpf">&lt;sys/syscall.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stddef.h&gt;</span><span class="cp">
</span>
<span class="k">static</span> <span class="kt">long</span> <span class="nf">sys</span><span class="p">(</span><span class="kt">long</span> <span class="n">n</span><span class="p">,</span> <span class="kt">long</span> <span class="n">a</span><span class="p">,</span> <span class="kt">long</span> <span class="n">b</span><span class="p">,</span> <span class="kt">long</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">long</span> <span class="n">r</span><span class="p">;</span>
<span class="cp">#if defined(__x86_64__)
</span>    <span class="k">register</span> <span class="kt">long</span> <span class="n">r10</span> <span class="n">asm</span><span class="p">(</span><span class="s">"r10"</span><span class="p">);</span> <span class="c1">// unused here</span>
    <span class="n">asm</span> <span class="k">volatile</span><span class="p">(</span><span class="s">"syscall"</span> <span class="o">:</span> <span class="s">"=a"</span><span class="p">(</span><span class="n">r</span><span class="p">)</span> <span class="o">:</span> <span class="s">"a"</span><span class="p">(</span><span class="n">n</span><span class="p">),</span><span class="s">"D"</span><span class="p">(</span><span class="n">a</span><span class="p">),</span><span class="s">"S"</span><span class="p">(</span><span class="n">b</span><span class="p">),</span><span class="s">"d"</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
                 <span class="o">:</span> <span class="s">"rcx"</span><span class="p">,</span><span class="s">"r11"</span><span class="p">,</span><span class="s">"memory"</span><span class="p">);</span>
<span class="cp">#elif defined(__aarch64__)
</span>    <span class="k">register</span> <span class="kt">long</span> <span class="n">x8</span> <span class="n">asm</span><span class="p">(</span><span class="s">"x8"</span><span class="p">)</span><span class="o">=</span><span class="n">n</span><span class="p">,</span> <span class="n">x0</span> <span class="n">asm</span><span class="p">(</span><span class="s">"x0"</span><span class="p">)</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">x1</span> <span class="n">asm</span><span class="p">(</span><span class="s">"x1"</span><span class="p">)</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">x2</span> <span class="n">asm</span><span class="p">(</span><span class="s">"x2"</span><span class="p">)</span><span class="o">=</span><span class="n">c</span><span class="p">;</span>
    <span class="n">asm</span> <span class="k">volatile</span><span class="p">(</span><span class="s">"svc 0"</span> <span class="o">:</span> <span class="s">"+r"</span><span class="p">(</span><span class="n">x0</span><span class="p">)</span> <span class="o">:</span> <span class="s">"r"</span><span class="p">(</span><span class="n">x8</span><span class="p">),</span><span class="s">"r"</span><span class="p">(</span><span class="n">x1</span><span class="p">),</span><span class="s">"r"</span><span class="p">(</span><span class="n">x2</span><span class="p">)</span> <span class="o">:</span> <span class="s">"memory"</span><span class="p">);</span>
    <span class="n">r</span> <span class="o">=</span> <span class="n">x0</span><span class="p">;</span>
<span class="cp">#endif
</span>    <span class="k">return</span> <span class="n">r</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">long</span> <span class="nf">getrandom</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">len</span><span class="p">,</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">flags</span><span class="p">)</span> <span class="p">{</span>
    <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">flags</span><span class="p">;</span>
    <span class="kt">long</span> <span class="n">fd</span> <span class="o">=</span> <span class="n">sys</span><span class="p">(</span><span class="n">SYS_open</span><span class="p">,</span> <span class="p">(</span><span class="kt">long</span><span class="p">)</span><span class="s">"/dev/urandom"</span><span class="p">,</span> <span class="mi">0</span> <span class="cm">/*O_RDONLY*/</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">fd</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="kt">long</span> <span class="n">n</span> <span class="o">=</span> <span class="n">sys</span><span class="p">(</span><span class="n">SYS_read</span><span class="p">,</span> <span class="n">fd</span><span class="p">,</span> <span class="p">(</span><span class="kt">long</span><span class="p">)</span><span class="n">buf</span><span class="p">,</span> <span class="p">(</span><span class="kt">long</span><span class="p">)</span><span class="n">len</span><span class="p">);</span>
    <span class="n">sys</span><span class="p">(</span><span class="n">SYS_close</span><span class="p">,</span> <span class="n">fd</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We now have to add <code class="language-plaintext highlighter-rouge">-nostdlib</code> to the compilation command, but <code class="language-plaintext highlighter-rouge">musl-dev</code> is still needed for the syscall headers:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--rm</span> <span class="nt">-v</span> <span class="s2">"</span><span class="nv">$PWD</span><span class="s2">"</span>:/src <span class="nt">-w</span> /src alpine:3.19 sh <span class="nt">-c</span> <span class="se">\</span>
  <span class="s2">"apk add --no-cache gcc musl-dev &amp;&amp; gcc -shared -fPIC -nostdlib -O2 -o getrandom_shim.so getrandom_shim.c"</span>
<span class="nb">chmod </span>644 getrandom_shim.so
</code></pre></div></div>

<p>And now we can use the <code class="language-plaintext highlighter-rouge">getrandom_shim.so</code> for any images, regardless of what style of libc they use.</p>

<p>On that note, this follow-up post answers whether this hack is still in place.</p>]]></content><author><name>Jan Seeger</name></author><category term="playground" /><category term="synology" /><category term="git" /><summary type="html"><![CDATA[In the original post I had made small shim that redirects calls from libc getrandom to the Kernel device.]]></summary></entry><entry><title type="html">Trip Report: Munich</title><link href="https://jan.alphadev.net/blog/2026/trip-report-munich/" rel="alternate" type="text/html" title="Trip Report: Munich" /><published>2026-05-23T00:00:00+00:00</published><updated>2026-09-08T13:47:18+00:00</updated><id>https://jan.alphadev.net/blog/2026/trip-report-munich</id><content type="html" xml:base="https://jan.alphadev.net/blog/2026/trip-report-munich/"><![CDATA[<p><em>This post is written in July 2026, but was dated back to when the trip originally happened.</em></p>

<p>I attended Kotlin Conf in Munich, and a wedding in Ulm the following weekend. It was supposed to be nice weather and I decided to combine the two and travel by motorcycle.</p>

<p><img src="/assets/2026/IMG_5135.jpeg" alt="Map showing the Route" /></p>

<h1 id="day-1-journey-to-munich">Day 1: Journey to Munich</h1>

<p>The plan was to travel along cities to stretch out the range and delay stopping for a charge. Which I did in Ulm where a charging station was conveniently placed right next to a bakery. Time for lunch.</p>

<p>The trip had started with the best weather. But during my last charging stop in Augsburg it started to pour down heavy rain. I set the bike to rain mode and pressed on. Somewhere between Ismaning and Aschheim the streets got dry again but at that point I was already soaked through.</p>

<p>3 KMs before my destination my legs started to cramp and I had to decide whether to stop and rest or press on and be done. I decided to go on.</p>

<p>Immediately after arriving at the apartment, I began to dry my clothes and hang them in the bathroom with the light on so the dehumidifier could do it’s thing.</p>

<h1 id="day-2-conference">Day 2: Conference</h1>

<p>There was a charger at the main entrance of the conference. But it was always occupied by other people. The ones at street level were either all occupied, and one free I finally found didn’t want to start the charging process.</p>

<p>There was an underground parking garage which supposedly had about 30 charges, but motorcycles and underground garages normally don’t go along well. But lacking any other options I had to try.</p>

<p>It didn’t say no motorcycles allowed anywhere, so I approached the gate. It was one of those license plate reader ones. But when I was about to turn away, it opened. I didn’t check whether it had captured my license plate.</p>

<p>In the parking garage there wasn’t just one spot for electric vehicles but lots of small islands with 2 chargers each. They all were pointed to by different and partly contradictory  signs, which made it extra confusing. I finally found one and it worked<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup>.</p>

<p>After the charging I went to the payment machine and entered my license plate, but it couldn’t be found. Pressed the “call for help” button, which connected me to two people at the same time. They could hear each other, and I could hear them both, but they couldn’t hear me. It took them a while to find out that both are garage employees and after they hung up I pressed it again. This time just one clerk and we could both hear each other. I explained the situation and he said I don’t have to pay just drive out.</p>

<p>Hopped on the bike, followed the signage to the nearest exit and then I noticed that the gap between the barriers was big enough for me to drive through, so I didn’t wait in front of it to open and went out.</p>

<p>My clothes still were damp to the touch. I spent the evening drying off clothes in the bathroom with the hair dryer.</p>

<h1 id="day-3-journey-to-ulm">Day 3: Journey to Ulm</h1>

<p>I had to check out of the apartment but the conference would go on for another day. I packed everything to be ready for the road, dressed “conference casual” and took my motorcycle clothes with me to the conference and checked it into the garderobe there.</p>

<p>In the afternoon I then got it back, disappeared into a bathroom stall and switched to the motorcycle clothes, which unfortunately still were a little bit damp on the inside. After half an hour riding in the hot sun that was taken care of.</p>

<p>I deliberately took the long way round back through small villages and rural towns. Ate late lunch at a bakery next to a parking lot with chargers <sup id="fnref:2"><a href="#fn:2" class="footnote" rel="footnote" role="doc-noteref">2</a></sup>.</p>

<p>And then arrived timely in Schelklingen. Originally my plan was to leave the bike there, attend the wedding and the next day drive towards Ulm to charge. But the hotel had their own dedicated customer charging spot, which they put on the hotel bill at the end.</p>

<h1 id="day-5-home">Day: 5: Home</h1>

<p>The drive home was uneventful and beautiful. And since it was a sunny Sunday morning I encountered lots of other bikers.</p>

<h1 id="résumé">Résumé</h1>

<p>Weather was nice, except for the downpour on my way there. Charging was annoying but never an actual issue<sup id="fnref:3"><a href="#fn:3" class="footnote" rel="footnote" role="doc-noteref">3</a></sup>. Conference was nice. Wedding was nice. Would do it again, but this time I’d pack differently.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>Had to clear the plug and the socket of the rainwater that had collected there with my shirt because I didn’t have any tissues with me. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2">
      <p>Shops, Malls, Bakeries, and parks near charging infrastructure is becoming a theme here. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3">
      <p>It is always annoying to arrive in a new unfamiliar city and do the public charger roulette. E-Mobility at home is just way more comfortable. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Jan Seeger</name></author><category term="trip report" /><category term="motorcycle" /><category term="zero s 2024" /><summary type="html"><![CDATA[This post is written in July 2026, but was dated back to when the trip originally happened.]]></summary></entry></feed>