GeistHaus
log in · sign up

https://f5n.org/atom.xml

atom
100 posts
Polling state
Status active
Last polled May 18, 2026 19:56 UTC
Next poll May 19, 2026 19:02 UTC
Poll interval 86400s
ETag "dgodcm6cdt8v12abm-gzip"
Last-Modified Wed, 25 Feb 2026 21:43:07 GMT

Posts

Cycling on the D11, part 3
Show full content

In 2023 I started cycling along the D11 (Ostsee-Oberbayern-Radweg) across Germany, doing 500km on that trip, then 300km in 2024.

This is part 3, four days and 430km.

Obligatory log picture

Planning

The route was clear (duh), but not the stops. This time I wanted to push myself a bit, but I also had to take into account the availability of hotels and the price, otherwise I might have cut down the route a little bit.

What I decided on:

  • Hof to Kaulsbach (close to Saalfeld): 113km
  • Kaulsbach to Freyburg: 123km
  • Freyburg to Alsleben: 115km
  • Alsleben to Dessau: 80km (with an optional detour of 30km)

D11 2025 route

Preparations

I didn't need a lot of new gear, but I wanted new rain pants, as my 10 (or more likely 12 or 13) year old pair was already disintegrating, so I grabbed a pair for 60 EUR at Lucky Bike and happened to find a black jersey on the discount pile for 40 EUR (matching my black MTB shorts, also Endura), so I bought that as well.

My trusty Garmin eTrex that I'd bought in 2016 for 170 EUR had lost its power button on a recent hiking trip. Probably not unfixable but I'd already wanted to get a newer, proper cycling GPS for a while, so after some research I went with the Edge 840 because I'd been happy with Garmin devices in the past. The eTrex and also the car navi was fine. I ended up paying 390 EUR for it.

The irony of probably paying more for this thing than for any mobile phone/tablet I have ever owned is not lost on me. But in my defense I'm not that worried about security and plan to keep using it for 8-10 years if it holds up, just like the last one.

Day 1 - Hof - Kaulsbach

My train to Hof was scheduled for 5:44 and I need 30 minutes of (slow) riding to the train station, so I got up at around 4:15 with most things already packed and went on my merry way, forgetting I'll be passing that one club with many drunk people and glass on the street at 5 am, as on every early morning weekend ride to the main station.

The train arrived on time at 9:20, then I noticed that I should have spent a little more time famliarizing myself with the Garmin Edge, so I took a little detour because I messed up, still in Hof.

At some point I passed into Thuringia, but I don't remember seeing a sign on that gravel path.

As it was Father's Day I saw a lot of groups (mostly men, but not only) hiking, walking, drinking beer, cycling and to my surprise I was cheered on quite a few times when they noticed I'm the only idiot on this route without an e-bike.

Saale ferry

Speaking of the route... too much elevation, too many small hills and mountains. Had to push the bike a couple times. In total around 1600m of ascent, but the scenery was mostly nice.

I had some Thüringer Rostbratwurst and a Coke for lunch, not even completely sure where it was, in a small village, my best guess is Saaldorf.

The hotel I chose was pretty nice, could bring the bike in to the closed off courtyard and they had something to lock it to the wall.

Dinner in their restaurant was also very good (Soljanka and Wiener Schnitzel).

For some reason I couldn't really fall asleep, despite that very exhausting day, but I think I still got 8h in the end.

Breakfast was also really good here.

Day 2 - Kaulsbach - Freyburg

Because of the breakfast and being slow to pack up again I only started at around 9 am and hit another climb just 1km into my tour, that's when I decided to push the bike a little more.

I think it was on this day (but not 100% sure) when a lady flagged me down in the middle of the forest because she had a flat on her e-bike. I tried to help and pump it up but I guess it was proper done for, so she had to continue pushing the bike for a km or so, but seemed relatively unfazed. Maybe I could have tried to make my spare tube fit and replace it but with 100km ahead I wasn't too enthusiastic about it so I didn't suggest it.

At some point I passed into Saxony-Anhalt, but again I didn't see any sign.

Originally I wanted to stay in Naumburg, but for some reason (on this day I think it was the price) I chose to cycle another 7km or so to the north and stay in Freyburg.

The room was decent, the bathroom was a little small for someone my size, but overall ok. Could bring the bike into the entry hall of the building.

Went to Haveli, an Indian Restaurant, for dinner, quite a big portion of Chicken Tikka Masala and some Naan, and pretty good.

Naumburger Dom

Day 3 - Freyburg - Alsleben

The weather was good, but I had to backtrack 7-8km to the south, and went through Naumburg, where I had incorporated a couple photo spots into my route, then to Weißenfels and Leuna, then coming to Merseburg, where again I had changed the route slightly to take a detour into the city proper.

Because this was going to be another long day, but with less elevation and thus more time, I decided to have a proper lunch for once, so I chose the best-rated pizza place and was very disappointed. Waiter wasn't sure what to make of my order of a Pizza Prosciutto because they only had a Prosciutto e Funghi or a Hawaii but after explaining which word is the Prosciutto and which word is (are?) the Funghi, at least that part worked out. It didn't taste great though and I'm not sure when I ever left the outer part of a pizza... ah well.

On to Halle and mostly ignoring it because I've been here already a couple of years ago and further north through Könnern, to Alsleben (and still following the river Saale).

Grabbed dinner at a small pension/restaurant in the town center and talked to the only other guest at the next table, also a cycling tourist. A welcome surprise, apparently I'm not so good with chatting up other cyclists on my tours as other people are.

Because my shoulder had started to hurt the day before I had picked up some stuff from a drugstore in the morning, luckily it was Saturday and they were still open.

Either I hadn't read the booking page carefully or they were not very obvious with their offering, but I was a little surprised to find a communal shower (and toilet) next to the small log hut I'd booked. Not a problem, really - but they had failed to mention that showering was to be paid with 1 EUR coins and even the toilet was locked behind 20ct coins, but it was open when I arrived, or I would have probably been less chill about it. Also apparently the last guests had taken the only set of keys with them and those would be mailed back in the future... so I had no keys to my room, but I wasn't too worried about that, being on a property, behind another house and a fence. But they had no curtains in the hut and so the sun woke me up at 5:30...

But at least it was cheap, and it actually looked as nice as on the pictures, and I could sit on my own porch and look out on the river in the evening.

Saale

Day 4 - Alsleben - Dessau

Although I'd slept quite well, it was pouring in the morning and I wasn't actually enthusiastic about another 100km, I opted to skip my optional detour to Aschersleben, which would have added around 30km, and I felt 80 was gonna be enough for that day.

I think I liked this day less than the others, mostly because there were lots of boring stretches with no features, sometimes along bigger roads, less kilometers through forests or along rivers. Not bad, but just not as exciting.

Also this was the first day where my bum hurt, and my shoulder also hurt again.

So because my bus was going to go at 1:50 in the night, arrive 15min from home at around 7:15 and I was scheduled to be online at 8:00 to be on-call for the week at work and not completely optimistic to be sleeping well or at all on the bus I opted to take a cheap hotel room in Leipzig and try to sleep from around 8pm to 1 am, which surprisingly mostly worked. 40 EUR well spent. Also the room was pretty nice, not even taking the price into account.

At first I had planned to maybe take a bed in a hostel for 15 EUR, but for this case where the only things I wanted were a shower and silence for a couple of hours and not having to care about the bike or getting a towel or whatever... I guess the 20-25 EUR was an ok tradeoff.

To my surprise the bus thing worked out fine, and I could actually sleep a couple hours more, so I didn't feel too bad in the morning and also didn't have to instantly jump in the shower again.

The bike was hella dirty though after 5h on the back of a bus.

Oh, and here's the GPX result in comparison to the route above:

D11 2025

Packing list

Not too many changes to last year's setup, and also not too many changes to the 2023 setup either.

  • same bike, KTM X-Strada
  • same handle bar, frame, and top tube bag
  • same backpack
  • same pannier (single one)
  • same shoes, same clothes (mostly)

Stuff I had changed before the trip:

  • second bidon in the bottle holder, only for water and not sugary stuff
  • new bike pump
  • some voile straps in the frame bag

Deliberate changes for this trip:

  • no water bladder
  • new jacket, Marmot Gore-Tex Hardshell, no more Columbia rain jacket
  • more rain/cold weather gear overall
  • backup wall plug and cable
  • banana!
  • less sweets, no gels, just some store-bought oat/cereal bars
  • daily dose of magnesium against cramps (it helped)
  • no bulky glasses case, only a light felt pouch

Mistakes I noticed:

  • accidentally took a second pair of long pants (bulky)
  • forgot a normal T-Shirt for dinner
  • backpack was a little too heavy on day 1/2

What I still have not figured out:

  • the bike lock situation
  • easy access to rain gear
  • easy access to phone for pictures
  • not forgetting handkerchiefs and thus relying on napkins

Stuff I didn't use:

  • windbreaker jacket
  • in-ear headphones
Expenses
  • Preparation
    • new pair of rain pants - 60 EUR
    • a new black bike jersey - 40 EUR
    • Garmin Edge 840 - 393 EUR
  • Hotels:
    • Kaulsbach: 70 EUR
    • Freyburg: 77 EUR
    • Alsleben: 45 EUR
    • Leipzig: 40 EUR
  • Trains & Buses:
    • 32 + 7 EUR for a Bayernticket to Hof (+ bike)
    • 13.40 EUR for the S-Bahn from Dessau to Leipzig (bike was free)
    • 28 + 13 EUR for flixbus for me and the bike

I didn't really pay as much attention to drinks and snacks this time, just the "proper" meals I had.

  • Day 1 lunch: ~8 EUR
  • Kaulsbach, dinner: 30 EUR
  • Day 2 lunch: ~13 EUR
  • Freyburg, dinner: 25 EUR
  • Day 3 lunch: 24 EUR
  • Alsleben, dinner: 30 EUR
  • Day 4 lunch: ~5 EUR
  • Leipzig, dinner: 18 EUR
Final thoughts

It was fun, but I underestimated the elevation on day 1. Day 2 should have been a bit more relaxing but still quite a few kilometers, and I guess that's why I ended up cutting day 4 a bit short. A rough estimation tells me that I have about 550km left to reach the Baltic Sea now. I hope to complete this in 2026 and not have to split it into two parts, but we'll see. Getting to the start and getting back is becoming increasingly annoying. The way back in 2023 was only about 2:20h by train, getting to the start was already 3:30h this time, and getting back was 5:30h on a bus.

Having the new Garmin and connecting it to the phone was really great, I used brouter and gpx.studio for on the fly checking and planning my routes when having breaks and in the evening.

And yeah, this should have been published last summer, it was even mostly written but I never came around finishing it until February 2026.

https://f5n.org/blog/2026/d11-part-three/
Ripping Audio CDs
Show full content

For some reason or other I currently don't have a tower PC with a CD-ROM drive connected, or even an available slot.

But I have this 2004 nx7010 laptop which has a hopefully functional CD Writer.

# dmesg | grep ^cd

Yep, it shows up. For some reason I have not yet found out you need to use cd0c though and not cd0.

This just works, as cdio is preinstalled:

# sudo cdio -f cd0c cdrip

And then you have a couple of track0x.wav.

Unfortunately the cddbinfo instead of cdrip does not work anymore. Shame.

And while I have not tested it, writing them should work like this:

cdio -f cd0c tao -a -s auto *.wav

Bonus:

cdio -vv info

Source: https://daemonforums.org/showthread.php?t=6560

Addendum: Because that machine is slow I did the actual conversion on Linux:

for i in $(ls /data/mp3/wav/ALBUM/*wav); do
  echo $i;
  o=$(basename $i | sed 's,wav,flac,');
  ffmpeg -i $i $o;
 done

parallel -j 4 ffmpeg -i {} -qscale:a 0 {.}.mp3 ::: ./*.flac

Could've parallelized the first one if they were in the same dir, whatever.

According to this page, the -qscale:a 0 is the -V 0 arg to lame, aka: VBR 220-260, the best that is not a fixed 320kbit/s bitrate.

easytag + gnudb works for tagging the FLACs, and they get copied to the MP3s.

Reference: cdio man page

https://f5n.org/til/openbsd/ripping-audio-cds/
CD-DB
Show full content

I've bought, collected, and ripped my own CDs for a very long time.

Some of those old rips were done in a terrible quality and need to be redone, and I might as well rip them to FLAC for archival purposes.

So I wanted a list of CDs I own, at least the important ones that I have on my shelves, from my favourite bands.

Now I know there must be a ton of systems that have all the fancy features, but I didn't know their names and after a brief web search I could not find anything that matched my needs, or they didn't advertise those:

  • scan barcode with mobile phone
  • look up and fetch the metadata
  • export all the data
  • have a non-shitty phone app without ALL permissions

So in the end I built something for myself.

I found barcode-scanner which is web-based, can be self-hosted and mostly did what I wanted.

screenshot of the barcode-scanner web app
screenshot of the barcode-scanner web app

I made an ugly 7 line patch that added a simple link that opens in a new tab with the scanned barcode as a GET parameter.

Then I wrote a small PHP script that

  • takes a ?barcode= parameter
  • checks the MusicBrainz API for that barcode
  • writes the result (parsed and raw JSON) to an SQLite db
  • shows an error if nothing is found
  • alternatively also takes an ?id= parameter (we'll come to that)

So this is how it works:

  • take a CD from a stack facing back side up
  • scan a barcode
  • tap on the last link shown
  • check the new tab for errors
  • close the tab
  • go back to the barcode-scanner tab
  • keep the CD out of the stack on error

For the ones with errors I search the title of the album on MusicBrainz, then find a somewhat matching release and copy their MBID and manually call my script with it. Really important is just the track list here.

I didn't exactly pay attention but I think I did not have to manually look up more than 10%, maybe 5%. I scanned 160 album cases as the first batch and I think I had to look up like 10-12.

Finally I wrote a small table view with filtering on that same SQLite DB, and I already had the filtering JS in a different project.

screenshot of a web page with a list of
music albums, all by the band In Flames
screenshot of a web page with a list of music albums, all by the band In Flames

Time investment: maybe 2h and < 300 lines of code

I guess just typing the 160 album names with artist and title would have taken longer, and I wouldn't have all the metadata.

Now I guess I just need to find more CDs and then compare to my mp3 folder and get to ripping stuff.

https://f5n.org/blog/2026/cd-db/
WiFi on OpenBSD
Show full content

In theory it's really easy, in practice the manpage didn't help me.

Assuming my interface is available because it's supported by default:

# cat /etc/hostname.rtwn0
join 'net name1' wpakey 'secret'
join 'net name2' wpakey 'secret'
inet autoconf

# ifconfig rtwn0 media
# ifconfig rtwn0 scan

# sh /etc/netstart

Notes:

  • join works with several, the old nwid only works once
  • man hostname.if

Reference: openbsd-desktop.rocks/posts/wi-fi-connection/

https://f5n.org/til/openbsd/wifi/
Install Date
Show full content

Apparently there is no uniform way to find out when an OS was installed, so here are several ways I found, which might or might not work:

Linux
# This is btrfs on Arch
# stat /
...
 Birth: 2026-01-07 12:22:11.134890097 +0100

I checked 1-2 machines and even after log rotation the oldest files in /var/log matched the date from stat. I could not find any apt-logs from installation but in the case of Debian it was a VPS, so no idea what they did there. On a relatively fresh install of Arch there was only one file /var/log/old that was backdated to many months before the install, even before the date I had written down for the installer ISO.

Finding symlinks created in /etc sounded more reliable, unless they were also recreated, but the oldest might be correct.

Debian
# this is ext4 on Debian 12
# stat /
...
 Birth: 2026-01-07 12:22:11.134890097 +0100

 Birth: 2023-06-14 13:02:31.000000000 +0200

If the system never got a point release, then ls -al /etc/debian_version might work, but I would not bet on it.

FreeBSD
# stat /
87 2 drwxr-xr-x 20 root wheel 5056 512 "Jan 29 11:20:50 2026" ...

# ls -lt /var/log | tail -n 3
-rw-------  1 root  wheel        60 Jan 29 11:40 xferlog
-rw-------  1 root  wheel        60 Jan 29 11:40 security
-rw-r--r--  1 root  wheel        60 Jan 29 11:40 devd.log
# cat /var/log/devd.log
Jan 29 11:40:06 rpi-b newsyslog[891]: logfile first created
Windows

In a very unexpected turn of events, this seems easy on Windows (11):

# systeminfo
...
Original Install Date:         14/03/2025, 21:10:35
System Boot Time:              15/02/2026, 13:15:05
https://f5n.org/til/os/install-date/
Hardware Mute Button
Show full content

I've long been annoyed at having to alt-tab and find the mute button (or even more the UNmute button during Teams calls or Slack Huddles) when I have another window open, also having to memorize the different shortcuts.

So when I heard about a Korg nanoKONTROL2 being used I thought I'd also want to try that. I bought mine at Hieber Lindberg in their shop in Munich for 55 EUR.

bad picture of a Korg nanoKONTROL2

As I mostly wanted this for work first, this is about using macOS Tahoe.

First these are tools we need:

Korg Control Editor

Download and install the .dmg - I downloaded a KONTROL_EDITOR_251.dmg that turned out to be version 2.5.1.2.

screenshot of Korg Control Editor

Midipipe

I installed this via homebrew:

brew tap nicowald/subtlesoft
brew install --cask midipipe

and then I found this forum thread which provided me with a good starting point but I ended up starting from scratch.

The idea is that you add one "MIDI in" tool, choose your nanoKONTROL as the input:

screenshot of MidiPipe

and then one "AppleScript Trigger" tool and run commands based on the MIDI inputs.

screenshot of MidiPipe

In theory that's it, but I ran into several quality of life problems with this application:

The editor component is like TextEdit and uses autocomplete and helpful 'fixes', so for example it will replace every -- (a comment in AppleScript) into an — so to comment out a line you have to type dash dash (wait a split second) escape and it has no syntax highlighting.

Then I tried calling my own scripts in ~/Library/Script Libraries/ but I ran into weird caching issues, because the way MidiPipe works is that it compiles the script on first run and not on deliberate save and it somehow did not include the latest library, but some older cached version.

So in the end I settled on writing my full script (with functions) in the macOS Script Editor for syntax highlighting (which is still a bit buggy) and linting, and then copy/pasting the full script into MidiPipe. This is the least nerve-wracking method I found, also to test small changes on their own.

So here's a very basic example how to do anything with MIDI events in MidiPipe:

on runme(message)
    -- introduce some variables
    set m2 to (item 1 of message)
    set txt to "midipipe " & (item 1 of message) & ":" & (item 2 of message) & ":" & (item 3 of message)

    -- log to a file
    do shell script "echo " & quoted form of (txt as string) & " >> $HOME/tmp/as_debug.txt"

    -- display a popup
    display dialog "kontrol " & m2
end runme

and this is how you control some system volume settings and send key events to applications:

on muteOutput()

    set cur to output volume of (get volume settings)

    if cur is greater than 1 then
        set volume output volume 1
        set volume with output muted
    else
        set volume output volume 50
        set volume without output muted
    end if

end muteOutput

I'm still a little unsure if I want to do both volume 0/1 AND mute, or not. Interestingly there is no mute for microphone input, just for output. I originally chose 0 here but that auto-muted, so I had to unmute when raising it again.

on muteSlack()
    tell application "Slack"

        reopen
        activate
        repeat 1 times
            tell application "System Events" to keystroke space using {shift down, command down}
        end repeat

    end tell
end muteSlack

Of course the repeat 1 times superfluous but I'm keeping this in as a general reference for AppleScript, which is kinda fascinating and horrifying at the same time.

The way the events seem to work is that the message has three parts:

The first one seems to be an identifier of the hardware, I saw the value 144 in the example, but mine sends a 176, not so important where it comes from.

Then the second value is the button/slider/dial, that's where the Korg Control Editor comes in handy to display the numbers.

And the third one is the state of the control, a button fires 127 on keydown and 0 on keyup, the sliders and dials emit a value between 0 and 127 (inclusive) when you slide or turn them, based on the state.

With that knowledge I wrote a simple trigger function to check what has been used to not have all the lines in the dispatch function:

on trigger(message, t2, t3)

    set m1 to item 1 of message
    set m2 to item 2 of message
    set m3 to item 3 of message

    if (m1 = 176) and (m2 = t2) and (m3 = t3) then
        return true
    else
        return false
    end if

end trigger

and that's being used like this:

on runme(message)
    if trigger(message, 39, 127) then
        muteInput()
    end if
end runme

which would call the muteInput method once, when the S button in the 8th column is pressed (the top right button on the nanoKONTROL2, the one highlighted in the Control Editor screenshot).

So I am currently using only 6 buttons for my immediate needs:

  • Row 8 (rightmost)
    • S - mute input in macOS
    • M - mute output in macOS
    • R - send some keystrokes to TextEdit (for testing)
  • Row 7 (second from right)
    • S - mute Slack
    • M - mute Teams
    • R - send a test message to Slack (without Enter)

Useful enough but maybe not exactly worth 55 EUR and some hours. But I learned a lot about macOS and AppleScript.

The solution being used on Linux that triggered this whole adventure looks downright boring: Midi-pw-mixer.

https://f5n.org/blog/2026/hardware-mute-button/
Junctions on NTFS
Show full content

In older Windows versions you had to download Sysinternals' junction.exe in order to create symlinks/hardlinks.

Apparently the first positive thing about Windows 11 is that this is now included, but of course in the worst possible syntax.

New-Item -Type Junction -Value C:\target -Path .\new-name

To look at them:

Get-ChildItem -Attributes ReparsePoint

Remove with Remove-Item.

https://f5n.org/til/windows/junctions/
vi, not vim
Show full content

Once in a while (like on a freshly installed OpenBSD) I only have vi and not vim (or neovim) and it usually sucks.

If backspace doesn't work: ESC B J

https://f5n.org/til/vim/vi-not-vim/
Spacers in the macOS Dock
Show full content

The macOS dock doesn't just let you add spacers, but this can be fixed.

These are a built in way, but not great:

# Default size:

defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'

# Small size:

defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="small-spacer-tile";}'
killall Dock

Someone posted a debatably better way on reddit:

Create empty text file

Rename the file extension to .app

Right click on file and click on Get Info

On some graphic program - for example Figma. Create Vertical Line - 0.7px width, opacity 80%.
Color white; Make space on top about 10px and export that to png

Open that exported line image and click copy image

In window with Info about our new app -> click on folder icon and paste copied image.

App will get line icon.

Move this app to Application / Utils

Move this app to Dock. You will get separator with vertical line there.

If you need two separators, then just make copy of this file and insert that again to Dock
https://f5n.org/til/osx/dock/
aws-cli
Show full content

The command aws cloudformation describe-stack-resources is handy

aws cloudformation describe-stack-resources --physical-resource-id BUCKET_NAME
--logical-resource-id RioCloudWatchDistribtionFrontEndBucket550600D4

https://f5n.org/til/aws/aws-cli/
Tools: 2026 edition
Show full content

I wrote about tools on Windows in 2019 and I wanted to write an update to that post for a while already. Now with extra content!

Windows
  • Browsers

    • Firefox as the default, with several multi-account containers
      • Pinned browser tabs for Matrix, Slack, WhatsApp, Mail
    • Vivaldi for some stuff instead of a container
  • E-Mail

    • kinda got into the habit of using webmail and have not set up Thunderbird
  • IRC

    • Quassel, as usual
  • Audio/Video

    • I just set up mpd, currently I am using Cantata as my client
    • nomacs instead of IrfanView, although it's worse
  • Editors

    • Notepad++
  • Voice

    • Discord
    • Trialing Ferdium here for chat, only starting the Discord client for voice
  • Passwords

    • KeePassXC
  • Network stuff

    • PuTTY
    • FileZillaPortable
    • Remote Desktop Connection or whatever the offical name for the Win11 RDP client is
    • Syncthing
  • Misc

    • SharpKeys
    • WinSplit Revolution 11.04
    • 7ZipPortable
    • Flow-Launcher instead of Launchy now
    • Sysinternals
      • mosty Autoruns and procexp, sometimes tcpview

    Quite pared down, but as I hate working on it I've moved everything I can to Linux. My traditional C:\Apps\bin looks downright barren compared to years ago. (This is where I put shortcuts to everything, and give the dir to the launcher instead of letting it go wild everywhere and potentially finding useless stuff.)

Linux

As I am currently writing this on my NUC via RDP and it's a pretty new setup (and I'm not using Linux for work at the moment), this will be shorter.

  • Browser
    • Firefox
  • Editors
    • neovim - tried out CyberNvim and it stuck for now
    • TextAdept for notes
  • Window managers/DEs
    • xfce4 on the NUC because using the super key via RDP is meh
    • KDE Plasma on my main laptop because it's a casual couch device now
    • i3 on my old "work" laptop and this or sway would be my #1 choice for work again
  • Misc
    • rofi because the xfce launcher is not great
    • zenity

The funny thing is that while this would be the easiest OS to customize, it's the one I have to do the least because I can choose my WM and configure stuff. And a lot of times I just don't ever actively think about a tool because I have a proper shell open anyway (somewhat true for the mac as well, but definitely not for Windows). E.g using bc instead of a GUI calculator. Or just quickly starting a Python repl, or just using some stuff in /bin or something from my dotfiles.

mac OS
  • Browser
    • Firefox for most tasks
    • LibreWolf for "personal stuff", e.g. logged into my own Github account, Webmail, etc
    • Safari only for the SAP portal where I file my vacation requests
    • Chrome installed as a Backup, only used for LinkedIn, useless
  • E-Mail
    • Outlook Web, 90% of the time
    • Outlook (the app), when I need to access our shared team inbox
  • Audio/Video
    • Cog plays mp3s
    • recently Cantata to control mpd at home
  • Editors
    • IntelliJ as my main IDE
    • Neovim
    • TextAdept for notes
  • Passwords
    • KeePassXC
  • Network stuff
    • Windows App, Microsoft's better RDP client
    • Syncthing
  • Terminals
    • Ghostty after some time with WezTerm
  • Window Management etc
    • Hammerspoon
    • Rectangle
  • Misc
    • Podman Desktop works surprisingly well for what I need, not using the GUI much though, but it provided me with a working podman setup
Plugins

Firefox: All three very important and I've not missed anything else.

  • Consent-O-Matic
  • Firefox Multi-Account Containers
  • uBlock Origin
  • (rarely installed) FoxyProxy
Fonts

Might as well put these here. What I use is changing over time, but there are a few choices that I don't change around much.

  • Terminals
    • Usually Iosevka
  • IRC
    • Fantasque Sans Mono for the last few years, Iosevka in the past
  • Text editor (Non-IDE)
    • Consolas or Iosevka on Windows
  • IDE
    • I kinda like JetBrains Mono and never changed it since they introduced it, but for some reason I also never switched all my IDEs on other machines.
Themes and colors

I have this seemingly odd idea of wanting to read what is written on my tabs, so I've been using this Firefox theme for the last 10 years. Honorable mention.

I've not themed and styled all my apps in the same colorscheme, although I wrote about it - but I'm still using a mix of Dracula, Solarized Dark, Monokai, Nord, and other things, usually to not have it uniform, but quicker to distinguish between them :D.

https://f5n.org/blog/2026/tools-2026-edition/
systemd timers
Show full content

This arch box does not have cron installed so I tried systemd timers for the first time.

First I planned to do a user service, but this seems to have problems.

It needs two files, one .service and one .timer.

$ cat /etc/systemd/system/my-service.service

[Unit]
Description=Runs my-service
Wants=my-service.timer

[Service]
Type=oneshot
ExecStart=/bin/uv run --with numpy /usr/local/bin/my-service.py -1

[Install]
WantedBy=multi-user.target
$ cat /etc/systemd/system/my-service.timer

[Unit]
Description=Runs my-service
Requires=my-service.service

[Timer]
Unit=my-service.service
OnCalendar=*-*-* *:45:00
# this is enough to make it run on a timer
systemctl start my-service

# enable after boot
systemctl enable my-service

# show installed
systemctl list-timers

# run after changes
systemctl daemon-reload

# show log
journalctl -xe -u my-service
https://f5n.org/til/systemd/systemd-timers/
Something like ldd on Windows
Show full content

Windows does not have ldd it seems, but if you have Visual Studio installed, (in my case 2022) then you can do:

dumpbin /dependents filename.dll/exe

And of course it's not on the PATH, but it works inside VS' terminal.

The macOS version I regularly forget is:

otool -L /path/to/binary

Maybe now.

https://f5n.org/til/windows/ldd/
Making Discord less terrible
Show full content

Discord has terrible defaults and apparently you need to set them again every time you install it.

Windows Settings:
[ ] Open Discord on Startup
[ ] Close Button Minimized to Tray
Data & Privacy:
[ ] Use data to improve Discord
[ ] Use my Discord activity to personalize Sponsored Content
Notifications: Sounds:
[x] Disable All Notification Sounds
Streamer Mode:
[ ] Enable Streamer Mode
[ ] Automatically Enable/Disable
Game Overlay:
[ ] Currently Playing
[ ] Enable Overlay
[ ] Enable Legacy Overlay
Voice & Video:
[x] Push to Talk

and then actually set a key.

https://f5n.org/til/discord/making-discord-less-terrible/
Shell scripts
Show full content

I've long been unhappy with shell scripts for anything that's more than 20 lines of glue code and so I've been looking for replacements for quite a while.

The problem is usually that you need to fiddle with various versions of exec or popen or whatever the language calls their wrapper around the underlying C functions (or POSIX functionality, whatever). The task is usually to execute a command, very often piping it into another one, then using the output.

Janet

Last year I found something neat. It's the sh package for Janet (repo).

Small aside: At my current job we're doing something I really like - every so often there's a housekeeping day where the whole team works on a list of all our repos, sorted chronologically by which project has not had such a so-called "Patch Day" for the longest. This is usually between 2 and 4 months, and is completely separate from the vulnerability checks and renovate updates.

I love this concept and I wish I'd had that at previous companies, no project ever really goes stale like this because someone always has looked at it in the last months, even if it's been running without intervention or adding new features.

Anyway, we have a checklist of tasks I felt could be automated, or at least be made easier, as I was doing them anyway. This is not the full list, but I think it represents exactly that type of small helper script. It's simple enough it could have been a shell script, but if I needed more stuff, I could have added it, in a proper programming language.

Comments inline with #

#!/usr/bin/env janet

# boring header, including the sh package
(use sh)

# One task is cleaning up old branches, so list them
($ echo "# Local branches")
($ git br)
($ echo "# Remote branches")
($ git br -r)

# Let's check that our Renovate setup is doing what it should
($ echo "# Last renovate commits")
($ git log --oneline --grep Renovate -n 3 --pretty=fuller)


# We're not big on using many fancy containers, but corretto and nodejs
# sometimes do need to be bumped to a new major version
($ echo "# Build images: corretto nodejs")
(run git grep corretto)
(run git grep "nodejs: ")


($ echo "# some boring renaming task in a metadata file")
(run rg "a-string-that-should-be-different")

That's it, the special sauce is explained in this post, but the benefit for me is that I don't have to write anything like

["git", "log", "--oneline", ...
Python

Recently I also found a bug in a backup script of mine and annoyed with trying to debug it, I rewrote it in Python, only to discover that the bug had been trying to run docker with --rm -it via cron (force of habit when typing).

So yeah, it was a lot more debuggable, but the real problem was not shell :D

Fortunately that one only runs a few docker commands in order to dump databases that are running in a container.

For completeness, this is how the interesting part looks:

filter_arg = 'name=postgres' if is_postgres() else 'name=mariadb'
av = [docker, 'ps', '-f', filter_arg, '--format', '\{\{.ID\}\}']
cid = subprocess.run(av, stdout=subprocess.PIPE).stdout.decode('utf-8').strip()

(Actually the curly brackets should not be escaped in this snippet, but apparently I found a rare bug in the templating I use on this site...)

This filters by container name and gives me just the ID. And just the if/else for the dbms is already better in Python than Shell.

Lua

And then some time ago I tried to solve the problem on my own but it's also just a terrible hack: harsh

It might be better if I had a proper parser for it, and I'm still not completely sold on the idea, but it's meant as a test bed and proof of concept.

Using it looks like this:

V.tokenFile = "/tmp/token"
local curl = run([[
    echo '{"token":"foo","b":3}'
]])
local jq = curl:pipe([[ jq -r .token ]])
spit(V.tokenFile, jq)
-- $ cat /tmp/token yields "foo"

Which has the benefit of being able to write the shell code verbatim, but you pay by the boilerplate around it.

Maybe I should have a deeper look if the aforemention janet shell library could be ported to Fennel.

Etc

Anyway, I kinda like the janet-sh solution but I am not sold on Janet as a general-purpose programming language (yet) - I don't have any real big problems but when I looked at it (in 2025) it felt like stuff I expect to be there to be missing, and it was simply was not better enough than other Lispy languages I tried. These days I apparently either expect core functionality to just be there or I am enthusiastic enough to contribute.

Random aside: Coincidentally I also had that feeling a bit when trying Gleam, but much less so. For Gleam I found single bugs and rough edges, for Janet it felt like: enough is missing to be annoying, not enough missing to be one of the first people jumping on the train.

So maybe I am still searching for the "perfect" replacement for shell scripts, or maybe I should just give up and write some python. What I learned with my own attempt with harsh, a single:

echo "git --foo --bar --whatever='3'" | sed 's, ,", ",g' >> myscript.py

already fixes most of my problems, because fixing that is 5 seconds, instead of having to type ", " 10 times. Yes, I'm picky sometimes.

And it's not like I rewrite those lines all the time either, and I can usually replace all the calls to sed and awk with Python string manipulation after getting the output of the one original command.

Footnote: Perl

I have nothing against Perl per se (except that I don't know it well and have not had a good experience most of the time), but I don't want to learn it, I can't (and don't want to make sure) it's installed on every box I use, and so I can't judge it. I'm not saying it's bad for the task, but not for me.

https://f5n.org/blog/2026/shell-scripts/
Textadept's Lua integration
Show full content

What happens if you don't read the manual properly?

So I've been using TextAdept as sort of "not as an IDE/Code Editor per se, but a good Text Editor that can also do code" for years (because it's excellent) but I've always been missing VS Code's "Open folder".

So of course I started looking into implementing that but I really couldn't be bothered to dig into the C/C++ code and maybe keep my own fork.

But there's a ~/.textadept/init.lua and I knew could do a few nice things with its Lua API.

So what I ended up having working:

Run fd $(dirname of current buffer) | rofi -dmenu -sort -sorting-method fzf && open that file, but partially in Lua.

But then I discovered "Projects" and also "Quick Open" which kinda does the same as my hacky solution, so I now just have a couple lines of code for a function that does dirname(current buffer's file), provide that as editable text in a popup dialog (so I can go up a folder), and on submit opens the Quick Open (which has fuzzy search) with that dir as an argument.

It looks like this:

-- ~/.textadept/init.lua

local splitter = function(s)
  return s and string.match(s, "(.-)([^\\/]-%.?([^%.\\/]*))$") or "", "", ""
end

local quick_open = function()
 local dir, _, _ = splitter(buffer.filename)
 local txt = ui.dialogs.input{title = 'Quick open dir:', text = dir}
 io.quick_open(txt)
end

keys['ctrl+L'] = quick_open

And then a shell script to wrap my find | rofi | textadept thing for out-of-editor use:

#!/bin/sh
[ "$1" != "" ] && fd $1 | rofi -theme Monokai -dmenu -sort -sorting-method fzf | xargs ta

And 90% of it was in the manual. Doh.

https://f5n.org/til/textadept/textadept-lua/
2025 in review
Show full content

These review posts have proven useful when looking up stuff, so I'll continue this tradition.

 

( 2024 / 2023 / 2022 / 2021 / 2020 / 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft
  • EVE Online
  • Diablo IV
  • Final Fantasy XIV

(no change, really)

Movies I've (re-)watched TV Series I've (re-)watched Podcasts and other media

Not a lot this year.

CDs I bought
  • Battle Beast - Steelbound
Other stuff I bought
  • a new PC
  • a new (used) NUC for dev
  • NO new keyboard
  • a new Fritz!Box as the old one died after around 13 years - 159 EUR
  • bigger handlebar bag (Deuter Mondego) - 46 EUR
  • a bike computer (Garmin Edge 840) - 393 EUR
  • some small SSDs for storage (2x 50 EUR)
  • a new, bigger, thinner, floor protection mat for my office chair which I hate
Concerts

Yay, this category is finally back.

  • Flotsam & Jetsam (+ Lord Volture + Hateful Agony) in August
  • Battle Beast (+ Dominum + Majestica) in December
Social networks
  • Fediverse - it just works
  • Facebook - logged in like three times
Messaging
  • IRC - mostly every day
  • Matrix - several times per week
  • Email - no change, but it's definitely getting less used
  • Slack - old work, new work and one other community
  • Discord - yes, not too happy about it
  • Signal - yes, but not with more people than before
  • WhatsApp - yes, sadly
Trips
  • summer vacation in the Spessart region in July, also bike tour to get there
  • multi-day cycling trip, continuing the route along the D11 (blog post tbd)
  • pre-christmas trip to Erfurt, Bamberg, Fürth
(Online) Services
  • Subscribed to Netflix, Paramount and Amazon Prime
  • some MMO subscriptions
  • VPS: Mostly Hetzner Cloud, 1x Strato, 1x Netcup
  • fraenk for mobile

No changes here except streaming services.

Programming languages, sorted by usage
  • Kotlin - work (current daily driver)
  • TypeScript - work, unfortunately
  • Clojure - some personal projects
  • Python - some small stuff
  • Gleam - started for Advent of Code, I like it, might stick
  • Janet - tried it out for a small project. nice, but does not seem finished
Stuff that kinda worked out
  • cycle more, at least until some health problems in July/August
  • summer vacation was great
  • pen & paper resumed
  • concerts
Stuff I planned to do this year but didn't
  • visiting a bike park
Stuff that would be nice next year
  • keep on cycling a lot, more mountain biking
  • monthly board game night hopefully comes back
  • some concerts
https://f5n.org/blog/2025/2025-in-review/
Python bits
Show full content

I've not properly used Python for a bit, so here are some random notes so I don't have to search through scripts and shell history and docs:

uv

I'm not one of the people who were desperate before and now all problems are solved, but uv does a good job so far.

# just run it, if it has numpy and scipy deps
uv run --with numpy --with scipy example.py
# two methods to run something that installs a binary
uvx black example.py

uv tool install black
black example.py
exec and output

After using exec and subprocess.Popen and friends, this is finally a method to run a command and get the output that I might remember without reading the docs again and again:

import subprocess

# to a variable via stdout
args = ['/bin/ls', '-al']
out = subprocess.run(args, stdout=subprocess.PIPE).stdout.decode('utf-8').strip()

# or to a file
(fd, fname) = tempfile.mkstemp(prefix='foo-')
with os.fdopen(fd, 'w+') as fh:
    rv = subprocess.run(args, stdout=fh)
with open(fname, 'r') as fh:
    out = fh.read()
# fname needs to be cleaned up manually, of course
random stuff

shutil.move() reliably renames/moves files across filesystems.

https://f5n.org/til/python/python-bits/
Package Managers
Show full content

If I look at my environment.zsh (just the part of my zsh config that handles PATH - I see the following customizations, although not all are active on every machine at every time (the curse of shared dotfiles):

  • add rustup's bin/ and source .cargo/env
  • add /usr/local/go/bin
  • add JDK via SDKMAN (partial dogfooding for leiningen-sdkman
  • Homebrew
  • nvm for node.js

And then stuff I don't currently use:

  • add node_modules/bin from nixpkgs
  • add Elixir via kiex and Erlang via kerl

I kinda hate this - and I get that I could maybe, sometimes just grab a version that's packaged via the distro's package manager - but I usually need a specific version (sometimes newer, sometimes LTS) when I am writing code in that particular language.

Of course it would be easy to wish for a generalized package manager, and SDKMAN is just that - but they also don't seem to have everything I need.

And so the path mangling continues. Usually it's not even that bad, except Homebrew, which insists on adding itself to the front of the path, when every other script appends or prepends at exactly that moment in time when you call it, so it's relatively easy to get the order how you want it.

But it's still ridiculous I can't have one bin folder for all of those. Maybe cluttering up /usr/local/bin wasn't so bad after all, I'd probably have had less issues if all those tools and package managers would have symlinked their binaries (even better if configurable) to ~/.local/bin or something like that and then you'd simply include that in your path and be done with it. How likely are naming conflicts with 10 language package managers anyway?

https://f5n.org/blog/2025/package-managers/
Mechanical Keyboards Revisited
Show full content

It's been over 7 years that I last wrote about keyboards.

There have been a few changes, some only recently.

The Logitech G710+ MX Brown is still my daily driver on my main gaming PC. If you mash some buttons very hard, the key caps come off, but I usually don't do that, so it still works. Because I am quite so acquainted with the G buttons on the left and I couldn't find another G710+ I bought a new Alienware Advanced Gaming Keyboard AW568 for 60 EUR on eBay around Christmas 2023, just as a backup. A first quick test did not really work out in being able to use the extra buttons.

Alienware Advanced Gaming Keyboard AW568
Alienware Advanced Gaming Keyboard AW568

The Noppoo Choc Mid 87 MX Black has continued to be my main work keyboard until September 2024, but then I got a Mac and Noppoo keyboards don't really play nice with Macs. It's a bit weird and apparently has to do with their NKRO implementation, there used to be an unofficial OSX driver. I had found this out in 2012 already when I got the Choc Mini.

I've been mostly working from home since March 2020, but I got a Cherry MX Board 3.0 (MX Red) basically for free in summer of 2023, and I have that stashed away at the office since then, in order to have a proper keyboard when I am there.

Cherry MX Board 3.0
Cherry MX Board 3.0

That was also pretty good as a replacement for the Noppoo while I decided how to continue. Originally I wanted something with a custom firmware and was pointed in the direction of either Keychron, Monsgeek, or a Neo80/Evo80. A combination of: Not in stock, too expensive, not the right switches, or ugly then made me go back to some plan a while ago where I wanted to try a Ducky, so I bought one in late October 2024. I had thought about getting the yellow one but in the end I settled for the "Origin Vintage" but I'll see if I will slap some colored keycaps on it, but it was only 100 EUR and not 140 and I wasn't sure if the novelty of the yellow one would wear off. I had used the Noppoo for 11 years after all (but with 3 different keycap sets). The Cherry moved to the office again soon after that.

Ducky Origin Vintage
Ducky Origin Vintage

The last keyboard I hadn't mentioned was the Kickstarter version of the Atreus, which I backed in March 2020 and that was delivered around September. I paid 99 USD. On the one hand I'd been curious about the form factor and on the other hand I'd been working with technomancy (its designer) on Leiningen for a couple of years already, so I knew about his self-built versions and kits, so when there was a non-wood assembled version it was kind of a nobrainer to get one. I've played around with it from time to time but I've not really tried to make the switch full time. I suppose that would be extra hard as I use my qwertz one at night after work. Now that I think about it I am not even sure which switches it has.

Keyboard.io Atreus
Keyboard.io Atreus

I had written a draft of this post about exactly one year ago and in the meantime (July 2025) there was an odd sale of a "Ducky One 2 SF MX Brown RGB LED" for 23 EUR, so of course I could not resist.

Ducky One 2
Ducky One 2

Anyway, so the total tally of mechanical keyboards is now 9. Two in daily use at home, one several times per month in the office. One simply as a backup, one or two sadly in a state of "would use again if I had another linux laptop for work", one because of the price, and two I purely for fun. Not a terrible mix, but I guess I should stop again for a while. 2012, 2013, 2017, 2018, 2020, 2023, 2023, 2024, 2025. Four in 7 years, then five in another 7 years, so I guess I can't have more than 6 more by 2033?

https://f5n.org/blog/2025/mechanical-keyboards-revisited/
go.mod - go version
Show full content

The go version in go.mod, i.e. go 1.17 does NOT work like in Rust or Java - it's not "using the installed compiler to produce something somehow backwards compatible".

I found this out by seemingly rebuilding an old project with an old directive with a new installed go binary.

Turns out it will apparently download that old compiler and compile it like it is written there - including all old security vulnerabilities.

So I guess updating that go 1.x line from time to time makes a lot of sense.

https://f5n.org/til/go/go-mod-go-version/
A New Dev Environment
Show full content

A while ago I noticed that I had not been happy with my "development environment" at home. This mostly means that when I am on my main machine it's usually booted into Windows because of some games and I hate developing stuff on Windows and I don't like WSL either.

So I was looking to buy some Thin Client (Fujitsu Esprimo or similar) and put Linux on it and then have something to remote into. But I couldn't decide what exactly to get, then I accidentally bought a wrong thing on eBay (mostly because the picture was a little dark and it was nearly the correct model number), but fortunately could cancel (or I'd have a proper desktop PC, nearly as big as a midi tower).

In the end I had been annoying the crowd on our Matrix channel enough with my indecisiveness that someone remembered they had an old unused NUC I could just come and grab, so I did exactly that.

So here's brick:

  • Intel NUC DC3217IYE
  • i3-3217U (Q4 2012)
  • 16 GB RAM I stole out of my x230 for now
  • 30 GB Kingston mSATA SSD (probably need to order a newer, bigger one)

And it's been chugging along nicely for a couple of days now.

I put Arch on it and after some fiddling I ended up with xrdp + xfce4.

This means I can have a full screen session on one of the 27" monitors, and still minimize it, and leave stuff running. And connect from several other machines (tried Windows 11 and OS X, have yet to try Linux) - and all of that without noticeable lag.

These are things I tried first:

  • RustDesk - laggy as hell, locally on wifi and plugged in
  • wayvnc didn't work at all, verbose also said nothing, or it crashed
  • TigerVNC and X11 - fiddling with :0 and :1, not great
  • i3 - no matter what I tried I couldn't get Alt or Super as mod key working

With this "meh, I don't want to work on a laptop" out of the way I've been busy with a couple projects now.

  • Rust
    • cerith (irc bot) - updated, tested, moved to Codeberg
    • nextgen (static site generator used for this) - updated, tested, moved to Codeberg
  • Clojure
    • multiplex (tumblelog I use for music) - updated, tested, moved to Codeberg
    • battlenet (lib for reading Blizzard APIs) - updated, tested, some feature in progress
  • Go
    • feedfoo (blog post to fediverse announcer) - updated, tested, moved to Codeberg
    • cssmin-go (css minimizer) - tested, moved to Codeberg
    • Jerssey - Backend (podcast tracker) - nearly finished the go rewrite, planning to publish
  • C++
    • Jerssey - Client (podcast tracker) - still builds with Qt6 (on Linux) but need to try to build on Windows

Nothing terribly big, but I'm happy it got done. Copied (not moved yet) a good chunk of "usable" projects over from Github to Codeberg, some dependency updates, some small bug fixes, nearly finished one rewrite.

Also the cleanup of old Github projects continues, still a lot to do.

https://f5n.org/blog/2025/new-dev-environment/
Finder can be a VNC client
Show full content

You can open a VNC connection in the Finder by pressing cmd-k and then connecting to vnc://HOST:PORT. Neat.

https://f5n.org/til/mac/finder-vnc/
A Podcast Tracker
Show full content

Usually I post all my code experiments and tools publicly (usually on Github, but that may change) but for some reason I never published this, but after a couple changes I might.

I don't always listen to a lot of podcasts, but for some stretches of time in the last couple years I listened to a few, and unlike most people (or so I heard) I usually did that on my Windows PC, while doing other things, and not on a mobile phone, so all the "common" podcast player apps were out.

The mp3s are downloaded or streamed (no huge preference) in foobar2000, but keeping track of where I was (episode-wise, not in the episode) proved difficult.

For a couple years I had used Juice

  • but it was last updated in 2006 and at some point it could not connect to modern TLS hosts anymore. I quickly looked into just patching it, but that proved difficult. It's a python app, and then an ancient SSL version and... well, in the end I decided on rewriting it.

So I ended up with a GUI app in C++/Qt and a backend (I have a PHP version and a Golang version).

It looks like this:

Jerssey the GUI Podcast tracker

It has its flaws (like being single-threaded and stalling while it downloads something) but it was purely an MVP that got a few more features.

It really only tracks a list of podcasts, then a list of episodes per podcast, gives me a download link, a link to the episode post, some timestamps, and I can set a status to New/In Progress/Done. That's it. Having it local only would have been fine, but of course I had to add an API.

Jerssey the Web interface

I've not used it in a couple months, but it's there when I go back to listening to podcasts. And it also tells me where to continue if I want to.

When I use it again I will probably also fix the two things that I am not happy with: Finish the Golang rewrite so I have one less PHP app to update, and move to SQLite for easier backups (it's using Postgres right now).

But now I have access to a Mac I kinda also want to get it to build there.

Not that I see myself working on it in the immediate future, but it's a rare case of building something just for myself I'd been using daily for a while.

https://f5n.org/blog/2025/a-podcast-tracker/
Hardware Upgrade 2025
Show full content

While I didn't really plan to (or need to) replace my 2019 Ryzen we had a gaming laptop act up (again, actually), and so I decided it would be good to have a 2nd current-generation gaming PC again, so I bought one. Mostly because of "it has worked for years without problems", I gave up mine and ordered some parts to build a new one for myself. But of course that's not the only reason - I was also eager to get some new hardware and run Linux on it.

Ignoring the graphics card, the other one was 5 years and 3 months old, and not ignoring it 4 years and 2 months old. So not really a short time, but I still hadn't replaced it because of its age. For comparison the last upgrade cycle was 7.5 years (ignoring in-between upgrades)

  • AMD Ryzen 7 9700X 8x 3.80 GHz Socket AM5 WOF, 340 EUR
  • MSI MAG Tomahawk WIFI AMD X870 So.AM5, 315 EUR
  • Noctua NH-D15S CPU Cooler, 109 EUR
  • 2x32GB Crucial Pro DDR5-5600 DIMM, 155 EUR
  • 850W Seasonic Focus GX-850 Modular PSU, 155 EUR
  • 2 TB WD Black SN850X M.2 2280 PCIe 4.0 x4 3D-NAND TLC, 147 EUR
  • Fractal Design Torrent Compact, white, 136 EUR
  • Sapphire Pure AMD Radeon RX 9070 XT 16GB GDDR6, 2x HDMI, 2x DP, 799 EUR

At 2156 EUR it was more expensive than I had hoped, but as the last one was cheaper than I had expected I'm not complaining.

Hardware I didn't replace:

  • Logitech G710+ MX Brown
  • Dell U2715H 27"
  • some SSD I'd need to look up, the rest stayed in the old Ryzen rig
  • HyperX Cloud Alpha Gaming Headset

Hardware I had replaced since 2019:

  • Dell S2721DGF 27" (main screen) instead of the Samsung 27"
  • Dell whatever 24" instead of the Samsung 24"
  • Roccat Kone Aimo instead of the Kone EMP

So now that's 2 Ryzen 7 (one AM4, one AM5) and I'm getting rid of an i5-4460 from 2014, because it doesn't make sense to replace my home server's i5-3570K, but I'm stealing the 8GB of RAM which should fit. This will also retire the last spinning disk in regular use.

The one thing I'm a bit sad about is that I will get rid of the case the i5 is sitting in, I bought it in May 1998 for the first computer I would build for myself, a Pentium II-350 MHz. It's been spraypainted metallic blue (a Ford color) from a can that was left over from fixing the paint job on my first car, and has been in more or less continuous use for the last 27 years. Hooray for standards (ATX).

As an aside, before the 9070 XT arrived I tried the RX470 from 2016 in this new machine and I was surprised how well it held up.

https://f5n.org/blog/2025/hardware-upgrade-2025/
Unplugging
Show full content

There's been a German blog post going round the last few days, in the general tone of self-hosting and choosing European-hosted alternatives, or just more community-focused and decentralized than walled gardens, with a focus on US megacorps.

I found it quite interesting and of course I went along with the list and what I use:

  1. "change your e-mail provider" - been self-hosting mail for decades, but still have a GMail address (for Android) and as a last resort (e.g. mailing my boarding passes there in case of catastrophic failures of my mail server while I am at the airport or away - I could only solve the latter with a freemailer or bugging a friend).

  2. "use a privacy friendly search engine" - I am mostly on DuckDuckGo but I regularly fall back to Google because I am impatient when the results are bad.

  3. "messengers without big brother" - Guess I fail here. I use Signal and Matrix and IRC, but I also use WhatsApp and Discord because that's where people I want to talk to are. Would gladly scrap both.

  4. "the networking effect" - now this is mostly wishful thinking, I've spent enough time trying to convert people, it doesn't work for me.

  5. "open source voice assistant" - Pass, switched off on my Android voice thing, never used anything else either.

  6. "Fediverse/Mastodon" - Using that daily, have deleted Instagram and Twitter accounts, kept Facebook because I'm only logging in once a year anyway and got tons of old contacts there, it's a "just in case" thing.

  7. "your own cloud" - I should probably migrate my calender from Google, but I don't need any other features here, I use Syncthing for some files.

  8. "calendar and addresses" - yeah, I was too quick with the last one. I have (hopefully unsynced) phone numbers in my Android phone, zero addresses there.

  9. "routing/maps" - Maybe I should get in the habit of using OSM more, but last time I tried it it wasn't great. Still using Google Maps often.

  10. "LibreOffice and co" - I've not used MS Office at home for probably 15 years, I do have "unimportant" stuff in Google Docs.

  11. "PeerTube" - Yeah well, if I was publishing videos, maybe - but I don't see how it makes sense if you're watching stuff on YouTube that is... on YouTube.

  12. "privacy friendly video calls" - Not sure when I last had a private video call, maybe twice in 2020/2021 - not going to speak up at work here, as I don't really care for work stuff.

  13. "buy locally" - Guess this is where I am unabashedly an apologist, but I've always hated shopping (with a couple exceptions), so while I am trying to use "local" online shops, unless it's clothing I am just so done with local shops. I live in Munich and would expect them to have stuff available, but everything I usually want needs to be ordered anyway, so I am saving myself the hassle and just order it directly. And the customer experience at Amazon is actually good 95% of the time, unlike with the typical German shop, online or offline.

  14. "privacy friendly browser" - I guess this is the shit storm du jour with the latest Firefox news, but I've not been using Chrome for many years and sticking with Firefox for now, but I also use LibreWolf and Vivaldi.

  15. "Android Custom ROM" - I might be wrong but this is just ridiculous. While I would very much like to have an open source OS there, the main killer criterion is banking apps that detect root and other stuff I don't want to, but need to use. I am not a smartphone person, I might play a game while waiting for the bus and talk to people, but I need the 2FA apps for my bank.

  16. "avoid app tracking" - I think this is just needlessly making your life complicated - I know I am being tracked, I have given up. Play Store it is because I don't think F-Droid on stock Android helps much here.

  17. "tech oligarchy bad, democracy good" - yes, I agree, I'm not sure I want to spend my free time endlessly researching which companies I should avoid, it's probably too many of them. But if I do know about a connection to certain people I will try to avoid them anyway.

  18. "use linux" - Yes, I've been doing that for many years and I wish it was a useful nudge people but it's usually not. I know tons of people that basically use their computer because of 1 or several applications that exist on Windows while having zero knowledge about tech. Everyone telling these people to use linux should also provide free support. I'm actually just waiting for my new graphics card to arrive then I will try to switch my main computer to linux, it's been on windows ever since because of games.

  19. "video editing on linux" - Kdenlive is good even on windows, but I've used it like twice in my life.

  20. "consuming news" - Kinda disagree with the premise that getting news from social media is bad. Well yes, of course now X is bad, but I get enough news from the fediverse, just as it worked on Twitter before, if you choose your bubble. Also yes, RSS is good and I use it a lot.

  21. "avoid paypal" - Another one that's really hard. I don't think there's a good alternative except using your credit card directly, but that's still a lot more friction. The realtime transfers are a pipe dream, I think I see this at a small minority of shops. Also EU only and I pay for digital goods as well. I wish there was something, but PayPal is one of the top 5 online things making my life more enjoyable - easy payments.

  22. "ad blockers" - a no brainer, really

  23. "streaming music" - I have a Spotify account that I fire up a couple of times per year to listen to an album before buying it. Maybe not perfect, but I can totally accept that.

  24. "open source AI" - just getting started/not using it anyway

  25. "home assistant and co" - I don't do IoT and smarthome, I have 2 shellys to measure power consumption from time to time.

  26. "vpn providers" - First thing I don't really have an opinion on, I've never paid for a VPN, I used to self-host, currently doing a couple things with Tailscale.

  27. "tesla" - Does not apply, would never have bought one anyway, even if I was a person to buy an expensive new car, or use an electric one, or need one at all.

  28. "catch all email and throwaway mobile number" - E-Mail is a given but I've never found a sim/setup for a price I liked so far. I try to just not give my mobile number to services, but if I have to...

  29. "step up" - Another one where past me was more enthusiastic than current me.

  30. "touch grass" - Now this is just bullshit, I'm online as much as needed and staying offline helps no one. Of course you're not being track offline but it's just not a real argument.

So, how are the results and where do I stand?

I have a feeling that I've already done most of the things that are either important to me or not impossibly hard to do.

  • emails and messengers
  • social media
  • browsers
  • whatever software that can be self-hosted without going bankrupt

I also seem to have lost the will to do the right thing at any cost for my personal happiness, you might call it laziness:

  • google calendar (but I actually might)
  • using google maps (guess I should try though)
  • google docs

Then there are the things where I personally judge my usage patterns to be "non-compliant" enough to occasionally benefit and not do the right thing and stop using them altoghether:

  • facebook account, hardly used
  • spotify acccount, hardly used

The things where I don't see a realistic alternative:

  • using whatsapp
  • using youtube

And finally there are a few things where I just don't want to spend the money and or mental effort to fix it, or I don't see it as realistic for myself:

  • paying for a second SIM and
  • keeping a 2nd phone functional/updated, one for banking and one for everything else incl f-droid
  • not using amazon
  • not using paypal

Also interestingly I have zero problems buying books somewhere else than Amazon, it's mostly specific household items and electronics where I would have to find a physical shop (often impossible in a reasonable time) or spend 5-10 bucks more in a random shop for postage, or worse price.

While I disagree with some of the 30 things on the list, I'd say I mostly agree

  • at least in spirit. I'm happy to help people transition away from some of those but I'm over zealous evangelizing.

Anyway, I think it's mostly a good list to think about and analyze your behaviour, if it's not something that's on your mind all the time.

https://f5n.org/blog/2025/unplugging/
2024 in review
Show full content

These review posts have proven useful when looking up stuff, so I'll continue this tradition.

 

( 2023 / 2022 / 2021 / 2020 / 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft - The War Within
  • EVE Online
  • Diablo IV
  • Final Fantasy XIV - Dawntrail
Movies I've (re-)watched TV Series I've (re-)watched Podcasts and other media

Again, mostly YouTube.

CDs I bought
  • KMFDM - Hyena
  • HANS LAZER ALIEN SLAM - ACTION METAL
Other stuff I bought
  • a new bike: KTM X-Strada LFC 2022 in June, 1560 EUR incl pedals
  • a smart/fitness watch: Suunto 5 Peak in April, 190 EUR
  • a gamepad - EasySMX PS3 GamePad (USB) in March, 15 EUR
  • a new mouse: Roccat Kone Aimo Remastered in April, 42 EUR
  • a new mousepad. Worth mentioning because my old one had Doom3 on it (2004), 10 EUR
  • a tiny wireless mouse for my office backpack in October - Logitech M185, 10 EUR
  • two small USB-C docks, one for my home desk and one for travel: 12 + 20 EUR
  • M.2 USB-C enclosure + 1 TB M.2 WDBlack SN770 because it was cheaper than an external disk, 70 EUR
  • an AeroPress with a metal filter in November: 31+17 EUR
  • several bike bags and accessories, separate post to follow
  • not technically mine, but we got a new car after 12 years
Social networks
  • Fediverse - this is my main platform now
  • Facebook - logged in like three times
Messaging
  • IRC - mostly every day
  • Matrix - several times per week
  • Email - no change, but it's definitely getting less used
  • Slack - old work, new work and 2 other communities
  • Discord - yes
  • Signal - yes
  • WhatsApp - yes
Trips
  • summer vacation in Hungary in July
  • a stop in Bratislava on the way back
  • three day cycling trip, continuing the route
(Online) Services
  • Subscribed to Netflix, Disney+ and Amazon Prime
  • some MMO subscriptions
  • VPS: Mostly Hetzner Cloud, 1x Strato, 1x Netcup
  • fraenk for mobile

Started consolidating a few things with hosting.

Programming languages, sorted by usage
  • Java - work (no more as of winter 2024/2025)
  • Kotlin - work (current daily driver)
  • TypeScript - work, at least it's better than JS
  • Clojure - some personal projects

Spent quite a bit of time on personal projects this year, and I'm also back for Advent of Code.

Stuff that kinda worked out
  • cycle more
  • summer vacation was great
Stuff I planned to do this year but didn't
  • visiting a bike park
  • pen & paper stopped again for the second half of the year
  • concerts (except free & easy)
Stuff that would be nice next year
  • keep on cycling a lot, but do more mountain biking
  • monthly board game night is at least planned already
https://f5n.org/blog/2024/2024-in-review/
KotlinNative
Show full content

While learning Kotlin I had brief look at KotlinNative.

The main downsides I see (currently) are:

  • no access to the Java ecosystem of libraries, not even basic ones like java.util.File
  • no static binaries

For even the most basic file access it seems you need a library like Square's okio.

implementation("com.squareup.okio:okio:3.9.1")
``

I tried to build a minimally viable `cat` binary and it looks like this:

```kotlin

import okio.*
import okio.Path.Companion.toPath

fun readLines(path: Path, numberAllOpt: Boolean, numberNonBlankOpt: Boolean) {
    var i = 1
    FileSystem.SYSTEM.source(path).use { fileSource ->
        fileSource.buffer().use { bufferedFileSource ->
            while (true) {
                val line = bufferedFileSource.readUtf8Line() ?: break
                when (line.trim()) {
                    "" -> {
                        if (numberAllOpt) {
                            val ii = i.toString().padStart(6, ' ')
                            println("$ii  $line")
                            ++i
                        } else {
                            println(line)
                        }
                    }
                    else -> {
                        if (numberAllOpt || numberNonBlankOpt) {
                            val ii = i.toString().padStart(6, ' ')
                            println("$ii  $line")
                        } else {
                            println(line)
                        }
                        ++i
                    }
                }
            }
        }
    }
}

fun main(args: Array<String>) {
    if (args.isEmpty()) {
        return
    }
    val numberAllOpt = args[0] == "-n"
    val numberNonBlankOpt = args[0] == "-b"
    val file = if (numberAllOpt || numberNonBlankOpt) args[1] else args[0]
    val abs = ".".toPath().resolve(file)
    readLines(abs, numberAllOpt = numberAllOpt, numberNonBlankOpt = numberNonBlankOpt)

So basic Kotlin, but all the heavy lifting done by okio.

Links: Okio - Kotlin Multiplatform

https://f5n.org/til/kotlin/kotlin-native/
git-config: includeIf
Show full content

I have been using includeIf in my .gitconfig for years, usually to separate out my personal git config on my work machine. Typically the only directory I have checked out that I am regularly committing to is my dotfiles repo, but it can happen.

So anyway, usually it looks something like this:

# wrong!

[include]
	path = ~/.gitconfig-default
[includeIf "gitdir:~/code/winks"]
	path = ~/.gitconfig-personal
[includeIf "gitdir:~/code/dotfiles"]
	path = ~/.gitconfig-personal

so it would use company@example.org by default, but use personal@example.org in those 2 folders.

Apparently at some point I checked in a wrong version to my dotfiles and because I'm not usually running that on my own machines I missed the error.

This is how it actually works:

# correct

[include]
	path = ~/.gitconfig-default
[includeIf "gitdir:~/code/winks/"]
	path = ~/.gitconfig-personal
[includeIf "gitdir:~/code/dotfiles/.git"]
	path = ~/.gitconfig-personal

Yes, the trailing slash in line 5 is important. Doh.

You can also leave off the .git, but maybe that makes it clearer that this is a single repo, while the first example matches every subdir as well.

Source: man page

Addendum: Apparently you can also solve the "different keys for the same host, e.g. github.com" problem with includes: configure-ssh-keys-for-multiple-github-accounts

https://f5n.org/til/git/git-config-includeif/
A Few Changes
Show full content

As I started a new job in October I'm anticipating to learn a lot of things in a short timespan in the coming weeks, and because in the past I was bad about writing stuff down I've resolved to do better and write stuff down. Or not let what I wrote down rot in a couple of files called ~/Documents/notes.md that wer kept for a year or longer at at time. Maybe I can even extract some knowledge from some of these old ones...

So there's a new category on this site: TIL with small snippets of knowledge, in the hopes that cleaning up my notes for publishing will be enough of a repetition to help memorize it.

The name was inspired by Simon Willison: TIL when I saw a post on Lobsters recently and remembered I'd seen the site before. So I guess the concept is not new or unique, in my old blog I posted small bits of knowledge interspersed with normal blog posts and long articles all the time, but for some reason over 10 years ago I stopped.

Fun side story: I wasn't 100% sure if my own static stite generator would be able to handle this new category with all its differences or if I had hardcoded too much. It seemed to work, I was just missing support for tags, but even for that I found a branch from September 2023 which mostly did what it should already.

The second thing is that I tweaked the CSS a bit. Ran the W3C validator, removed the moz-box-shadow et al that have probably been in there for 10 years, and cleaned up the header section. Time will tell if I like it enough to keep it. Also the breadcrumbs are gone for now.

https://f5n.org/blog/2024/a-few-changes/
Connecting Quassel to ZNC
Show full content

Less of a TIL than a "I have to look this up every couple of years".

When you connect a Quassel Core to ZNC:

  • File -> Networks -> Configure Networks...
  • Manually specify...
    • Network name: whatever
    • Server address: localhost or your ZNC server
    • Port: 2000 or what you have
    • Server password: username/network:password

Weechat for example has a dedicated password field, but here you simply have to make do with this.

https://f5n.org/til/quassel/znc/
Intro to Hammerspoon
Show full content

The feature I was missing most on the mac was window management like I knew it from i3. I'm not yet sure if I could exactly replicate that (i.e. Win+1-9 for different workspaces, shared over all screens) but I'll try something else now.

Assigning the main apps I had on those workspaces to keys and just focusing/launching them, via cmd-shift-[`1-9] with Hammerspoon.

This is my very minimal config at the moment (~/.hammerspoon/init.lua):

mod = {"cmd", "shift"}

myShortcuts = {
    {"1", "Terminal"},
    {"2", "IntelliJ IDEA"},
    {"3", "Firefox"},
    {"4", "Slack"},
    {"5", "Microsoft Outlook"},

    {"7", "Safari"},
    {"8", "Cog"},
    {"9", "Google Chrome"},

    {"`",  "Google Chrome"},
}

for i,shortcut in ipairs(myShortcuts) do
    hs.hotkey.bind(mod, shortcut[1], function()
        hs.application.launchOrFocus(shortcut[2])
    end)
end

function RunWithArgs(executable, args)
    local t = hs.task.new(executable, 
    nil,
    function() return false end,
    args)
    t:start()
end

-- this opens the hammerspoon config in TextEdit
hs.hotkey.bind(mod, "F12", function()
    RunWithArgs("/usr/bin/open", {"-a", "TextEdit", "init.lua"})
end)

Unlike with the AppWindowSwitcher Spoon this works with apps on different Spaces. Very much inspired by this post.

I'm also using Rectangle right now but maybe I can replace everything I need with some Hammerspoon stuff.

https://f5n.org/til/hammerspoon/intro/
Self-Hosting Update
Show full content

I wrote about self-hosting stuff in 2022, since then I've made a few changes:

  • server 1 - a blog
    • Debian 12 with podman (not happy with the rootless setup)
    • Caddy, Tailscale, grafana-agen on the host
    • MySQL in a container
    • PHP + Wordpress in a container
  • server 2 - irc, websites
    • Ubuntu 22.04 + Docker
    • some containers:
      • Caddy for a few static sites
      • quassel-core for IRC
  • server 3 - mail
    • Debian 12 + Docker
    • mailcow
  • server 4 - web & misc
    • Ubuntu + Docker
    • some containers:
      • freshrss (migrated from TT-RSS)
      • dokuwiki
      • linkding (trialing a move from pinboard.in)
      • ktistec (single user fediverse instance)
    • file hosting
    • several tools
    • several websites
  • server 5
    • Debian 12
    • pulling backups from all other server
    • syncthing

So I guess there are a couple of servers that are important - that would be mail & web - then some that are used a lot but not important: irc, and one that is just for backups and not really actively accessed. And the first one is important enough to be on backup, but if something happens I'll just redo it.

The irc server is also the playground if I want to spin up something in a container, so maybe kind of a staging server.

So I suppose I'd still be very much happy with a setup where I can just push a container, assign a hostname and boom, no more server troubles. The problem with that is that it doesn't really work if you have 20 small containers without a lot of load, kinda expensive everywhere - or at least more expensive than slapping a couple of them on a 5 EUR Hetzner VPS, which is what I am mostly doing here.

Still missing one big machine, but everytime I need to reboot it, or something is up, then all services would be down, this kinda lowers the blast radius for my non-critical stuff.

Doesn't mean I am happy - I suppose if I wanted to spend more money I'd get 2 bare metal servers for 40-50 EUR and host everything on one, and have the backups on the other one with some kind of manual failover setup so with just a couple DNS entries I could host everything over there. But that's twice the price and I don't want to pay that.

Also this had been sitting in the drafts folder since August 2023 and I kinda had to rewrite half of the list above, because I only went back to Debian since then, so 3 of the 5 VPS aren't older than about a year.

Also for how they are setup, I have a bootstrap role in Ansible that is the same for every server I have (switch off passwords, add some users, install some common packages, etc.pp) and since then I've went back on the whole "role" thing with DRY as it doesn't make sense for my tiny setup, only the bootstrap role is common, every host has it's own role named after itself, and I am not ashamed to freely copy and paste stuff, because if there's some overlap it's probably tiny.

https://f5n.org/blog/2024/self-hosting-update/
Delegates and observable properties
Show full content
// User.kt
import kotlin.properties.Delegates

class User {
    var name: String by Delegates.observable("<no name>") {
        prop, old, new ->
        println("$old -> $new")
    }
}

fun main() {
    val user = User()
    user.name = "first"
    user.name = "second"
}

// # output:
// <no name> -> first
// first -> second

Docs: Observable properties

Source: 7 Features in Kotlin's Standard Library that You Might Have Overlooked

https://f5n.org/til/kotlin/delegate/
Terminal.app includes a pager
Show full content

Cmd-UpArrow in Terminal.app lets you jump to the last time you pressed enter.

Maybe there's a better official definition but it inserts a grey [ in front of your prompt and that's the mark where you can jump back to.

[user@host $ seq 1 100 # START
1
2
3
...
98
99
100
user@host $  # press cmd-UpArrow here to jump to START
  • cmd-k will delete screen + scrollback
  • cmd-l will delete screen and not the scrollback
  • there's a "Hard Reset" in the (searchable) help menu

Source: IRC, thanks jelly

https://f5n.org/til/mac/terminal-pager/
Cycling on the D11, part 2
Show full content

Last year I started my first long bicycle tour, along the D11 (Ostsee-Oberbayern-Radweg) across Germany. I made it about a quarter in, 500km. This year I wanted to continue for another 5-6 days but life got in the way, and so I could only do 3 days and 300km, still great fun.

D11 way markers

Planning

As I already had some experience, it was just finding good stops along the route this time.

The plan was:

  • Hilpoltstein (where I left the route last year) to Bamberg, 109km
  • Bamberg to Himmelkron (near Bayreuth), 103km
  • Himmelkron to Hof, 62km

Again I used this page for the route, but didn't keep to their daily routes, but assembled my own daily track with the help of gpxbox.com and gpx.studio. So my day 1 is their day 17 plus 25km, my day 2 is the rest of their day 16 plus their day 15 (minus 5km), and my day 3 is 2/3 of their day 14. Why? Mostly because theirs are too short, and my hotel on day 2 was 60% of the price of their proposed town, 5km further. Also there's a good train connection from Hof back to Munich, didn't see where the next good one crosses this route.

The 2024 Route

Preparations

As I've still not managed to get a replacement wheel for last year's used gravel bike after it broke, I'm taking the gravel bike I bought in early June, my KTM X-Strada. The bag setup is similar, but a little different. Different pannier, different handlebar bag, and a half-size frame bag. Other than that I booked my two hotel stays about two days before I started, and researched what trains to take and bought a couple snacks.

Day 0

Deutsche Bahn letting me down? What a surprise! The train I wanted to take (from Munich to Allersberg at 7:05) the next day was canceled, as was the 9:05 one. Yes, Allersberg is not Roth, but it's only 10km away, to the north east, so I was gonna go along Rothsee and do the same amount of kilometers, I'm not that anal about the exact route. Anyway, so I had to take the train to Roth at 8:05, which is 11km off to the north west, so I might have skipped 5km here.

My KTM X-Strada

Day 1 - Roth - Bamberg

Getting up at 6:45, packing up the last things and arriving at Munich main station around 7:30, buying a ticket for myself and the bike, grabbing breakfast and waiting, getting to Roth at 9:45ish. Unfortunately it was raining for the first 2h, otherwise a nice start along the Main-Donau-Kanal into Nuremberg.

I was amazed how you can avoid most traffic lights by going over and under bridges near the city center. Was a bit cold, so I went for a bite but made the bad call to go into a small coffee joint (with rave reviews on Google Maps) which served luke warm espresso, luke warm coke (from a fridge tho...) and some ok cheesecake. Should have gone to the Korean place next door but I wasn't really hungry. Live and learn.

Next on to Fürth, directly adjacent, no rain anymore.

Fürth

After that the route took me past Erlangen but I decided I wanted to see the city after all and made about a 4km detour into the city center and looked around for a bit then grabbed a beer at Kitzmann Bräuschenke. I suppose the Kitzmann brewery should thank JBO for the free advertisement when people still remember after over 20 years ;) Next stop was Forchheim where I did a quick tour around the city center and was looking for another beer garden as I had only around 30km to go and it was quite early.

Didn't see anything open or looking good until I rode past the RadOase, a small kiosk. Turned around, sat down, chatted with the locals and sampled more than one beer, then even had company while riding along to Bamberg. The only downside was that it was getting dark already now and I just went to the hotel (Hotel National, nothing special but absolutely nothing to complain for 60 EUR), took a shower, and looked for dinner.

Went to Bella Tandoori Express which despite the name is a freshly opened perfectly normal sit-down Indian restaurant and I had delicious Pakoras and Chicken Vindaloo for a fair price. Would recommend. After that I walked to the closest gas station for an evening snack because I had no sweets left.

Daily kilometers: 127

Total kilometers: 127

Fedi picture thread

Bamberg

Day 2 - Bamberg - Himmelkron

Quick visit to a supermarket for breakfast, packing up things and got a bit of a late start at 9:00, again did a quick tour of the city center (and was happy there were less people than on Sunday evening for the "Sandkerwa").

The next part of the tour was not very exciting from a sightseeing point of view, Bad Staffelstein seemed nice though and when I rolled into Lichtenfels I took the chance to grab a quick bite at McDonalds because I was mostly after a big coke and not so much after food, then continued along the river Main to Kulmbach. Unfortunately I have to admit Kulmbach was the worst city for cycling of all the cities I'd seen, at least coming from the west and leaving in the east. Sat down for an alcohol free wheat beer and then continued on to Himmelkron.

I really wanted to go to Bayreuth for dinner and to look around but my legs didn't want to do another hilly 30km round trip after 110km that day.

My hotel was a bit weird, in the industry zone of this small town, the reception inside the gas station and the hotel building itself 200m behind the gas station. Anyway, it was clean and spacious and they had free water. Also not too bad for 80 EUR. They even provided free ear plugs because of the road/gas station parking lot close by. Had dinner at "Frankenfarm", a couple hundred meter down the road, got Schäufele and a beer, then headed back quickly.

Daily kilometers: 113

Total kilometers: 240

Fedi picture thread

a river

Day 3 - Himmelkron - Hof

I wanted to start early because I had a train to catch around noon, but after a little change of plans I slept a little longer and I would later get to regret that decision. Didn't really feel too good that morning, my stomach hurt a bit, my jaw was a bit weird (still is, as I write this a day later) and the legs also were a little sore.

First five kilometers to Bad Berneck were not great, stopped at a supermarket for a coffee and some batteries for my Garmin (had used my spares already and no more spares with me). After Bad Berneck the brutal part began, 10km of constant mellow climbing, which worked ok, with a couple quick stops, and then a bigger hill (still <100m of elevation but pretty steep), apparently I am not great at climbing at the moment, glad I didn't try crossing the alps this week...

After that I "just" had to get to the train station in Hof, "only" 40km, but absolutely struggling with every hill, pushing my average speed way down. I was stressing out a little, didn't stop for leisure, just to rest, didn't really care about taking photos, but I at least tried to get the views in, but it wasn't that exciting, I just hope I didn't miss anything great. Anyway, train was supposed to leave at 12:40 and in the end I made it there at 12:15, had time to buy drinks and snacks and then sit down in the train, still shaking.

Got off in Freising, got some ice cream and an espresso, walked around town for a bit, then had dinner at Ariston, delicious Bifteki. Fortunately my Bayernticket was also valid for the S-Bahn so I took the next one to the city and cycled the last 5-6km home, even without my stuff, yay. On the one hand I'm a bit sad the original plan of getting off in Regensburg didn't work out, on the other hand I really needed those 3.5h of rest on the train, I think.

Daily kilometers: 67

Total kilometers: 307

Fedi picture thread

view after the largest climb

Packing list

Not sure I really want to repeat this, it's 90% the same as last year

  • didn't use my buff
  • was so happy about my wind jacket this time
  • Shimano MTB shoes instead of the Five Tens
  • didn't really eat as many bars and sweets this time

Stuff I want to improve:

  • small power bank in the backpack, not the bigger one in the pannier
  • should buy a 2nd bidon again instead of strapping bottles to the frame with a voile strap (it worked though)
  • do not run out of AA batteries
  • probably get a proper modern Garmin bike computer where I can add stuff without a laptop
Expenses
  • Preparation:

  • Hotels:

    • Bamberg: 62 EUR
    • Himmelkron: 80 EUR
  • Trains:

    • 2x 6.50 EUR for the bike
    • 26 EUR for München - Roth
    • 29 EUR for a Bayernticket

Food is again a little hard to pin down because I simply don't care so much, I'm not eating at expensive restaurants if I can avoid it (same as at home) and 5 EUR here or there are not worth keeping track of for me.

  • Munich: 2 EUR
  • Nuremberg: 11 EUR
  • Erlangen: 5 EUR + 3 EUR
  • Forchheim: 12 EUR
  • Bamberg: 27 EUR + 3 EUR + 5 EUR
  • Lichtenfels: 11 EUR
  • Himmelkron: 21 EUR + 5 EUR
  • Hof: 6 EUR

So that's 22 EUR for 2 lunches, 48 EUR for 2 dinners, and 41 EUR for drinks, snacks, beer and I probably missed some stuff but I guess it's not more than 5 EUR for various bars and sweets I brought from home. Let's say 120 for 2.5 days.

I suppose the dinners would be the easiest way to save some money.

So excluding any equipment, that's 120+140+70 = 330 EUR for 3 days.

Small aside, as I talked to someone on the trip, we both agreed that calling it a "credit card tour" just because you sleep in a hotel feels wrong to both of us. Maybe there are some of these mythical cheap camping sites, but we've both not seen them in Germany. You will easily pay 20 EUR as a solo adult with a tent, and up to 30+ isn't too uncommon if you're in the wrong spot. All the while being hard to research and often you can't even reserve. Oh, and power for charging might be extra. So yes, I'm always using the cheapest hotel I can find on booking.com that was a relatively good rating, but so far I've not paid more than 80 per night. Totally worth it, but I suppose now after 5 nights I might have saved up enough to pay for the tent + sleeping bag + cooking system, but not completely sure.

Final thoughts

The first two days were superb, the third would have been better if I didn't have to catch the train. With all the climbing I would have probably made it an 80km day and take my time (if I only need dinner and get to my hotel room, I would have had 8 more hours). Wasn't the worst day on the bike though (but probably the worst 60km of my life :P).

So now I have 900km left to Rostock, then I will have completed the D11 from the Austrian border to the Baltic Sea. At this rate I will manage to finish it in 2026, but with all the big elevation days over, maybe I will make it in 2025.

The 2024 Route elevation

https://f5n.org/blog/2024/d11-part-two/
2023 in review
Show full content

These review posts have proven useful when looking up stuff, so I'll continue this tradition.

 

( 2022 / 2021 / 2020 / 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft
  • EVE Online
  • Diablo IV
Books I've read Movies I've (re-)watched TV Series I've (re-)watched Podcasts and other media CDs I bought
  • The haul from late December 2022 I hinted at last year:
    • Therion - Leviathan II DIGIPAK
    • The Halo Effect - Days Of The Lost
    • Soilwork - Övergivenheten DIGIPAK
    • In Flames - Whoracle
    • In Flames - Used And Abused
    • In Flames - Lunar Strain + Subterranean
    • In Flames - The Jester Race + Black-Ash Inheritance
    • In Flames - The Tokyo Showdown (Live in Japan 2000)
    • Sabaton - The War To End All Wars
    • Hypocrisy - Worship
    • Fear Factory - Recoded
  • Dropkick Murphys - This Machine Still Kills Fascists
  • In Flames - Foregone
  • Electric Callboy - Tekkno

I need to double-check, but I should now own the complete In Flames discography. The Halo Effect is also great.

Other stuff I bought
  • a new (used) bike. ~8 year old ROSE gravel bike for 200 EUR
  • a new mobile phone, Google Pixel 6a for 340 EUR
    • Teufel Airy Sports wireless headphones, 60 EUR
    • a fancy case that still ended up only costing 10 EUR
  • some bags for bikepacking, including an Ortlieb "Seat-Pack", used and in perfect condition
  • a couple straps and replacement pads for two different sets of headphones
  • a dedicated work bag/travel pouch that will always stay in the bag
  • an electric guitar!
    • Squier Stratocaster in black for ~320 EUR
    • Boss Katana Mini ~100 EUR
    • Fender shoulder strap and some misc equip
Social networks
  • Fediverse - this is my main platform now
  • Facebook - logged in like three times
  • Twitter - deleted all remaining accounts
Messaging
  • IRC - mostly every day
  • Matrix - several times per week
  • Email - no change, but I feel it's getting less
  • Slack - work and 2 other communities
  • Signal - yes
  • WhatsApp - yes
Trips
  • other countries: London/UK for a few days in summer
  • five day cycling trip and staying at a rental house after that
  • Austria, but that was not a vacation
(Online) Services
  • Subscribed to Netflix, Disney+ and Amazon Prime
  • some MMO subscriptions
  • No change for VPS: Strato, Hetzner Cloud, Scaleway
  • switched mobile plan to fraenk, now 10 EUR per month

Still thinking about consolidating a few things with hosting, but no concrete plans.

Programming languages, sorted by usage
  • Java - work
  • TypeScript - work, at least it's better than JS
  • Elixir - work
  • Clojure - some personal projects

Not a lot of personal coding this year, also skipped Advent of Code due to lack of time.

Stuff that kinda worked out
  • Eläkeläiset concert in April
  • Free & Easy "festival" in July/August
  • cycle more. I think I broke the 1500km mark on the new bike between June and September
  • redoing the living room and entry hall of the apartment
  • more pen & paper evenings, monthly Shadowrun has resumed

Happy this category is back. Concerts are back on the menu.

Stuff I planned to do this year but didn't
  • no big vacation trip, the London thing was more of saving a thing that had gone wrong
  • visiting a bike park
Stuff that would be nice next year
  • keep on cycling a lot, but do more mountain biking
  • bringing back board game night
https://f5n.org/blog/2023/2023-in-review/
Theme Systems
Show full content
Maybe skip this intro

Back in the day I used to be very much into customizing and theming my Windows installation (probably around the turn of the century), mostly before I started running Linux on half of my machines with graphical interfaces. This has mostly faded, I don't really tweak a lot these days (in any OS), I'm basically fine if I can set a wallpaper I like, even if I don't see it very often. Then I'm not changing it very often either - for work machines it often gets set in week one and then not replaced until I get a new machine years later.

Anyway, there are still some apps where I usually want a theme. At home I'm usually running two instances of Firefox at the same time, Normal and Developer. Not even sure if the dev version comes with this dark theme by default or if I set it, but it's dark blue and for the normal version I've been using this theme for years.

Editors? Some of them. For IDEA at work, it's usually their Darcula theme. For VS Code at home (I'm not a heavy user) I've been using August City Lights for a while.

For Notepad++ it's just the plain white default theme, but for TextAdept I'm using something in light grey.

Quassel has been on my own tweaked version of DarkMonokai for ages.

Theme Systems

As you can see, there's no real uniformity, so why am I talking about "Theme Systems"?

What does that even mean?

You might have heard about:

And maybe also about (thanks #lobsters):

So basically one color scheme, in a theme for an application, and hopefully ready to roll for all the apps you could be using that have theme support.

I really love the idea, even if my stuff is a big random mix. It's this "I know I like Dracula, so if I need a dark theme for application X, I can use it".

Unfortunately there don't seem to be too many of them, or only for some apps.

Also the amount of applications being themed varies greatly, and sometimes it's organized in one org, or as a collab, and sometimes it's just completely unrelated ports. So it's probably worth doing some research for some or all of the above mentioned.

Why now?

Now why did I even start this research out of the blue?

So I have this three screen setup at home, 2 27" (middle and left) and an older 24" in portrait mode on the right, and on that one I use a 50:50 split with IRC in the top half and Thunderbird and Signal in the bottom half.

Unfortunately the viewing angle of the 24" is not great (and maybe becoming worse) and so I noticed I have real problems with a dark theme in IRC on that screen (also I'm apparently getting old) and so I went looking for a nice light theme and thought about Solarized and Dracula and started looking. I switched Quassel to use Solarized Light yesterday but I'm not a huge fan of the yellowish tone, that's why I'd never used Solarized Light before. Also Quassel is of course nowhere near VS Code in user numbers, so I guess I need to make my own theme.

More?

I've not put a huge amount of work into researching this, but if you know of more "Theme Systems" projects, or just some popular themes with several (i.e. maybe more than 3) ports, feel free to hit me up so I can add them.

The concrete problem

So I'm still looking for a nice light Quassel theme and unfortunately the best (or only?) resource for themes is not great.

I've not started writing one, but right now I'm looking at these color schemes:

I've not fully grasped how tinted/base16 works but I'll go dig deeper and see if I can do this for Quassel in a reasonable time.

https://f5n.org/blog/2023/theme-systems/
Mobile Phones
Show full content

As the discussion of mobile phones came up briefly in #lobsters, I thought I might finally write down some thoughts I've had for a while.

Intro

Important things first. I am not a phone person. I like to have a small computer in my pocket when I am not at home or near a desk, but that's about it. My main uses are:

  • listening to music
  • using (Google) Maps (trialing GraphHopper atm)
  • some random web browsing
  • some messaging
  • (not voluntarily) mobile banking and MFA for online banking/payments

And my main decision criteria are:

  • not too expensive
  • high chance of long upgrades
  • not too big

Before getting a new phone this summer I thought about it for a few months, especially if I'd stay with Android or get an iPhone. I've never owned an Apple device before, but I've had a work iPhone for a year now. It usually sits in a drawer but whenever I used it it felt perfectly cromulent.

Spoiler: I stuck to Android.

History

Let's look at a list of all the smartphones I've owned and ignore the dumbphones in the years before that:

  • 2009-12 - HTC Tattoo/Click - 307€
  • 2011-09 - HTC Desire Z - 239€
    • massive upgrade over the Tattoo
  • 2015-09 - Kingzone N5 - 110€
    • display stopped taking touch inputs reliably
  • 2016-07 - LG Nexus 5X - 280€
    • was still perfectly usable until it died with a boot loop error, reflow fix didn't help
  • 2020-02 - Motorola moto X4 - 190€
    • it still works fine, but never received any security upgrades :(
  • 2023-08 - Google Pixel 6a - 340€
    • too new to have a real opinion

So that's my sixth smartphone in just under 14 years, which means the average lifetime of the first five comes to 32.6 months, or 2 years and 8.5 months.

That's a lot better than getting a new one every year, but not the 3+ years I'd hoped.

In total I paid 1126€ for those first five phones (excluding replacement batteries), which comes to about 83€ per year, or about 225€ per lifetime.

I am hopeful that I'll get 4 years of security upgrades out of the Pixel (don't care about feature upgrades), if it doesn't die before that.

2/5 replaced because they were too old/slow, 2/5 replaced because they were broken, 1/5 replaced because of the software.

I do know I could have put a different OS on it and I checked availability when I bought it, but with all the MFA stuff I have on it and the current state of viability of custom ROMs (especially regarding the Play Store) being unclear to me, I didn't take a chance. When I have successfully migrated to the Pixel I will probably try a custom ROM on the moto X4 and keep it as a spare or for mountainbiking or concerts or other activities where I have a bit of anxiety of damaging or losing it.

Do I regret any of the purchases? HTC Tattoo

Android was pretty young and I still wasn't one of the real early adopters. This device wasn't perfect but it was an affordable option and it worked mostly fine. The touch screen was not great (resistive) and pretty small (2.8"). I think it only ever ran Android 1.

specs

HTC Desire Z

This one was awesome, I loved the keyboard. Only problem was that it had gotten slow after 4 years (technically 5 because it was released in 2010). I think it ran Android 2 and then later I had some custom ROM on it.

specs

Kingzone N5

It was cheap, it was a gamble, and it broke after a year. I don't regret it per se, but it would have been smarter to wait a bit with the still functional Desire Z, I guess.

LG Nexus 5X

This was basically the perfect phone except that it died too soon, and with the exact problem that many of them seem to exhibit. Still, 3.5 years.

specs

Motorola moto X4

I have nothing bad to say about this phone's hardware, it's awesome. The problem is that the software (Android 9) wasn't updated after about 2.5y after it's release, and that's when I bought it in the first place. This is about security upgrades, not Android versions. Apparently the deal was too good to be true.

specs

Google Pixel 6a

I've not used it much, I'm in the progress of migrating right now. It feels a little worse than the X4 (it's also a bit taller) but that could fix itself by getting used to it. We'll see. I'm not overly stressed out about different Android versions, my main gripe right now is the "swipe from bottom to show all apps" which somehow seems worse in Android 13 than it was in Android 9.

specs

Bonus history

Here's a less detailed list of my dumb phones because I had it handy.

  • 2000-08 - Nokia 6150 (the red one)
  • 2002-08? - Siemens ME45 (sahara beige)
  • 2006-08? - Nokia 6230 (bluish-black)

I have zero memory how long I kept the Siemens and when I got the second Nokia, but I am moderately sure I did not forget one inbetween, so I must have had that last one until 2009 which makes a purchase around 2006 or 2007 realistic. Also I had those (very typical for Germany) 2 year long contracts for quite a bit, so replacing them in 2002 or 2006 would make sense.

Summary

Not sure what to make of this post, except it was interesting to run a few numbers. I suppose the choice of models at their respective prices is a good indication of how much I value phones. Can't say I'm not glad that I have one with me, but they're tools and not lifestyle products. Unlike with computer hardware (or bike parts?) I am very much not enthusiastic and it just needs to work.

So basically nothing new or insightful for me, but I am even more confused about people dropping 1000€ for a new iPhone every year now, that was a bit of a surprise.

https://f5n.org/blog/2023/mobile-phones/
Bikepacking the D11
Show full content

I'd long planned to do a multi day bikepacking [see footnote at the end] tour and these last few days in my June vacation it finally happened. Planning wasn't so great, but it all worked out in the end.

So the idea was to do the first part of the D-Route 11 in reverse. This is an official long-distance cycling route from the Baltic Sea to Upper Bavaria, but my plan was to start in Freilassing, next to the Austrian border and go as far as I have time.

Planning

One huge problem was that I got some sort of flu three weeks before starting and basically spent two weeks in bed, from a "how am I feeling every day?" point of view it was even worse than when I had Covid and then I did a city trip just before this, that also meant no time for preparation.

At first I planned to do some camping on the way but then in the end decided to just use hotels as this was the first multi-day trip and maybe a bed and a shower were amenities I could use, also the Decathlon tent I was eying (the only one at around 1kg, the Forclaz Trek MT900) would have cost me around 170 EUR anyway. I used Booking.com for all my hotel research and booking.

So, in the end I settled on a 5 day trip and staying on the route as much as possible.

While this page has the complete GPX track, the overall presentation is kinda horrible, so I mostly used this page, in German, because I could download the single day partial tracks and it has some data on altitude change etc.

The plan was:

  • go to Freilassing by train from Munich
  • day 1, Freilassing to Rosenheim, 95km
  • day 2, Rosenheim to Munich, 63km
  • day 3, Munich to Landshut, 78km
  • day 4, Landshut to Kelheim, 78km
  • day 5, Kelheim to Hilpoltstein, 99km
  • continue to Weißenburg, where we had booked a vacation home
  • some days later, go home by train again

The Route

Preparations

I'd been hemming and hawing about getting a Gravel Bike for a while but only did some window shopping and didn't really want to spend 2000 EUR on a new bike, but luckily Pascal wanted to get rid of his old one anyway and after some scheduling problems we managed to let me test it on the day before I was supposed to leave and it felt good and so I was able to take it along that day. Which reminds me that I still need to pay. Oops. (Wrote most of this on the weekend and have since paid for it :P)

I also went to the local big bike shop for some last minute stuff: a top tube bag, 2 bottle holders, a chain tool, maybe some good Ortlieb or Vaude panniers.

In the end I bought a cheap top tube bag, 2 bottle holders, fingerless gloves, a gel for emergencies, some power bars, a chain tool, and no panniers.

I was packing extra light, one of the reasons was that I was going to be home at the end of day 2 and be able to grab stuff I was missing. I didn't grab anything except refilling my bottles and bars, just as I would have somewhere else, which was nice. Packing list below.

Day 0

As usual, Deutsche Bahn let me down by not letting me book my ticket one day in advance. The search form on the website let me filter by available bike space on a train, to only tell me then that the available Railjets to Salzburg were not available after all, and the regional trains would not let me book a ticket for the bike, at all. So getting up early it was. In hindsight I am still a little confused why you can't buy a bicycle day ticket for the next day (or at all?) online, you can buy one for the next day at the ticket machine.

Day 1 - Freilassing - Rosenheim

Got up at around 4:30, final preparations, cycled to the central station, got there at around 5:15, grabbed a ticket for me and for my bike, took the train to Freilassing at 5:55 and had a nice chat with two other bike travellers.

Got off at 7:45 and started my way towards Rosenheim, only stopping for a second breakfast in Traunstein and made it to Chiemsee around noon but did not really have any luck finding a restaurant I liked, so had a Currywurst with fries at Döner-Kebap-Haus in Bernau. As this was the first day and it was hot and I hadn't really ridden a bike a lot the last weeks I crashed pretty hard around 3-4 in the afternoon and was looking for a shop or gas station to get something cold to drink, but nothing was open in any vicinity of my route. At some point I decided to veer off my route and try to get to that one grocery store that Google Maps showed as open in a somewhat close village and that was the first and only time I had to get off the bike and walk, uphill. Of course Maps was wrong and the store only had been open until noon but there was a restaurent next to it and so I ordered two drinks and rested for half an hour, then could continue my journey for the last 90 or so minutes. Hotel was a bit of a letdown, had to wait 15 minutes for someone at the reception to arrive (while hardly being able to stand anymore after 10h on the bike, minus breaks), room wasn't great or overly clean and the couple that arrived just after me didn't get their booked room and got an address for an apartment. I suppose they'd been given my room if I had been 15 minutes late and on any other day I'd happily tried to sort something out but I was just so glad to be able to take a shower. They were back the next morning when I went for breakfast so maybe the did get my room after all as they seemed to be staying for longer. Also the guy at the reception made me pay via card and one day later booking.com also charged via PayPal, so I had to sort that out later, but didn't take too long to fix. Went to an Italian restaurant (Da Giuliano) around a kilometer from the Hotel, adjacent to some sports club and had some excellent pizza and a very noisy and annoying neighboring table.

In hindsight I noticed that I hardly slept the night before. Stressed out because of the train, a bit overexcited and because I hadn't anticipated that I wouldn't really sleep I went to bed too late (or I had had 2h more of trying to sleep) - maybe the day would have been easier if I had been well-rested.

Daily kilometers: 109

Total kilometers: 109

Fedi picture thread

Day 2 - Rosenheim - Munich

Wasn't looking forward too much to this route, as I had gone the opposite way already last September (Munich to Rosenheim, then to Wasserburg and home by train) but it's part of the route. First you go along the river Mangfall past Kolbermoor, then Bad Aibling and Bruckmühl until Feldkirchen and then you're already close enough to Munich that there's an S-Bahn station nearby. Had lunch at the Ayinger Bräustüberl around 12:30 and then was routed through a part of Munich I hardly knew so that was interesting as well. Arrived home at around 16:00, and spent the evening recovering and doing some things I'd not gotten to, like preparing the route for the next three days...

Surprisingly my legs were completely ok, but my shoulders hurt a lot at the end of day 2, I guess that's because of the new bike, new position with the different cockpit, and just cycling for so many hours. Also the route turned out to be slightly different than the one I used last year, so overall a good day still.

Also I noticed that one of clamps on my cheap bike panniers had broken, so I decided to use the other one from the set for the second part. Other than that, nothing had failed or misbehaved.

Daily kilometers: 78

Total kilometers: 187

Fedi picture thread

Mangfall near Bad Aibling

Day 3 - Munich - Landshut

The first leg of this tour was again something I'd seen, along the Isar towards Freising is a trip I've done several times wholly or partially on my hardtail as a day trip. That day I learned the difference that a front suspension makes on certain types of gravel, ouch. The trip was uneventful, except for struggling to find a place for lunch again, in the end I settled on "Gasthaus und Hotel Forster am See" in Eching, mostly because I was riding past at 13:00, had mediocre Käsespätzle with a good salad. And a light shower that made me switch tables, good timing though. Apparently this leg was a bit short because I arrived at the hotel at around 15:00. The hotel was in Ergolding, not Landshut proper, so just a bit past it, from my starting point.

This was some "no reception, check in at an ATM" thing that mostly seemed to house construction workers, but it was cheap and seemed ok. Only downside was not having an elevator and my room on the 2nd floor. Not a huge problem but when I arrived I would have used it.

I wanted a burger for dinner, but couldn't find any place that looked decent and I kinda felt fresh (and cocky) enough so I decided to add a little detour to Wörth an der Isar after an hour long break at the hotel, that would be another 15km to get there and 15 to get back. When I arrived in Wörth I checked Maps again and saw a place where someone had posted a photo of a burger, so I went there (La Dolce Vita, again next to a sports club) and the burger was excellent (although I've been told everything tastes better after 100km a day). Got a scoop of ice cream on the way back and went to bed early, as usual. While I usually like riding along the Isar (on my hardtail), for this long trip, and day 3, it was a bit boring at times.

Daily kilometers: 113

Total kilometers: 300

Fedi picture thread

Isar in Landshut

Day 4 - Landshut - Kelheim

This leg had me go through Ergoldsbach, Neufahrn in Niederbayern, Pfeffendorf, and Schaltdorf and again I wasn't sure where I would get lunch or whether I'd find something at all. Luckily I found "Bei Mario" in Rohr in Niederbayern and had a really good pizza and even got my Espresso for free and my water bottles refilled. Thank you, Mario!

Onwards to Sallingberg, Offenstetten, Abensberg and Saal an der Donau, where I had my second ice cream of the trip in a weird cafe, but it tasted good enough. Saal would have been the official end of the leg, but I continued to Kelheim (where my hotel was) along the route.

This was the second "check in via machine" hotel without a reception and every step of the process seemed to take ages and in the end it errored out, but luckily still printed my room code. Apartment was huge and cheap for the size, but the bed wasn't great. Also got an email later that the processing had failed although the printed recipe showed me paying so something I needed to sort out when I was back. It's been resolved meanwhile and they were very polite about it.

Research for dinner yielded "Little Budapest" which sounded nice, where I had some kinda good Hungarian beer (Soproni) and a tasty and spicy meal.

The worst thing about the hotel was that the power outlets next to the bed were unreasonably high up the wall so when I plugged in my phone at night I broke my charging cable (still mostly my fault) and had no backup. Luckily I'd already done some research for the next day but was still panicking a bit. At least it had happened on a Sunday evening with shops open the next day, the problem would just be to find one.

Daily kilometers: 82

Total kilometers: 382

Fedi picture thread

Donau near Saal

Day 5 - Kelheim - Hilpoltstein

This leg was supposed to be a long one, first along the river Altmühl. So getting up very early was a fun challenge with a switched off phone, but I just hoped I'd wake up at some point during the early morning hours and then be able to switch on my GPS and set an alarm. That worked, but I still ended up waking up at 6:15 just before the alarm. Grabbed my stuff to stand ready at 6:50 when the big grocery store opened, but unfortunately they didn't have any charging cables and the electronics store wouldn't open until 9.

Anyway, no use delaying and so the route went to Essing, Prunn and in Riedenburg I saw a sign for a store that sounded like it was worth a shot, unfortunately it was way up a hill, so I decided to walk. They were open and very nice, but unfortunately they only had lamps and washing machines and TV cables, but no USB ones, but referred me to an electronics store in Dietfurt (or the one in Kelheim where I came from). So off to Dietfurt along my planned route, and there I first stopped at another big grocery store, mostly to get a drink but they actually had USB-C cables and I didn't need to search for the electronics store, yay. Hooked up my phone to my power bank and continued to Beilngries, Kinding and Greding, where most restaurant were closed and I had to take the open one with the worst ratings, but the waitress was nice and let me charge my phone inside, and the food was actually ok as well. Just after lunch I arrived in Thalmässing, the last bigger town before the planned end of the leg, Hilpoltstein.

Here I was to decide if I'd stop the D-11 route and go straight to the vacation home or finish the leg and go from there. As it was kinda early in the day, I felt reasonably fresh and able I decided to push to the end. There is supposed to be a somewhat easy way between the two towns and there was the route on my GPS which was kinda brutal, those last 20km really took a while and it was the first time where I pushed the bike up a 15% hill, as part of the originally planned route (the other two were when I had left the route to detour to a shop), but in the end made it to Hilpoltstein where I planned to sit in a cafe and have some coffee and a slice of cake maybe, but in the end I sat in the shade in the REWE parking lot, chugging drinks, refilling my bottles and making the cashier look at me funny when I came in back to buy 2 more bottles just after I'd left buying 4 bottles.

After that I took on the last 30km of the tour and made it to Weißenburg, only to be defeated by the vacation home being on a hill that I did not have the energy to pedal up, after 125km that day.

Anyway, got some decent dinner and that was the first bikepacking trip.

Five days, just a bit more than 500km, four of our seven Bavarian governmental districts, and 5 of 22 legs of the whole D-11 route done.

Not sure if it will work out, but I'd love to continue where I left off later this year, maybe doing 3-4 days over a long weekend, which would be just past the Bavarian border, with the day trips I chose.

Daily kilometers: 127

Total kilometers: 509

Fedi picture thread

Hilpoltstein

Packing list

Attached to the bike:

  • GPS, Garmin eTrex 20x
  • one old gym bottle with 50% Fanta, 50% water or just water
  • one bottle of Gatorade or Fanta

Worn:

  • Helmet
  • Sunglasses
  • Five Ten MTB shoes
  • Fingerless padded gloves
  • Jersey
  • padded bib shorts
  • MTB shorts (no, I'm not that spandex guy)
  • normal socks

Backpack (Deuter Race X 12L with 3L water bladder):

  • spare AA batteries for the GPS
  • bike lock
  • keys (lock + home)
  • wallet
  • power bank
  • Buff neck scarf thingy (U)
  • cloth handkerchief (U, Z)
  • pack of handkerchiefs
  • Hand disinfectant (U, Y)
  • wet wipes (U, X)
  • plastic spoon (U)
  • Foldable shopping bag (U)
  • glasses case (U, Y)
  • bike tools
  • pump (U)
  • spare tube (U)
  • sunblocker
  • meds, bandaids, magnesium pills

Pannier (a cheap "bikemate" one from Aldi, old and never used before):

  • Jersey
  • padded bib shorts
  • MTB shorts
  • one pair of socks
  • rain jacket
  • toothbrush, toothpaste, shower gel
  • thin long-sleeve hoodie (U)
  • t-shirt
  • boxers
  • normal pants
  • wall plug for charging
  • small pouch with: (U)
    • sewing kit
    • ear plugs
    • 2 small carabiners and some zip ties and rubber bands

So, basically a 2nd set of what I wear cycling, plus t-shirt + underwear + pants for going out for dinner. The stuff I wore every day (minus the MTB shorts) I rinsed under the shower, then packed into a towel and rolled it, then patted it dry and let it dry in the hotel room over night. Works fine with synthetic fibres and just barely with normal socks, not with a cotton t-shirt for example. I could have avoided the normal pair of pants (some hiking ones with detachable legs at the knee) and just used the pair of shorts I hadn't used that day but it wasn't a huge deal either way. I did use them most days though.

Makeshift army shop pouch used as a handlebar bag:

  • wind breaker jacket (U)
  • quick snap ultralight unsafe-ish bike lock (U)
  • extra elastic strap (U)
  • in-ear headphones (U)

Top tube bag:

  • energy bars
  • energy gel (U)
  • dextrose candies
  • gummy bears
  • phone unless it was in my pants pocket

So while the list is pretty long I didn't use a lot of space.

I am reasonably sure my backpack is the 12l model and the pannier is around 13l, going from the dimensions. The extra pouch I had is maybe 1l, so is the top frame bag. So all in all I guess it's just below 30l, aka one of the bigger panniers by the usual suspects.

Some explanation of the footnotes:

  • U - Unused
  • X - Expired, should've checked
  • Y - In hindsight I should have left those at home

In total I am quite happy with my choices. Nearly all the things I brought and did not use fell under the "emergency" category and nearly all of them were pretty lightweight (handkerchief, 1 gel, wind breaker, straps and bands) or so important that weight didn't matter too much (spare tube, pump, tools, rain jacket).

I usually bring a hard case for my glasses, but I guess as I was only having my old beaten up sunglasses I could have saved that. Also the hand sanitizer... where I went to eat I could usually wash my hands, or still had them clean from the hotel room when buying breakfast. Not totally useless I guess as I never had to make a toilet break during the day once (yay sweat). And my wet wipes were completely dry after many years in my bag, need to double check that next time.

The quick-snap lock I had bought for a couple of euros a while ago seems a little useless, I'd imagined it as some "I need to fix the bike to a pole or railing in a few seconds while having to step away really quickly, and no time to take out the lock from my back pack", but that never happened. But I guess it's like 50g (like a zip tie with a metal core, with a special plain key) so not much lost, except those couple euros :P

The weather was really nice so I didn't need to change on a whim.

The list of things I should have taken and did not is pretty short:

  • second USB charging cable (it broke, and it's small and light)
  • wound disinfectant spray (scratched my leg at some point)

I pondered about taking a lightweight pair of shoes but that seemed very much not needed, as I was wearing "normal" MTB shoes without cleats.

Expenses
  • Preparation:
    • a new (used) bike :P
    • some 100 EUR of missing bike equipment (tools, tubes, gloves, bags)
  • Hotels:
    • Rosenheim: 80 EUR
    • at home: free :D
    • Landshut (easy sleep Apartmenthotel): 61 EUR
    • Kelheim (greenpartment Boardinghousehotel): 80 EUR
  • Trains:
    • Bike: 2x 6 EUR
    • Munich to Freilassing: 34 EUR but I don't know why, should be 27 EUR
    • Treuchtlingen to Dachau: 24 EUR
  • Stuff:
    • USB charging cable: 7 EUR

Food is hard to gauge as I didn't really pay attention here. I usually had lunch and dinner, meals ranged from 8 to 16 EUR, usually with one or two drinks on top - but I usually did choose a cheaper menu option. Breakfast was usually from a bakery, only on day one I had a "proper" one in a cafe for 8 EUR. Then 2-3 coffees, a scoop of ice cream here and there and a lot of mostly half litre bottles of Fanta/Water/Gatorade in supermarkets, so not that bad - only on Sunday I needed to stop at a gas station twice and paid a premium.

But I did avoid having to buy panniers or anything really costly just for this trip, as my bike clothes and equipment were in solid shape. I guess by not paying for a single room but a double for two people you can cut costs, the next thing would be to only have dinner at a restaurant and take some stuff with you for lunch. I planned to stop at McDonalds once but it didn't work out with the route. Can't beat the cost/kcal ratio there I guess, but I don't think I wasted a lot of money.

Final thoughts

Very fun, would do it again any time. Needs a bit of prep work and a proper bike. I could have used my hardtail, but without any panniers it might have been hard to put all the stuff in. Many people prefer to go without a backpack, but mine is fine for me as long as I don't make it too heavy. The suggested 80-100 km per day seem ok for someone who usually uses a bike a lot but hasn't really started the season with doing longer trips. A day with up to 800m of climbing was mostly doable, the day with 1800 was hard. My stop at home in the middle was a nice safety net, but completely unneeded, although I did of course plan around it a bit, for example only taking one spare tube for the first two days and not two of them, or less energy bars, and brought breakfast with me when leaving for the second time.

I also guess I was overly cautious and now I know better how much I can manage to do in one day. I was not skipping a meal, I was not only drinking water - I guess you can wing it a lot more.

Regarding camping with a tent, that would absolutely mean taking a second pannier and as you're not allowed to camp out in the wild in Germany I tried to do a little research regarding camping sites but their websites are mostly terrible and I wasn't confident I'd have a place to sleep every night. Guess I should try that some other time when it's not a huge trip, just a weekend where if bad comes to worst you can improvise.

Footnotes
  1. I know some people might take offense that by sleeping in hotels and not in a tent it's not bikepacking, but bicycle touring but I honestly don't care. I did plan to go with a tent but it didn't work out. Maybe next time.
https://f5n.org/blog/2023/bikepacking-d11/
2022 in review
Show full content

These review posts have proven useful when looking up stuff, so I'll continue this tradition.

 

( 2021 / 2020 / 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft - less, but still mostly that
  • EVE Online - tied with WoW this year
  • Final Fantasy XIV - came back very briefly
Books I've read
  • finished Laika's Window which I started in 2020
  • reread the Sandman comics
  • quite a lot of pen & paper RPG material
  • Polar: The Black Kaiser (comic)
Movies I've (re-)watched

For some reason I lost the drive to watch stuff a while ago, it's simply not fun anymore and I can hardly sit still through a whole movie or show episode.

TV Series I've (re-)watched Podcasts and other media
  • a bit of ATP and some gaming podcasts
  • a surprising amount of watching Twitch streams
CDs I bought
  • Sleigh Bells - Texis
  • Sleigh Bells - Jessica Rabbit
  • Soilwork - Verkligheten
  • Soilwork - The Ride Majestic
  • Arch Enemy - Deceivers
  • Amon Amarth - The Great Heathen Army
  • Battle Beast - Circus of Doom
  • Blind Guardian - The God Machine
  • Tony Bennett & Lady Gaga - Cheek To Cheek

If I'm going off this list I seem to developing a bigger taste for Melodic Death Metal. In Flames has been a staple for years (soon decades), Arch Enemy and Amon Amarth are not so recent additions, but Soilwork is a new discovery of 2022. If I was 100% exact I'd also add the shipment of another 11 CDs I ordered just before the year ended (5x In Flames, Therion, Fear Factory, Hypocrisy, Soilwork, Sabaton, and The Halo Effect) - but I've not managed to even open the package on New Year's Eve, so those will be on the 2023 list.

Other stuff I bought
  • an NVMe SSD, 2 TB, 189 EUR
  • a 2.5" SSD I ended up not needing
  • a multimeter, UNI-T UT139C, 50 EUR
  • a couple Shelly Plug S, 20 EUR
  • a coffee grinder (Hario Slim Plus), 25 EUR
  • a lot of coffee beans
  • 16 used RPG source books on eBay, ~160 EUR
  • another new laptop PSU
  • a new travel backpack, a Dakine Campus L (Night Tropical), 65 EUR (permalink)

A year where no big things needed to be replaced, which is always nice. Not using my laptops a lot, so the 2013 x230 and the 2016 T460p are still completely fine for casual usage, although the x230 could of course be thinner and lighter as a dedicated travel machine - a Chromebook would have worked fine for me since the pandemic started, with one exception where I had to bring the big machine anyway.

I have a 10-12 year old Dakine Campus 33L which has accompanied me on most, if not all, trips around the world and only recently has shown signs of wear, because I've also used it for getting groceries and have regularly had 20kg of stuff in it, milk cartons and bottles and whatnot. The new interior design isn't as great as the old one but it seems servicable, and I like the form factor and that it does not look like a tactical bag or if I'm a onebagging tourist. So yeah, 10 years of abuse (except maybe crawling through mud) and it's held up just fine, so this was my default choice for a replacement. We'll see how this one holds out, hopefully just as long, as I'll keep the groceries to the old one.

Social networks
  • Twitter - daily light usage until November, then I stopped
  • Facebook - logged in like three times
  • Instagram - account sucessfully deleted
  • Fediverse - yes

I managed to follow most of the people I followed on Twitter on my Fediverse accounts, also closely following the development of a self-hosted Mastodon alternative, ktistec - already sent some small patches.

Messaging
  • IRC - still daily
  • Matrix - nearly daily
  • Email - no change, but I feel it's getting less
  • Slack - work and 2 other communities
  • Signal - yes
  • WhatsApp - yes

Still don't see any widespread migration away from WhatsApp, but some discussions here and there that IRC isn't cutting it anymore for a lot of folks. The #erlang channel on Libera often references a Slack, the Munich CCC chapter had a discussion about Matrix vs IRC, and then some.

Trips
  • other countries: Czech Republic for a weekend
  • in Germany: once to Berlin, also a few days near the mountains

While I don't like German Pilsner at all, since this trip I've been buying Pilsner Urquell again, because Czech Pilsner is good (so is Budvar and most of the others I tasted). This phase will be over at some point I suppose, but for now I'm enjoying my small 33cl 4.4% bottles, usually not more than one a day.

(Online) Services
  • Subscribed to Netflix, Disney+ and Amazon Prime
  • some MMOs subscriptions
  • I finally managed to consolidate all my domains at one company, INWX
  • in the foreseeable future I'll keep paying for one VPS at Strato, two "cloud vps" at Hetzner, and one at Scaleway, for a total of 20 EUR
  • procrastinating changing my mobile plan
  • still waiting for fiber to the home, no dice

Overall I'm investigating running even less of "all the services on one box", as seen on the hosting options post, but of course that's a slow work in progress and not everything has the same solution, but I'm very happy with Deno and Fly.io here. Guess it doesn't count as self-hosting anymore, but looking at it from an "own your data" point of view, I guess I'm trying to get rid of the stuff that has no "data" or not even a lot of state and let that be someone else's problem while still running the important services that have my data that is worth protecting.

Programming languages, sorted by usage
  • Elixir - work, I like it
  • Java - work
  • Erlang - work
  • C++ - work
  • Clojure - went back to some old personal projects
  • Rust - for Advent of Code, and a few small things
  • Python - random small bits

We've been doing Erlang for years at my (not so new) job, but this time we needed something inherently HTTP API-ish, so we decided that Elixir might be a better fit than Erlang and writing all the framework-y bits ourselves, that's why we used Elixir and Phoenix. And of course everything took longer than expected and so a good chunk of my year at work was spent on this app and it was really nice. The only pain points are at the Erlang-Elixir boundary when working with strings.

Stuff I planned to do this year but didn't
  • mountain biking fell flat due to health problems
Stuff that would be nice next year
  • more cycling and mountain biking
https://f5n.org/blog/2022/2022-in-review/
Trying out some hosting options
Show full content

In a mood of looking into not self-hosting every small tool I wanted to try out a few of the options that are around now. Not that self-hosting is bad per se, for some of these things I thought it would be nice to get them into some sort of shape to be able to host them somewhere else, especially if they're stateless and don't have any external dependencies.

TypeScript + Deno Deploy

While I've never been a fan of nodejs, I am drawn a lot more to deno and so I set out to rewrite a very small and very old project I'd cobbled together and had been using for 9 years.

The project is hosted at ip.f5n.de and i.f5n.de and simply displays the IP address you're connecting from, and some HTTP headers plus your IP, respectively.

Here's the PHP source code, it has gained a few more small features over the years, for example showing the ASCII table, converting unix timestamps to dates and back, converting from decimal to hex and binary.

And here's the rewrite in TypeScript, which I then put on Deno Deploy on their free tier. This is just connecting the repo to their Github App an now every push does a deploy. If you configure the DNS TXT records correctly, then you also get SSL on your own subdomain via Let's Encrypt - nice.

Everything has been completely smooth here and I didn't run into any problems.

I did the same thing for another small project, but it's 100% the same setup, so I won't elaborate. Roughly the same age, ~150 lines of PHP code (nothing wrong with the code, it's kinda trivial as well), and I also rewrote it in TypeScript, cleaned it up, and moved it to Deno Deploy, also keeping the old code running on my server under a different URL.

Clojure + Fly.io

This project is also over 10 years old and is written in Clojure, and the way I have used it so far is a bit of a convoluted mess. Cron runs a shell script, which runs commands via Make in a container. On top of that the Clojure app itself was only running via lein run TASK, but speed isn't really important.

On the other side the offering by Fly.io, running a container for free with 256MB RAM, sounded quite interesting, and I wanted to try them out anyway so I saw a possibility to make this work.

Of course (at least to me) running something like a cronjob in a hosted container doesn't really match, so I bit the bullet and wrapped my CLI tool (with some library functions) into being exposed as a web service, which I could then host there and call via cron again - which is no problem.

I don't want to go into too much detail here regarding the refactoring and adding features, but focus on the deployment.

My first try was using the clojure:openjdk-8-lein-slim-bullseye docker base image I'd been using so far, but while I did get the app to run on Fly.io I had it crashing by going OOM a lot, despite experimenting quite a bit with the -XmxAAAm -XmsAAAm flags. The app itself is not actually doing a lot, it exposes a web server and then it fetches 2-20 smallish JSON files, extracts a few values, and writes them to HTML report. This simply should not use up a lot of memory, as it's always just 2 JSON files at the same time, the other pairs are fetched and processed sequentially.

There wasn't a real change with the jdk11 image, but to my surprise using the clojure:temurin-17-lein-alpine with -Xmx192m -Xms192m seems to have done the trick. While I did know you can't just assume 256 MB for the heap if all you have is 256 MB, I don't have a lot of experience with these numbers, but I found the 'allow around 25% of leeway' in a blog post and yes, it seems to work just fine.

Overall the experience with Fly.io wasn't as great as with Deno Deploy I have to admit, but it wasn't exactly bad.

First of all you need to enter your credit card details, even if you simply want to try the free plan. I understand their angle but I don't have to like it.

Then their docs aren't too great, but maybe only for this 'run your own Dockerfile' use case I looked at. The docs kinda tell you what to do, but not detailed enough.

They tell you to run flyctl deploy but for some reason insist on building the image from your Dockerfile themselves (but on your local machine) instead of maybe using the image you just built 5 minutes ago for testing. Again, not the end of the world, but if they only would at least tag them so you'd see which ones those are when running docker images, but they're all "unknown" and you need to clean up carefully. Should be really easy to tag them with some fly-deploy-timestamp string.

Once you managed to have your image deployed you might wonder why it's not reachable via the provided url. Their fly launch tool (why are half the commands fly and half of them flyctl btw?) has helpfully generated the fly.toml config file for you, but it was populated by some values you absolutely need to change but they're not documented in the file and the docs on the website could be better.

Caveat 1: The port. If the tool analyses your Dockerfile and creates a config, I would have expected it would default to the EXPOSE port or mention that on the website. Nope, you only find that in the troubleshooting guide.

Caveat 2: I still don't know exactly what these numbers mean, but under [services.concurrency] there's a default hard limit of 25 connections, which I ran into when requesting 20 JSON files and then accessing my deployed container. I don't want to blame them here really, because I've simply not understood if the http client I was using in my code still had dangling connections, or what happens when I request a web page with 25 images. So far I have changed my code to use a connection manager to reuse the connections, and also upped this limit to 50 and I've seen no further errors. The problem here is that I don't know how to find out what they count as "concurrent connections", especially when serving web pages.

Caveat 3: There are some health checks by default, e.g. 'the port you gave is available via tcp after N sec' but again it's there as a default with no explanation so I had to find the fly.toml docs and find out where this failing health check that I didn't ask for is coming from.

While you deploy you can see the logs for this container on the web page, this is pretty nice, but it repeatedly stopped working with the helpful "this page has stopped responding" popup in Firefox.

Apart from those little annoyances (and the only WTF one being the port) it was a good experience. Still a little worried I might overstep the free tier but we'll see.

They really need to improve their "First steps with a Dockerfile" document, otherwise it was fine, you just need to find the docs and actually read a lot. Maybe I'm a bit unfair here but this is a very basic container with a very basic web app. If it's booted up it will serve a plain html page at /. No database, no external systems. If you ignore my starting problems with the RAM (which I don't blame them for), this part should've been easy from a given Dockerfile.

I want to try out some other runtime and maybe also connect to a database (I have another project of mine on my mind), but for JVM stuff the 256MB seems a little on the low end. No complaints towards fly.io here, just an observation, more of a blame of the JVM :P

Conclusion

I've always been a fan of the Heroku idea, easy deployments and then not having to care about stuff, but the only time I actually tried Heroku I wasn't amazed by the performance.

But now I found not one, but two offerings that 100% fit my needs, and that's serving some very basic small apps (disclaimer: my Clojure container is actually huge, but I swear that it's not my fault, sorry fly.io) for free.

There have been a lot more sites where you could deploy static sites (I have one small project on netlify and it also just works) but this is what I need, not so much JS frontend, but actual server side code. I mean, to be fair, you could probably rewrite the two aforementioned TypeScript projects to be client-side only, I haven't tried it.

So far I fully recommend trying out Deno Deploy and fly.io - but I can't yet say if their paid plans are worth it over self-hosting on a VPS. For someone like me who enjouys the tinkering.. probably not. You can put a LOT of low-traffic, low-CPU projects on a 3 EUR cloud VPS instance.

https://f5n.org/blog/2022/trying-out-some-hosting-options/
Switching to nextgen
Show full content

Last week I finally bit the bullet and, after changing the font, made the few remaining switches. This website is now generated via nextgen.

There are still a few things to clean up, but overall I'm happy - there was still one missing feature I had to add - copying the static assets from the theme folder to the public folder. Oh, and themes are now called blueprints, because it makes more sense. Unfortunately I'm way past my original 333 lines of code, but it was just a fun coincidence anyway.

The actual 'switch' commit is kinda tiny, but being very compatible with hugo was one of the stated goals. Of course the commits for the templates weren't quite so small.

The Atom RSS feeds should be similar enough (especially the IDs) as to not confuse any RSS consumers, but apologies if you're being spammed with 10 years of posts now.

So there are still a few little things to implement in nextgen but if it can generate this site it's good enough.

https://f5n.org/blog/2022/switching-to-nextgen/
Theme V3
Show full content

Over the last few evenings I spent a little bit of time on the CSS for this website, I can't say I was particularly enjoying it though.

Back in October I was ripping out most of that old version of Foundation (which was huge), but it was still a bit of a mess and 8.5 kb of copied minified CSS were left.

So I started from zero and only ported what I needed from my SASS file, then imported those 5 classes I use from Foundation, and I even rewrote most of those. Now I have my own (bad) version of a CSS grid, using display: flex in a parent div. It seems to work well enough though.

Hat tip to enough.css which looks good (and I stole a few bits), but I think it doesn't make sense to use it verbatim if you already have something you like and just redo the styling from scratch. I might actually use it for other projects.

Anyway, everything seems to work and it also looks fine in a very narrow browser window (just with about half the max-width code now), there's only one "bug" I still need to track down, there's always horizontal scrollbar in mobile mode, probably a stray margin or padding - but that's not urgent now.

The landing page is now 5.3 kb of HTML + 4.2 kb of CSS + a 9.6 kb Favicon. Oh well.

https://f5n.org/blog/2022/theme-v3/
Self-Hosting
Show full content

Recently I've thought a lot about self-hosting, maybe triggered by the whole fediverse hype and how decentralization is actually desirable for many projects.

Not that I usually don't think about self-hosting at all, after all I do that a lot. So what am I actually hosting?

  • a production mail server for 4 users, and some static websites behind nginx
  • a WordPress blog on another VPS, using Caddy and MySQL
  • Quassel (+Postgres) for IRC on a third, this also functions as a test bed for running some other temporary apps
  • a web server for all my random projects and some other stuff, the local dependencies are mysql + postgres
    • RSS reader
    • personal wiki
    • image hosting (a pic dump)
    • my tumblelog
    • syncthing for not-really-important files
    • podcast episode tracker (because I'm bad at remembering done/todo) &1
    • lately: ktistec for the fediverse &2
    • an IRC bot
    • some fediverse and discord bots
    • a dozen cronjobs that fetch data and reformat it for consumption

Stuff I hosted in the past, but have stopped:

  • TeamSpeak - everyone uses Discord now
  • Mumble - same
  • Matrix - enjoying my stay on a friend's homeserver &3
  • Jitsi Meet - replacement for Teams in my former team at work &4

So on the one hand it's nice to have your stuff and also to play around with things that are 'live', even if it only has one user - you still have to think about backups, updates, dependencies, deployment, data, and more. Not that I'd say updating things is a great use of your time, but it's mostly worth it. On the other hand more services have sprung up that promise to let you run things there, no strings attached. Of course that that also sounds nice.

I started by rewriting my small 'what is my ip' tool in TS and deployed it to deno.dev. Original - Clone. I didn't go for 100% feature parity, but it's good enough as a test. There's also fly.io, render.com and some contenders. Sure, you don't have to care for your application anymore and if you're running an old (vulnerable) version of something, it's not your problem anymore - at least when there's no data to be leaked or if the data is public anyway. But the thing is that you'd kinda have to eliminate everything you're running in order to pare down your attack vectors and get rid of the chores. If I have a docker container with PHP I don't really care if it's serving one 'website' or five of them.

Maybe self-hosting has several use cases and the people vehemently arguing in favor of it are muddling them up a little. Point one is to own your data, but sometimes having your own domain and migrating from one email provider to the next is good enough. No vendor lock-in, so to speak, just a temporary home for your thing. Then there's "not running anything on anyone else's server", which is an angle I don't really have, it's just a lot more convenient for me to have stuff on my own server, if it's something without a standardized way of deployment or if 'run it via cronjob' is the perfect fit. And then there seem to be the people who don't want to have chores but still not be at the mercy of any SaaS, so I guess that's where you run managed k8s on a bigger scale or Heroku/render/fly/etc. on a smaller scale.

Conclusion

Is there one? Maybe I'm a little weird but for me keeping track of 10 things I have deployed at 10 different service platforms is nearly as bad as hosting them myself, somehow APP.example.org seems to stick better if example.org is my own domain. My main concern is outdated dependencies, so maybe this problem is not easily solvable. And is it really helpful to have several different deployment pipelines to several different services, who all could change something at some point, whereas on my own infra I choose when I make the jump to a newer (maybe incompatible) major version, otherwise it's mostly chugging along happily on a security-bugfix-only LTS version.

I can see the draw of Go here. The aforementioned REST-backend for my podcast tracker was 750 LOC in PHP (using the Slim framework, a logging library, and a RSS library) and the Go rewrite which is only missing the HTML functionality is 450 LOC and a single dependency, the Postgres bindings. They have a pretty good track record of backwards compatibility, so I am confident that I could just recompile it with future Go versions and it won't break. But I'm surely not advocating to rewrite all your stuff in Go and stop using dependencies, but in this case it kinda made sense.

I still have some concerns about hosting stuff with databases somewhere else, or anything stateful really. If it's just analyzing HTTP requests or has some content in HTML files I can see myself using deno.dev and Netlify more.

Next steps

I'm not sure I found out some actionable advice here. I'll definitely be looking at fly.io and render and see what I could use them for (hosting a docker container would be awesome, but need to check the price first - it's always the price. I can run 20 small things on a 5€ VPS, why would I pay 20 times 5€ for an app I use a couple times per month?) Also maybe I should be looking into managed k8s, that might be this single interface deployment I am looking for... Also the things that are the easiest to hand off to e.g. Netlify are also the ones that are the easiest to host. A docker container for nginx and provide SSL for it, done.

Pseudo Footnotes &1 - Jerssey

I wrote the backend of my Podcast Episode Tracker Jerssey in PHP (Slim) originally, for nostalgia reasons and to see if I can still do it after not having used it for over 5 years, but at the moment I am rewriting it in Go because I don't agree how many dependencies (direct and transitive( I am using for an actually tiny amount of functionality in a REST api. The client is a Qt desktop app that I use on Windows, but it also works on Linux. I have not open-sourced any of these three components, maybe I will.

&2 - ktistec

I have nothing against Mastodon per se, but I think it's complete overkill to run a Mastodon instance for a single user, so I was searching for alternatives. I looked at honk but I think it's more performance art than a usable piece of software (at least to me), I tried GoToSocial but I was not enthusiastic about it, especially as it lacks a frontend of its own and it also didn't seem to do what I told it to do, but I'm not ruling out an error on my part. Then there's epicyon which I haven't tried to run yet and finally ktistec, which advertises itself as a lightweight single-user application and it just worked.

&3 - Matrix

First of all, I love Matrix. Maybe I'm biased because it reunited me with some folks who had left our IRC channel one by one, and now we can talk again - and it works perfectly fine for this use case, even on mobile. Unlike in the fediverse I think it's very ok to tag along on someone's instance, at least how I use it. I am in a channel with a nick I choose. I could replace my 'connection' anytime, the 'hostname' doesn't matter, just like on IRC.

&4 - Jitsi Meet

Yep, the experience for a team of six was better on a jitsi instance on a 5€ VPS than the Microsoft Enterprise[tm] solution. I wouldn't want to host (and scale) this productively (it could work, but I didn't poke deep), but it was good and we could of course fall back to teams. Also I wasn't comfortable having work meetings on a random instance, in this case I could make sure nothing was recorded and leak, so it was fine.

https://f5n.org/blog/2022/self-hosting/
Blogs and Microblogs
Show full content

Today is a weird day. First I read about Snikket (in a HN comment I guess), which sounds pretty awesome - a curated set of tools for XMPP (i.e. server, web client, iOS + Android client) that are deliberately modified to work well together, just as it should've been from the start, and not everyone using different extensions and interacting being so painful at times... But for me this is like 5-8 years too late and I'm probably not going back to XMPP, I'm happy on Matrix for a certain set of people and I guess I lost contact with the ones on Jabber years ago anyway, or it's via Twitter or IRC or sometimes WhatsApp...

Then the news broke that Elon Musk is buying Twitter and for some reason there was a huge renewed interest in the fediverse again and the bigger servers seemed to be fighting with capacity a little. And by "for some reason" I meant that nothing actually has changed, it's just some event where everyone seems to get an impulse to check it out. I'm not saying that as a completely remote observer though, I did indeed log in to my fediverse accounts for the first time in weeks, and before that it had been months. Anyway, we'll see how that will pan out, the fediverse has never worked out for me because none of the 200 people I follow were actually being active over there.

It doesn't help that many instances have gone away since 2018-2020 and so there are a lot of empty references in my following list which I should probably prune at some point, at least if I would be active.

Back in 2017 (I think) I actually tried self-hosting (on a domain I no longer own, so again part of the problem), but the setup for just one user was just so overly complex and the software still buggy (I think I tried Mastodon and Pleroma) that I just scrapped the attempt and went to chaos.social for German content and mastodon.social for English content - I've never been a fan of bilingual interactions on Twitter.

I am not sure the landscape of self-hosting is a lot better today, someone posted this list and half of the applications are either declared as unfinished/beta and/or have not seen an update in years, which wouldn't be a problem if they were a little more mature and finished, but none of them look like it. So maybe I'll be trying out honk or ktistec.

And then I saw Blog more, tweet less and remembered my attemps to add IndiePub support into this site. Maybe I should just try to add something regarding ActivityPub and have the canonical source and then publish to either Twitter or the Fediverse... But oh well, does it actually matter? I put my Twitter account to private months (or years?) ago, I only have 150 people there, I haven't counted how many of those accounts are still active and so on, so "do I actually have any benefits besides appeasing FOMO" is a real concern. Self-hosting is nice, but not for the sake of it, the tool should have a purpose. And maybe this is something where I'm better off just using someone else's infra because it's just not important enough for me.

Also there are some valid concerns, mostly related to piggybacking on other people's instances, but the problem (see above) of just hosting your own persists. Maybe I should read Run your own social again, but I'm not sure there's anything new I haven't thought about.

Maybe this sounded like random rambling about unrelated topics but the gist of it is that I've been thinking about the communication channels I have used and am using quite a bit and for several of them I've never been really happy. The question is if moving to the fediverse would change anything about that or if there's a need for something else yet again...

https://f5n.org/blog/2022/blogs-and-microblogs/
7DRL 2022
Show full content

The 7DRL, or 7 Day Roguelike Challenge, is a yearly one week long event where you build a game. A roguelike.

It's been around for quite a few years and while I'm not actively seeking out roguelikes to play very often, I like the concept and have played a few of the better known ones over the years. I'm also really bad at them, but I thought it might be fun to actually build one for a change. I like that it's scoped to one week and then you can call it done, or revisit later to expand.

From the start it was pretty clear that I wanted to build it for the browser, just to ease testing and have less friction for people to play it at all. I am not familiar with any proper game engine or with game development in general, so my reasoning was that I would not miss out on awesome graphics or advanced features, so browser sounded perfect. At the start I took a very brief look at how I could convert/export a LÖVE game to the browser (because I made two very basic simple games with it in the past and I because I like Lua) and also grabbed a copy of Godot, but in the end decided to stick with rot.js, which was linked on the 7DRL page - and it's actually fantastic for this.

So, after a failed attempt at making a board game representation on the computer some 15 years ago with my wife, this was our second attempt at working together on a game. Before the game jam started, we brainstormed about the setting and gameplay for a bit - the only thing that was clear was that we didn't want to make a basic dungeon crawler, like a typical clone of the actual game 'Rogue'.

In the end we settled on a fishing theme, with you, the protagonist, being represented by a boat, going around a map on water, and fishing. My part would be all the code (and some design decisions), my wife was going to do the artwork and most of the game systems and formulas. I had taken most of the week off from work anyway so it's hard to put down how many hours we worked on it - we used the full 7 days, but took long breaks during the day or just worked for a few hours on some days. Maybe 40 hours per person, I don't know.

https://f5n.org/blog/2022/7drl-2022/
In-ear Headphones
Show full content

I'm a big fan of in-ear headphones when outside. I wear them when going for a longer walk, when using public transport, and when cycling I usually have one bud in on low volume for a little background music. So far, nothing revolutionary about that, many people do that. Over-ears are not a feasible alternative for me, I've tried it a few times.

Many years ago I discovered the perfect in-ear, but I don't really remember how. Maybe someone posted a link to a sale on IRC, maybe I read a review.

I am talking about the Xiaomi Piston V3 from around 2015.

Last time I checked I couldn't find them to be ordered anymore, but I still had one working pair (I'm not saying they're not sturdy, but using them 5-6 days a week, and folding them at least twice takes its toll, and I didn't actually wear out that many pairs...) and didn't need them a lot the last two years and I seem to have misplaced it. So I grabbed a HTC one I had in my "backup headphones from phones and whatever" box and used that for a bit.

Two weeks ago or so I went to Mediamarkt to buy something else and checked the headphone aisle, didn't see anything interesting, but near the checkout they had some JBL T160 and because they were cheap and I was kinda happy with JBL in the past (I have a small Bluetooth speaker made by them) I grabbed a pair.

And boy do these sound shit. No bass at all, the cable is very slim and flat and a little awkward, and the controls are in a weird place. Like directly at your collar. Also they fall out of my ears easily, but I might just have to try the other plastic nubs.

So yeah, I know I shouldn't expect great sound for 13 EUR (although the Piston V3 have that), but come on, sounding worse than the HTC ones they give you for free on a cheap/medium phone line? (Could have been the Tattoo from 2009 or the Desire Z from 2013ish).

So I guess I will put them in my bag as the new "backup in case I forgot to bring some" headphones and continue using the HTC ones and see if I can track down a few more pairs of Xiaomi Piston V3. Sad as it is.

Between writing this and publishing it I actually found one set of the Pistons in my drawer, so I guess I'm good for 1-2 years...

Update 2023-09-06: Around November 2022 I bought a pair of Panasonic RP-HJE125 for around 10€ on a trip because I'd forgotten mine at home and they seem to sound better than the JBL ones.

When I "upgraded" my phone to one without an audio jack I needed Bluetooth ones, I went for the Teufel Airy Sports - deliberately choosing the ones with the neckband. They're fine, but I'd still prefer to use some cheaper ones that don't run out of battery. Oh well.

https://f5n.org/blog/2022/in-ear-headphones/
Development and Proxies
Show full content

I'm in the unfortunate circumstance to be using a mandatory proxy these days (including SSL) and unlike with browsers where it's kind of fire and forget, if you're developing software there's a plethora of tools that will or will not accept the default environment variables, so here's a list of stuff and how to fix it.

Linux environment variables

The usual proxy variables:

PROXY="http://proxy.local:8080"

export http_proxy="$PROXY"
export HTTP_PROXY="$PROXY"
export https_proxy="$PROXY"
export HTTPS_PROXY="$PROXY"

export no_proxy='localhost,127.0.0.1,*.localstuff.example.org'
export NO_PROXY='localhost,127.0.0.1,*.localstuff.example.org'

Interestingly the internet seems to agree or disagree if it's the uppercase version or the lowercase version. I think there's no harm in setting all of them and just not thinking about it anymore.

Fortunately this solves the issues for all tools and package managers that use curl under the hood.

I've since configured these additional ones:

nix-pkgs
MY_CA_CERT=/foo/my-cert.crt

export NIX_SSL_CERT_FILE="$MY_CA_CERT"

Although on my current machine I actually have it set to /etc/ssl/certs/ca-certificates.crt

Ubuntu/Debian

As an aside, on Ubuntu you can trust your org's CA cert like this:

$ sudo cp MyOrgCA.crt /usr/local/share/ca-certificates/MyOrgCA.crt
$ sudo update-ca-certificates
RedHat/CentOS/AmazonLinux

This should work on all RH flavours:

$ sudo cp MyOrgCA.crt /etc/pki/ca-trust/source/anchors/
$ sudo update-ca-trust extract
elixir/mix

So this week I tried to install the Phoenix framework and that was a journey.

Apparently kerl and kiex work with curl, so that was no problem.

The fun started with mix where I think it's not documented properly, or at least their docs aren't ranking high enough, so I first arrived at

export HEX_UNSAFE_HTTPS=1, which is a bad idea, so don't do that.

The actual solution seems to be:

export HEX_CACERTS_PATH="$MY_CA_CERT"

But then the next riddle came up, mix phx.server in Phoenix's hello world example seemed to be downloading stuff from the npm registry.

I mean, it kinda makes sense to have some JS dependencies for a web project, but it was still a bit weird.

Asking in #elixir on IRC gave me the answer though that this was an esbuild watcher that was being started, probably to minify some assets or whatever.

nodejs

OK, esbuild, that's nodejs you might think, there's a variable for that:

export NODE_EXTRA_CA_CERTS="$MY_CA_CERT"

Just that it didn't help, for whatever reason. I didn't feel like debugging why it didn't pick up the variable if there was another way.

As I am writing this, there's still an open issue in this esbuild module for Phoenix, #31.

I used the workaround described there, installing esbuild by hand and then doing

# I do not like install -g
npm install esbuild 
export MIX_ESBUILD_PATH=$(readlink -f node_modules/.bin/esbuild)

but then you need to add this to config/config.exs:

config :esbuild,
  version: "0.14.0",
  path: System.get_env("MIX_ESBUILD_PATH")

But it worked, so it's fine.

erlang/rebar3

Update: Two weeks later I ran into the same problem with erlang's package manager rebar3, but from 3.17 on you can put this:

{ssl_cacerts_path, ["/opt/foo.crt"]}.

into your ~/.config/rebar3/rebar.config and it works.

Docker

Oh, and of course Docker also doesn't work properly behind such a proxy, so I did this, although there should be other solutions:

$ cat /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.local:8080"
Environment="HTTPS_PROXY=http://proxy.local:8080"
Environment="NO_PROXY=localhost,127.0.0.1,*.localstuff.example.org"

but I've not run into problems without the last line yet, as I don't use a local registry.

You also might need to tweak DNS for Docker:

$ cat /etc/docker/daemon.json
{"dns":["10.0.0.10","9.9.9.9"]}

A quick way to test is running:

$ docker run busybox nslookup example.org
git

And finally there's git, put this into ~/.gitconfig:

[http]
        proxy = http://proxy.local:8080

[https]
        proxy = http://proxy.local:8080
Python/Pip
pip install --cert=/foo/my-cert.crt PACKAGE
Rust/cargo

I've also had problem with Rust's cargo, where solution is supposed to be

[http]
proxy = "proxy.local:8080"
debug = true
cainfo = "/foo/my-cert.crt"

in e.g. ~/.config/cargo.toml (docs) but I didn't get this to work, but it is supposed to fall back to one of these:

CARGO_HTTP_PROXY
HTTPS_PROXY
https_proxy
http_proxy

and that worked, although cargo is unusually slow.

Gradle

For gradle, you need to put these lines into ~/.gradle/gradle.properties:

systemProp.http.proxyHost=proxy.local
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=proxy.local
systemProp.https.proxyPort=8080
Maven

Maven needs this in ~/.m2/settings.xml:

<settings>
  <proxies>
   <proxy>
      <id>http-proxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.local</host>
      <port>8080</port>
      <nonProxyHosts>*.localstuff.example.org|localhost|127.0.0.1</nonProxyHosts>
    </proxy>
   <proxy>
      <id>https-proxy</id>
      <active>true</active>
      <protocol>https</protocol>
      <host>proxy.local</host>
      <port>8080</port>
      <nonProxyHosts>*.localstuff.example.org|localhost|127.0.0.1</nonProxyHosts>
    </proxy>
  </proxies>
</settings>
Java

Finally, for every JVM you use you need to add the cert to the key store, if that's applicable:

For a .crt this is usually done via:

keytool -importcert -alias asdf -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -file cert.crt -noprompt

For GraalVM the path is slightly different:

keytool -importcert -alias asdf -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -file cert.crt -noprompt

And yes, none of this is breaking news, but before I have to put everything together again the next time I'd rather have a consolidated page.

Maybe I'll run into more and make this continually updated, as I had to with the default browser post.

https://f5n.org/blog/2022/development-and-proxies/
2021 in review
Show full content

These review posts have proven useful when looking up stuff, so I'll continue this tradition.

 

( 2020 / 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft - subscribed for the whole year, played a lot in the first half of the year
  • EVE Online - subscribed for the whole year, played a lot
  • Final Fantasy XIV - resubscribed for the winter
  • Horizon: Zero Dawn - it's good!
Books I've read

Finished "A Guide To The Good Life" by William B. Irvine. That's not a lot. But I've read four technical books on Erlang and OTP basically from cover to cover.

Movies I've (re-)watched
  • Kingsman: The Golden Circle - the first one was a lot better
  • The Old Guard - I liked it
  • Falling Inn Love - wanted to watch a movie with NZ accents, no idea how I came to this one, was ok
  • Scott Pilgrim vs. the World - desperately needed a rewatch
  • I Kill Giants - it was ok
  • The Claus Family - stopped after 30 minutes, I don't like it
  • Jingle Jangle: A Christmas Journey - not bad for a Christmas movie, but not my favourite
TV Series I've (re-)watched
  • Arcane - only started, but it looks really good
CDs I bought

Two bands I've actually rediscovered this year and decided to support. I saw Mono Inc. live a few years ago and only had a shirt, I remembered Metric after rewatching Scott Pilgrim, and I discovered Unleash the Archers last year.

  • Metric - Art of Doubt
  • Metric - Pagans in Vegas
  • Metric - Synthetica
  • Unleash the Archers - Abyss
  • Unleash the Archers - Apex
  • Mono Inc. - The Book of Fire
  • Mono Inc. - Welcome To Hell
  • Mono Inc. - Together Till The End
  • Mono Inc. - Terlingua
  • Mono Inc. - After The War
  • Mono Inc. - Viva Hades
  • Mono Inc. - Voices Of Doom
Other stuff I bought
  • a new 27" monitor (Dell S2721DGFA) because my 2nd one was old and wonky, it's good, 380 EUR
  • a new headset (Corsair HS35) to replace my aging one for work - I don't like it, 30 EUR
  • a new unmanaged 8-port switch for below my desk, 11 EUR

Surprisingly little for another year stuck at home, not that I'm complaining.

Social network usage
  • Twitter - no change - regularly, not overly much
  • Facebook - I actually logged in this year
  • Instagram - need to delete that account
  • Fediverse - nope
Messaging
  • IRC - daily use, default communication channel for many people I communicate with
  • Matrix - daily use
  • Email - same as usual
  • Slack - *work and 2 other communities
  • WhatsApp - still kinda unavoidable
Trips
  • other countries: half a day in Austria
  • other German states: zero
(Online) services
  • Still subscribed to Netflix, Disney+ and Amazon Prime, but I don't personally use them a lot
  • Mostly MMO subscriptions this year
Programming languages used, roughly in order of hours spent
  • C++ - work
  • Java - work
  • Erlang - work, surprisingly fun to use
  • Python - for some small stuff
  • Go - for Advent of Code, I don't like it
Podcasts I listen to

Hardly anything this year

Stuff that kinda worked out

I like my new job, that's about the only upside of this second pandemic year.

Stuff I planned to do this year but didn't
  • do more Rust
  • do more Clojure
  • read at least 3 novels this year
  • more cycling, more mountain biking
"New Year's Resolutions" aka stuff that would be nice if it would work out
  • (more) mountain biking in the summer
https://f5n.org/blog/2021/2021-in-review/
Advent of Code 2021
Show full content

This is my third time taking part in the Advent of Code, I wrote about it before:

2019/2020

This year I wanted to not just do Python again but also not invest so much time into doing Erlang or Clojure, but practice Go a bit. I will come to part later of how that turned out.

Again there will be no problem description or complete spoilers, and the code is on github.

My plan was to get up early and finish the two parts before work.

Day 1 - Sonar Sweep

Easy start, 13 + 8 minutes. Getting used to Go and doing some mistyping

Day 2 - Dive!

Parse input, calculate. 6 + 4 minutes.

Day 3 - Binary Diagnostic

The first day that took a bit longer, 37 + 15 minutes. I'm still making silly mistakes and fighting some parts of Go, but the VS Code integration is pretty nice, especially auto-gofmt on save.

Day 4 - Giant Squid

21 + 30 minutes, not sure why. It wasn't hard, just a little tedious.

Day 5 - Hydrothermal Venture

Intersecting and overlapping vectors on a grid. 25 + 15 minutes.

Day 6 - Lanternfish

This was supposed to be solved with a good trick, but I used a bad trick. Instead of decoupling the identity of the fish and just track their value, I implemented run-length encoding and if there were 11 new, I appended some [11, 8] instead of 11 times an [1,8] - it worked well enough to combat the exponential growth despite not being optimal. 11 + 18 minutes.

Day 7 - The Treachery of Whales

Some math, uneventful. 13 minutes + 3 minutes.

Day 8 - Seven Segment Search

While part 1 was still easy (15 minutes), this part 2 was the first tough one for me (2h 15 minutes). I think this is the first one where in Python I would have just used a set() and not lose my train of thought, whereas in Go I had to implement it manually with a map and a for-loop...

Rewrote in Python (65 lines) because I couldn't believe how bad the Go version looked (385 lines).

Day 9 - Smoke Basin

Ah, the first day where you need to draw a map, get the neighbors, and then in part 2 use that certain algorithm.

17 minutes + 1h 31 minutes for me, the idea was there very quickly but I think I fell into some traps when doing part 2. This should've been faster.

This was the only day where I used Python and not Go, rewrote in Go later.

Day 10 - Syntax Scoring

This is a proper parser and while it looked straightforward, I needed some time. 1h + 13 minutes, so part 1 had already solved most of part 2.

Day 11 - Dumbo Octopus

I think this is the day where I curse every language where I can't just extend an array into the negative and so this was riddled by off by one errors and some other things. 2.5h + 7 minutes.

Day 12 - Passage Pathing

Ah, well-known algorithm solution number 2. I had learned my lessons in one of the preceding years and thus it took 70 + 60 minutes and not ages.

Day 13 - Transparent Origami

This was a fun one, you can either bruteforce it or apply some math. I originally did the dumb version, which took 62 + 34 minutes. When I rewrote it in Clojure, I used the math version but this only worked for p2 until I fixed it to be a general solution that would also solve p1.

Here's a nice blog post (not mine of course) that's kinda related to the solution I took, but not 100%.

Day 14 - Extended Polymerization

Flashbacks to the 2019 or 2020 version of this, which I absolutely hated. This time it went better, with 30 minutes + 2h.

Day 15 - Chiton

Ah, the first pathfinding puzzle of the year. Another one where I learned my lesson in the past and just had to remember, adapt, and not make errors. 2h 49 minutes + 30 minutes say that I didn't really do a good job though.

Day 16 - Packet Decoder

Another parser, which I totally messed up at first. This was a day where Go really got in my way, but I can't blame the language here, but my lack of familiarity. (On other days I totally blame the language where I made some stupid error when writing 5-10 lines of code which would've been a standard library use and thus error free in another language). 3h 30 + 15 minutes, because my elaborate part 1 was really easy to extend for part 2.

Day 17 - Trick Shot

Reminds me of one puzzle in 2019 that was very similar. The basic calculation of the trajectory was quite easy, also hitting the target. The real problem was brute-forcing the correct answer for p1. p2 was then again was putting another loop around it looking for the hits. 2h 49 min + 30 minutes.

Again I could not believe how long my Go code was (243 lines), so I tried to shorten it (95 lines) and then I had some time left in the evening and went for a little code golf in Python and managed to get it down to just 32 lines.

Repo

Day 18 - Snailfish

This was a weekend puzzle where I had the correct idea and also a good first throw at an implementation, but here an error, there an error, and in the end I spent the whole day working on part 1. Part 2 then was a quick 15 minutes. It was still quite fun, but this should've been a 2-3h solution and not me messing up the details.

Day 19 - Beacon Scanner

Another weekend puzzle where I thought I was progressing ok and then at some point felt close enough to the solution but still not having it that I looked at someone else's example code and got my solution working. 12h + 7 minutes.

Day 20 - Trench Map

Again a map and neighbors, but this time with a twist. This felt really easy, 46 minutes + 32 minutes.

Day 21 - Dirac Dice

This is one where I misunderstood a part of the problem, as I thought it will end "as soon as someone wins a game, [in one of the realities]" versus the actual "in all realities". One native speaker did an "oh, yes" when I said that so either it was not 100% clearly written or it is the lack of English on my part. Anyway, 78 minutes for part1 and no idea about part2, also this is one where I cheated.

Day 22 - Reactor Reboot

Part 1 was easy, 66 minutes and then... I looked at part 2 and it looked tedious enough that I simply didn't feel like solving it. I guess this is where I finally noticed (and accepted) how much time I had sunk in and now the fun was gone. Did not complete part2, although I looked at it for a bit again in the evening, then said screw it.

Day 23 - Amphipod

Oh yeah, a towers of Hanoi path-finding again. I looked at it for a bit in the morning but as the day before, felt zero drive to implement it. Nope.

Day 24 - Arithmetic Logic Unit

I coded up the ALU (this was quick and fun), then I noticed that I'd probably read the input by hand and deduce some sort of solution. Also I went out and away from the computer for most of the day, so I never continued working on it.

Day 25 - Sea Cucumber

Map and neighbors again, I had the example working pretty quickly but again Go got in my way and my solution had just a little error, but I ran out of time, went to have lunch and in the end I think it took 2h, of which I could've saved about one by just being able to copy a 2-dimensional array without problems.

Completion
  • total stars: 44 / 49
  • two stars: Days 1-21
  • one star: Days 22, 25
  • zero stars: Days 23, 24
Languages
  • Go: Days 1-22, 25
  • Clojure: Days 1-3, 6, 7, 13, 20 = 7 days
  • Python: Days 8, 9, 17
Open TODOs
  • rewrite some more solutions in Clojure
  • maybe do some Erlang again, or finish 2020 which I started doing in Erlang
Non-TODOs
  • not sure if I will do Day 22.2, 23, and 24
The end

So, this year was a bit different. I didn't try anything fancy like in 2019, but I also didn't take the real easy way of just using a language I can work with really well, but used a language I have used in the past and wanted to brush up again. What I learned from this is that I do not like Go at all and nothing has convinced me that this will change. I didn't like it back when I used it for work and I don't like using it now, but I accept that it is really good for some things. Currently I don't need these things, so that was it.

I had A LOT of fun for the first 17 days and even when spending basically my whole weekend on Day 18 + 19 I was still in high spirits, but on Day 22 it was simply enough for me for this year. Maybe it would've been better if I had switched to a different language on the weekend, probably not.

I am still very happy I participated again and as usual a huge shoutout to #lobsters-advent (on Libera.chat now) for discussions, providing moral support, and enjoying Advent of Code together again.

Thanks to Eric (and the team) for giving us this plethora of puzzles every year. I think the difficulty level is fine overall, but as I imagine it is a hard choice to make as there are so many different people wanting to participate. So I guess I can only sum up my thoughts as someone who has reached 44-45 stars three years in a row now with the times provided...

Getting it completed without actual cheating is really hard. Just trying on your own and maybe asking people for clarification or some intermediate output is sometimes helpful, but I would prefer it to be solvable in 1-2h every day. I know there are speedcoders who do it in 5 minutes, and there are others who might also do it in a new language in 10 - but I am not that. I am also not immensely letdown for not finishing, but it sucks a bit that there are always a few days where you either don't have that hour or it is simply so hard that you would have needed a lot longer. Or maybe my goal of "complete it before 24h are up" and not catch up later is a bad idea anyway, for my skill level.

Additional resources Appendix 1: Personal stats
      --------Part 1--------   --------Part 2--------
Day       Time   Rank  Score       Time   Rank  Score
 25   07:30:50   6689      0          -      -      -
 22   03:30:56   6778      0          -      -      -
 21   03:58:23   9197      0   12:29:13   9647      0
 20   03:30:19   5301      0   04:02:53   5513      0
 19   17:43:12   7249      0   17:54:06   6997      0
 18   18:44:24  11948      0   18:59:16  11788      0
 17   02:02:34   6181      0   02:09:43   5380      0
 16   05:00:15   7884      0   06:23:10   7862      0
 15   02:49:25   7915      0   03:53:28   6774      0
 14   02:42:59  13283      0   08:55:03  17095      0
 13   01:14:31   7329      0   01:48:31   7901      0
 12   09:03:28  20148      0   10:03:05  18989      0
 11   06:07:33  17138      0   06:14:46  16908      0
 10   01:15:29  10092      0   01:28:13   9243      0
  9   00:17:30   4028      0   01:48:26   7940      0
  8   00:14:15   3679      0   05:58:48  15476      0
  7   02:08:01  17771      0   02:10:55  16212      0
  6   02:33:39  17741      0   02:51:49  13792      0
  5   03:05:07  13360      0   03:20:49  11974      0
  4   04:38:56  16930      0   04:53:50  15440      0
  3   02:52:48  26054      0   04:27:29  21760      0
  2   01:29:10  18211      0   01:32:56  17156      0
  1   01:38:46  12994      0   01:46:56  11727      0

Again I will repeat that I'd love to have a personal board with times between "accessing the puzzle/input page for the first time" and submission. This will not catch cheaters who have two accounts or look at the puzzle with someone else, but for most of us it would alleviate having to track our completion times manually every single day, and I think this is the majority, who won't get up at 6 am (for Central Europe) or whatever. If you look at my stats, I actually did get up at 6 or 7 a few times because I wanted to be done before work.

https://f5n.org/blog/2021/advent-of-code-2021/
Website updates
Show full content

For no particular reason I finally started fixing a few things that had annoyed me on this website on the weekend, but postponed putting it all live because I ran out of time.

Back in 2013 when I moved to Foundation as a CSS framework I was lazy and just used their minified version. The problem is that it's 161.17kb unzipped and I guess I was using like 10% or less of the features, but loading the index page of this website was ~180kb and 160 of those was just the CSS framework.

So I just took the minified blob (because there's no way I can reasonably get the exact unminified version I copied, years ago) and then I grepped through my templates and looked which classes I am actually using. Then I went to town and just copied everything that seemed important out. Seems like I can live with 10-12 of those 160 kb. The only bug I'm currently seeing are some line-height shenanigans when the window is narrow.

I guess the endgame would be to look for a CSS framework that only does a grid in the way foundation does it, that was the only feature why I was pulling it in in the first place. On the upside, not many visitors means not a lot of bandwidth wasted. Maybe Pagespeed will now complain less though.

Anyway, it was a good opportunity to fix some CSS things as well, like the display of code snippets and handling of long blog post titles. And all the weird margins and empty spaces, although my patience is limited with those.

Also the Favicon situation seems to be even worse than 10 years ago, so there were a few tweaks.

Then I also took the liberty of updating a few pages:

  • The Stack finally talks about it having ended in 2018, because I don't think I'll revive it anytime soon
  • About got an update after 3 years and a partial rewrite

So what's left is to put up a TODO, with no time frame to actually do them:

  • completely replace foundation with some minimal grid CSS
  • remove all "reset" css functionality and fix my CSS to still look ok
  • maybe add a syntax highlighter for the code snippets
  • see if my static site generator still works and replace hugo
  • change the font, or at least the fallback font

After completely forgetting that this website (and mostly the blog) had its tenth birthday this summer (which isn't a great milestone anyway, because I used its predecessor blog from October 2004 until after this one launched and that wasn't even my first one) maybe it's time to modernize a few things.

https://f5n.org/blog/2021/website-update/
Small everyday hacks
Show full content

Last night a friend asked for help. Due to Covid their sports club added some weird registration feature to their website, apparently reusing the event workflow of their CMS. The idea is ok, but the implementation is lacking.

If they go to train three times a week, they have to fill out the same form with ~13 fields in the same way, three times per week. So I was asked if that couldn't be automated. Filling out the form, that is, not navigating to the correct page, which only takes a few clicks and the URL changes all the time, anyway.

I've not done proper frontend stuff in a while, so I guess there's some replacement for it, but my first idea was Selenium. A bit overblown, but it should solve the problem. But how would it run, on a Windows PC? Too complicated, but shouldn't a bookmarklet also work?

This is what I came up with in 10 minutes:

javascript:{
document.querySelectorAll("[name=salutation]")[0].value="Mr";
document.querySelectorAll("[name=firstname]")[0].value="Firstname";
document.querySelectorAll("[name=lastname]")[0].value="Lastname";
document.querySelectorAll("[name=street]")[0].value="Street 23";
// ...
void(0)}

"Take this, fill out your details, strip the linebreaks, create any new bookmark, edit the bookmark, and replace the URL with this monstrosity."

It seems to work and while I'm not sure it will save a lot of time (unless autocomplete didn't work on the page, the customer is happy and I'm glad I could help.

This is one of these rare? "everyone should be able to code a little bit" occasions, I guess. But searching for the right words and function call in JS took longer than firing up a dev console and analyzing the form. So maybe the knowledge of what's possible is indeed more valuable than remembering syntax of a language you hardly use. Also not sure how often people use bookmarklets.

I guess the semantically correct version would've been

document.querySelector('input[name=firstname]').value

(which also saves 3 characters per line), but it was late and I settled for the first working solution.

This also works for the example page at hand:

document.querySelector('[name=firstname]').value

But if we're going to code golf anyway:

javascript:{
var d=document;
var q=querySelector;
var n='[name=';
d[q](n+"salutation]").value="Mr";
d[q](n+"firstname]").value="Firstname";
d[q](n+"lastname]").value="Lastname";
d[q](n+"street]").value="Street 23";
// ...
void(0)}

With the stripped example lines readded, that would be 546 vs 870 characters.

If it wasn't JS, I might actually feel bad about that version, but I can just call it minified now.

https://f5n.org/blog/2021/small-everyday-hacks/
The Old Computer Challenge, Part 2
Show full content

While I didn't take part in the Old Computer Challenge I wrote about last week, I did play around with the laptop a bit since then.

First of all, here's a screenshot:

ratpoison on nx7010

I didn't take the time to properly configure my terminals to start with a black background at the start, but later I did.

Only after this screenshot I noticed that something seems off and xrandr told me that I'm running with 1280x1024, and not the display's native 1680x1050 resolution, which you don't really notice if you only have shells open. Not sure I can fix that with the graphics driver issues...

Also for some this reason wifi via the iwi driver didn't seem to work at first, networking via cable was instantly fine, as expected. But of course I have a cat5 cable near my sofa in the office...

On a second try it did actually work with my mobile phone's hotspot and then also with my normal AP, but seemingly not via /etc/hostname.iwi0 and sh /etc/netstart, but only when doing:

ifconfig iwi0 down
ifconfig iwi0 nwid my_ssid wpakey my_key
ifconfig iwi0 up
ifconfig iwi0 scan

In the end I'm back to cable because something was still slighly wrong, even though I got route show to look more correct, but I wasn't in the mood to fix this now. I think wifi can be filed under: it works.

Not sure I was ever going to be happy with the ratpoison keybindings. But Ctrl-t on this keyboard could get painful after a while (pinky + index), whereas my usual win-1 to win-0(thumb + ring/middle/index) feels a lot better. Also the spacebar on this laptop isn't great, I keep on missing spaces when I type.

Also no idea why I had thought that i3 was using a lot more RAM, maybe that was my weird bug on Ubuntu last year, when I switched it was under 5MB used.

So here's a new screenshot:

i3 on nx7010

The browser situation is still a little unclear, I tried netsurf and dillo, but I am not happy. Guess I need to install firefox after all and see how it goes. [time passes] The results are in and they are not great. Loaded up a YouTube video and got 2 ads, had some stutter, then during the 2nd ad the tab crashed. Reloaded, music played fine then. CPU was working and Firefox with one tab open already drew a lot of RAM. Closing the tab and opening my website did not improve RAM usage in a meaningful way. Then I tried seamonkey, this seemed to be a little better.

I tried youtube-dl and mpv and that used less CPU, so I think that's a workable solution, at least for certain things. The official youtube-dl didn't work out of the box (even after installing python3), but the one from the ports did. Again, thank you, OpenBSD.

Every page I visited in Seamonkey seemed fine, only Element (the Matrix web client) wouldn't accept this browser.

Didn't try to read mail, but I've used mutt in the past, so I would probably try that (for a week). [time passes] Ok, I tried it. IMAP works fine, but this version of mutt seems to be compiled without SASL, so I can't send mail via this mail server I tried. also it's not compiled with DEBUG so I gave up troubleshooting very quickly.

irssi works fine, weechat would be fine, although I prefer Quassel.

I think one of the main problems is actually trying to use OpenBSD (where not all software I use is available), at the same time trying a different window manager, and then the slow hardware - but I think the latter is the least of my problems, if I can keep my 1.5GB of RAM, that is.

Using a Linux distro I know very well (Debian for example) would've made some things a little easier, I guess. But that doesn't mean I had any major difficulty with OpenBSD, despite only ever using it on servers or on this old notebook, and I didn't use it enough to run into any real road blocks in daily usage.

But during the week I took some notes of stuff I was using to at least guess how this would work out:

  • Matrix - could use on phone, not sure it's fun to type a lot there
  • WhatsApp Web - pure convenience, could use on phone, not typing a lot
  • IRC - no problem
  • Slack - I guess this is a problem and I'm not willing to use it on the phone
  • Discord - Same as Slack, really, but I could easily not use it for a week
  • all other websites - should be no problem if I have Firefox
  • music - only via YouTube this week, but I surely could access some local MP3s as I usually do
  • keepass/keepassxc - available via pkg_add, I just didn't search properly

So yes, it mostly boils down to the fact that a major World of Warcraft patch went live a while ago and that I am spending a good chunk of my spare time with that at the moment. So I need a computer to run WoW and Discord on. And some additional resources in the form of (modern) websites and YouTube videos, but the latter two could be solved.

The only coding I did outside work this week was in rust, and the files sat on my linux server, where I also compiled them. I used Visual Studio Code with the excellent remote support to work from Windows via ssh, but I could've done it with vim, as I did in the past.

Many of the typical use cases that other people mentioned are completely foreign to me.

Despite writing lists about windows software in the past, there's nothing really innate to working on Windows, actually a lot of the stuff is trivial on Linux or BSD and only needs a special Windows solution.

I do have a couple of spreadsheets in Google Docs, usually when there are too many columns to use tabs in a text file (I use a lot of text file), but I hardly ever fire up LibreOffice on my personal machines, maybe a few times per year, and that has never been different.

OK, that's enough of a wall of text. It was a fun experiment, but I'm not sure I would've wanted to do this for a full week. Most things except the modern web seemed to work just fine. I would have needed to use webmail or compile my own version of mutt. I would have had to use irssi over Quassel, and a few other small things, but overall it's probably doable (with enough RAM) and probably even easier with Linux.

But this challenge has shown me that you should be able to live with something like a dual-core 2GHz CPU with 2 or 4 GB RAM, which probably means a CPU from around 2009, think Allendale or Wolfdale, that's still 12 years old.

But my 1.7 GHz Pentium M (I think it's a Dothan) is a bit slow for YouTube and modern web apps.

https://f5n.org/blog/2021/old-computer-challenge-part-2/
The Old Computer Challenge and OpenBSD 6.9
Show full content

When I read The Old Computer Challenge I knew this wasn't really for me.

I'm not doing a lot of personal programming at the moment, and the things I do actually work a lot better (or at all) on a machine that's not 15-20 years old.

Yes, I admit it, it's mostly playing games that were released when 512 MB RAM weren't the norm any more, or using YouTube (which eats a lot of CPU, I tried it).

But I found the idea interesting nevertheless, and I do have an old laptop here, my first one, actually.

It's a hp compaq nx7010 that I bought in 2004 for university, it has a nice widescreen 15,4" screen with 1680x1050 resolution (ATI Radeon Mobility 9200/ATI Radeon Mobility M9), a 1.5 GHz single-core Centrino CPU, and was upgraded to 1.5GB of RAM. And it was really expensive, but I used it for at least 6 years as my main laptop, and I think I really only stashed it away in 2013 when I got my work x230 that I could also use for private stuff.

I had installed OpenBSD 6.2 at some point in 2017, when it was the latest version and since then I hadn't done a lot. I booted it once in a while, I think I even committed an OpenBSD-only bugfix for i3-statusbar or something, and that was that.

But I wanted to update the OS for a while already and now this was the perfect opportunity. So in my lunch break I downloaded the latest 6.9 install image and ran with it.

Unfortunately some things weren't working out of the box, so I had to stop and wait until work was over, but I think it's good enough for now.

So here's a little guide to running OpenBSD on a very old laptop.

I've actually typed up most of this post on the laptop, in vim, although the file is sitting on another computer - but I'm using xterm on ratpoisonon OpenBSD. Yes, I do prefer i3, but I won't bother to even change the keybindings, ratpoison seems reallyok out of the box, just ctrl-t is a bit weird. And netsurf seems fine to check how this post looks as a finished html page, haven't tried some real web surfing.

The install instructions

Download the install image file, install69.img from https://www.openbsd.org/faq/faq4.html and write to a USB stick:

# dd if=install*.img of=/dev/rsd6c bs=1M

The OpenBSD installation itself is pretty uneventful, just go with the defaults, wired networking via DHCP worked fine. WiFi didn't work out of the box, but I may as well just have fat-fingered something. The interface was up but it didn't connect. Or maybe the wifi is too new for this card...

I ran with the defaults for partitioning and everything.

But then it got interesting:

Notice that as soon as the kernel has booted you only have a blank screen, search the web. find a fix.

Temporarily disable radeondrm:

boot> boot -c
UKC> disable radeondrm
UKC> quit

or do it permanently (on revisiting it seems I copy/pasted this wrong):

# config -ef /bsd
UKC> disable radeondrm
UKC> quit

Edit 2026-02: All that seems to still work, I did this:

echo 'disable radeondrm' >> /etc/bsd.re-config
config -e -c /etc/bsd.re-config -f /bsd
reboot
Some configuration

OpenBSD recommends doas over sudo, so when in Rome, do as the Romans do:

# enable doas for group wheel
echo "permit :wheel" > /etc/doas.conf
# check config
doas -C /etc/doas.conf

Now it's time to see how outdated the install medium was and do an upgrade:

syspatch -c
syspatch

Then notice that something with KARL didn't work:

# it tells me to run this
/usr/libexec/reorder_kernel

It didn't help, but in the log file there are some steps I should do, those do work.

But still, X won't start.

I learn that startx is deprecated, and I should do:

rcctl enable xenodm
rcctl start xenodm

Sadly it didn't change anything, but the fix is actually easy if you RTFM correctly:

echo machdep.allowaperture=2 >> /etc/sysctl.conf
reboot

(thank you, helpful people of r/openbsd)

So now I can finally log in to a graphical interface and am greeted by the horrible, horrible fvwm2.

After 5 minutes of trying and not liking cwm and deciding that i3 is too resource heave for this, I want to try ratpoison.

pkg_add ratpoison

Then simply edit the $HOME/.xsession and restart X:

xsetroot -solid rebeccapurple &
xterm -bg black -fg white +sb &
ratpoison

Finally install a few applications I will or might need:

pkg_add git zsh tmux vim irssi mutt netsurf htop
https://f5n.org/blog/2021/old-computer-challenge-openbsd/
Dell Latitude 5310
Show full content

I started a new job in February and with it came a new work computer, it's a Dell Latitude 5310 with an i5-10310U, 16GB of RAM, and a 256 GB SSD. I also got a USB-C docking station. It's the first non-ThinkPad I've been using for any serious amount of time since 2010, I think (W500, x230, T460p, T470p).

On my first day they handed me an XUbuntu 20.04 usb stick and that's probably what I would've chosen anyway, given the fact that Ubuntu was recommended. Installation worked flawlessly and all the hardware seems to work fine.

I didn't use it without an external keyboard, mouse, and monitors a lot, so can't really comment on the mobile aspect, but the one time I used it off the grid I missed the trackpoint dearly, but I've never really been a fan of touchpads since my first laptop in 2004 (good old HP nx7010) and when I used it at uni I always brought a mouse if I had enough room.

Overall I'd say as a non-mobile work computer it seems fine.

  • Have not yet exhausted the 16GB of RAM, unlike at my last job
  • CPU wasn't a limiting factor yet, but I'm doing Java and not compiling C++ all day
  • the screen looks good
  • the camera quality is decent, I'd say much better than the T470p's
  • I'm actually surprised how thin and light it is

There are some problems though:

  • some coil whine - worst when scrolling in IntelliJ, and only there
  • need to manually set audio in/out after every plugging in, sometimes after resume
  • on some days I need to replug both monitors after resume
  • if it is on 100% CPU, you can hear the fans
  • the ethernet port is one of those weird ones you have to pry open like a drawer

So coil whine and a wonky docking station (K20A001), the rest is not really worth mentioning.

Like on my last work computer I went with Regolith via PPA, so I have a fully functioning i3 window manager and still some nice desktop environment features. Wrote about it in summer 2019 and now all the problems I had were all solved, I don't think I noticed a single one in nearly one month of usage now.

This is the first time I did not try to get rid of network manager but am actually using the VPN integration as well.

Also for technical reasons I need to participate in 1-2 actuall phone conference calls per week instead of just Slack/Zoom/whatever and so I'm using a SIP client for the first time. I went with the Linphone version that is packaged in Ubuntu (3.x), it's very bare-bones and the setup wizard has a bug but you can work around that and inputt your details manually. I connected it to my fritz-box and chose the 2nd phone number we don't actively use. I've been getting a few calls from unknown callers now (the number was actively muted before I started using this sip client), so I think I need to tweak a few things there, but overall it's so much better on the computer.

I started with this guide in German but then had to tweak some things.

; Linphone
sip identity: sip:user@192.168.0.1
sip proxy address: sip:192.168.0.1
transport udp
"resulting sip address": "User" [sip:user@192.168.0.155]
SIP/UDP port 5061
SIP/TCP port 5061
Audio RTP/UDP: 7078
Video RTP/UDP: 9078
[x] Direct connection to the internet

; FRITZ!Box Port forward 5061/udp to the computer with the sip client

I probably should've gone with installing version 4 from somewhere else than apt but it works now.

Also this time I wanted to separate all (well, most) private stuff from the work computer. I actually already have an Xubuntu Desktop VM running on my home server, and I can connect to it via libvirt over ssh and it's lagfree enough that I can have a browser for Amazon or an IRC client running there. Still can checkout and push to personal git repos from the work computer (dotfiles, etc) but the browsers are not littered with personal logins (again, with a few exceptions, of course), which is really nice so far.

So I wouldn't go as far as recommending the Latitude 5310, but overall I'm happy with it, I guess. Sadly I have no recent experience with thinkpads in docking stations (I think I had one in 2010?), so maybe these monitor problems are more universal. Looking around for a very brief time it seems to cost around 1200 EUR. If I'm not mistaken the specs roughly match the ThinkPad X1 Carbon, which is roughly 1800 in a similar configuration (CPU, RAM, 512 GB SSD, so maybe -100 EUR). On the other hand the current X13 is roughly the same price, and the T14 with a bigger screen is ~1700, whereas there seems to be no more T14p model, only a T14s, and I heard those had some performance/cooling problems in the past. I probably would've chosen a ThinkPad E15 Gen 2 with Ryzen 7 4700U with a 512GB SSD and a 15.6" display in the ~1k EUR range, it should be bit faster, a bit cheaper and after having a Ryzen workstation I'd be confident enough to put my own money on it.

Still a bit surprised I got handed a small 13" laptop when 90% of the time it will be sitting on my desk and plugged in to external peripherals, so I would've preferred a 15", but I guess being able to choose your hardware becomes less likely the bigger your company is. Or at all. At least this time it doesn't seem to be completely unfit to do the job, because that last T470p with an i5 with only 4 threads and 16GB reached its limit already in the first week when I tried to compile LLVM...

https://f5n.org/blog/2021/dell-latitude-5130/
2020 in review
Show full content

These review posts have proven incredibly useful when looking up stuff, so I'll continue this tradition.

 

( 2019 / 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft - subscribed the whole year, played quite a bit
  • EVE Online - subscribed for ~9 months, played a lot
  • Borderlands 3 - had started in 2019, was still playing at the start of the year
Books I've read

Zero novels and one technical book ("Database Internals" by Alex Petrov). An alarming trend continues.

I started with both "Laika's Window" by Kurt Caswell and "A Guide To The Good Life" by William B. Irvine though.

Movies I've (re-)watched
  • Rise of the Guardians - discussions about whether this is a Christmas movie aside, it was very funny
  • Spider-Man: Into the Spider-Verse - the best Spider-Man movie, one of the best Marvel movies
TV Series I've (re-)watched
  • Dr. Oakley - Yukon Vet on Disney+ - no idea why, but I really liked it
  • Encore on Disney+ - stopped after 2-3 episodes
  • The Mandalorian on Disney+ - *it's Star Wars and I didn't like it. Weird.
CDs I bought
  • Nightwish - Human II Nature
  • Nightwish - Endless Forms Most Beautiful
  • Sabaton - The Last Stand
  • Sabaton - The Great War
Other stuff I bought
  • moto X4 64 GB - my Nexus 5X died, so I needed a phone. 190 EUR and completely happy after 10 months
  • a Geforce RTX 3070
Social network usage
  • Twitter - no change - regularly, not overly much
  • Facebook - not sure I logged in even once this year
  • Instagram - not sure I logged in even once this year
  • Fediverse - back for a short stint, mostly not
Messaging
  • IRC - daily use, default communication channel for many people I communicate with
  • Matrix - daily use
  • MS Teams - work stuff
  • Email - same as usual
  • Slack - using two communities, sparingly, but one is a different one than last year
  • WhatsApp - kinda unavoidable
Trips
  • other countries: zero
  • other German states: zero
  • one actual holiday trip, cycling in the summer
  • one trip for a family birthday party, under protest
(Online) services
  • Still subscribed to Netflix, Disney+ and Amazon Prime, but I don't personally use them a lot
  • Mostly MMO subscriptions this year
Programming languages used, roughly in order of hours spent
  • C++ - work, I came to terms with the fact that it won't be my favorite language
  • Python for AoC and other small stuff
  • bash - still too much
  • PHP - just a little, for one private project
Podcasts I listen to

Very irregular this year:

  • ATP - I'm not using any Apple products and still listen to these guys sometimes.
  • some real gaming podcasts, but even less regularly
Stuff that kinda worked out
  • I don't have a real podcast downloader (yet), but I have something like trakt but for podcasts (mentioned last year)
  • be able to read cyrillic letters fluently and practice enough to memorize them (mentioned last year)
  • not going bonkers while confined to the apartment for most of the year
Stuff I planned to do this year but didn't
  • more blog posts
  • do more Rust
  • do more Clojure
  • "focus on one or two languages for hobby stuff" - focused on zero languages, only wrote very little (C++, Python, PHP)
  • read at least 3 novels this year
  • more cycling, more mountain biking - the former fell flat because of perma-WFH and no motivation, the latter because of the pandemic
  • watch Hamilton
"New Year's Resolutions" aka stuff that would be nice if it would work out
  • starting a new job in February, so of course I hope it will be a good gig
  • (more) mountain biking in the summer
https://f5n.org/blog/2020/2020-in-review/
Why does it have to be so complicated?
Show full content

After I wrote my post about Advent of Code 2020 yesterday I wanted to put it live, of course. I thought my setup of a static site generator couldn't be so complicated, right? I was running this on a machine where I hadn't run it before.

So I have a Makefile.

make reserve
# sass not found

Oh right, let's download sass and put it in the PATH. At least this doesn't have any dependencies.

make reserve
# file 'themes/.../xyz.sass' not found

Oh right, let's actually clone our theme. Why did I not put this as a git submodule? No one knows.

make reserve
# cssmin not found

Oh right, I didn't install this. It's my own, so I know how to build it.

git clone https://github.com/winks/cssmin-go
cd cssmin-go
go get ...
# go not found

Yeah, well, I don't usually use go a lot these days...

ll /usr/local/go
/usr/local/go/bin/go version
# go version go1.13.7 linux/amd64

Whatever, this will do.

go build
cp cssmin-go ~/bin/cssmin

Let's go!

make reserve
# hugo not found

Oh right, the static site generator itself. Which version did I need again?

Looking at the commits in the theme I apparently upgraded to 0.59.1 in November 2019, whereas the README of this repo still tells me 0.13 (from 2011).

So yeah, 10 minutes later everything was up and running but it's fascinating that every single step failed, except the actual generation at the end. Maybe I should've tried nextgen, but I would've had to build it with rust first, as well...

https://f5n.org/blog/2020/why-so-complicated/
Advent of Code 2020
Show full content

This is my second time taking part in the Advent of Code, I also wrote about it last year.

Using 20 languages was fun, but I didn't want to spend all my spare time on AoC again so I settled on one language, Python.

Again there will be no problem description or complete spoilers, and the code is on github.

Day 1 - Report Repair

This shouldn't be too hard but I added a tiny bug which I couldn't for the life of me find, so I hacked up a bash one liner to solve it. Part 2 takes 516ms to run, so maybe I should add some memoization.

Day 2 - Password Philosophy

I accidentally solved part 2 first by not reading the instructions properly, so part 1 took a little longer and part 2 was done very quick.

Day 3 - Toboggan Trajectory

Don't think I can say much, but it's the first one this year that uses a "map" with coordinates. Parsing to an y/x-array doesn't twist my mind, so I usually go the easy route here.

Day 4 - Passport Processing

This one was unnecessarily tedious. A lot of fields to validate and no real meat to the problem, half of the fields would've been fine. Someone had solved it correctly and hadn't noticed a typo which made it fail. My superpower of instantly seeing this at a glance proved useful again. I still would prefer to write bug-free code over typo-free code that easily...

Day 5 - Binary Boarding

This was fun and I didn't "get" the easy solution, but my brutish attempt yielded the correct solution anyway.

Day 6 - Custom Customs

For some reason I found this part 2 a little tricky. (10 + 50 mins)

Day 7 - Handy Haversacks

Flashbacks to last year's day 14 but it was either easier or I simply didn't make the same mistakes. (35 + 55 mins)

Day 8 - Handheld Halting

People on Reddit were assuming (or fearing) this would be intcode all over again but it was quick and easy and a single occurrence. (22 + 50 mins)

Day 9 - Encoding Error

I don't remember much, but it was quick. (7 + 10 mins)

Day 10 - Adapter Array

Didn't particularly like this one, and I was pretty sure my part 2 was mostly correct, but I asked someone for help and my solution was indeed 90% correct. (18 + 45 mins)

Day 11 - Seating System

Not sure what I messed up, but I did mess up something, so this took a while. My part 2 solution runs for 4 minutes, so needs some optimization. (54 + ~120 mins)

Day 12 - Rain Risk

Playing around with coordinates, this was fun. I was slower than I had hoped though. (25 + 34 mins)

Day 13 - Shuttle Search

Part 1 was really quick, but I spent ages on part 2. When I was relatively confident that my solution was correct but unbearably slow, someone on #lobsters-advent offered help and calculated my input to give me a rough estimate where to start my search, and then it "only" ran for 16s instead of probably 16h. Needs some work. (11 mins + 6h)

Day 14 - Docking Data

This is the first day I did not complete, part 1 took like 39 minutes but I didn't have time that evening and couldn't extend my lunchbreak either, so I never tried part 2.

Day 15 - Rambunctious Recitation

The description text on this one confused me multiple times, it wasn't the problem so much that was hard, but extracting the specs was. Completion time seems to be 95 minutes and 16 minutes. Maybe there is a trick to part 2, because mine takes 60s to run.

Day 16 - Ticket Translation

Part 1 seemed relatively easy again (33 minutes) but I think part 2 took a little longer, unfortunately I didn't take the time on that one.

Day 17 - Conway Cubes

Oh, Game of Life again. Reading my IRC backlog, I was not happy or impressed and decided to only do this after work, not in the morning. I didn't take note how long part 1 took, but part 2 took about 55 minutes, so I guess part 1 also took between 30 and 60 minutes. Execution times for these are slow (2s and 96s), so I want to revisit this with one optimization I have in mind.

Day 18 - Operation Order

I think the correct solution would be to build a proper parser but I wasn't in the mood for fiddling around with that so I solved it with regex. Still took a while because I made a few silly mistakes. Part 2 took one hour.

Day 19 - Monster Messages

Part 1 was fun, I wrote a regex compiler. Didn't attempt part 2 due to time constraints again. Unfortunately my solution is a bit slow (50ms incl. python startup) whereas most other days only take 25-35ms.

Day 20 - Jurassic Jigsaw

This was a lot more annoying and tedious than I had thought at first. Took me quite a while to solve. My ideas for part 1 weren't completely off, but I guess I was inspired a little by skimming the IRC backlog. I'd still say I solved it on my own for the most part. Then I spent quite a while trying part 2 but my head wasn't agreeing on thinking that day, so I didn't finish it.

Day 21 - Allergen Assessment

This took a while because I wasn't using sets. But part 2 only took 7 minutes then because I started to clean up what I had instead of reading part 2. Should've been less than 3 I guess...

Day 22 - Crab Combat

Part 1 was really easy, 8 minutes. But then I looked at part 2 and decided to not waste time on this.

Day 23 - Crab Cups

I took a few detours but finished part 1 in 72 minutes. Then in the evening I had an idea for part 2 but wasted hours failing to implement it. I still think my idea is mostly correct, but I need to revisit this.

Day 24 - Lobby Layout

Because of a stupid parsing bug that I discovered too late part 1 took 66 minutes, and because of some bad experience with dicts in python I went the very slow but safe route and thus my part 2 takes 15 seconds to finish. Need to revisit this and try one optimization trick. Or maybe: remove my pessimization "trick". Solving part 2 took 52 minutes.

Day 25 - Combo Breaker

Oh boy, that day was the first time in 50 days I was actively mad at the puzzle author. Apparently there were two things that came together: I didn't read (or understand) the puzzle correctly and so I thought I needed to find the subject number and the given was just an example.

That wouldn't have been so bad because my solution accounted for that (just a loop around everything, slow but correct) - but the second thing was that this puzzle was probably supposed to be "bruteforced" to a certain degree, and so I simply stopped my running generic solution several times because it took too long to run.

Once I had glanced at a solution because I was annoyed enough I saw that mine was actually correct, so I plugged in the known subject number and let it run for 15 seconds and had my correct result.

So yes, of course it's my own fault, but my algorithm was correct in the first place and I wasted a lot of time, only because I didn't want to look at others' solution. Can't measure time, but had I read it correctly, definitely below 1 hour. Also from what I read I was far from the only problem misunderstanding the given number as an example and bruteforcing this one as well, as it's really doable on moderately fast hardware.

Open TODOs
  • Try to get the missing stars
  • I really want to speed up a few of my solutions
  • I might try redoing all of them in a second language
The end

Another year wrapped up, I had a lot of fun again. It was easier than last year, but I am super happy I didn't have to spend so much time on getting to roughly the same result, i.e. 90% completion.

Again, many thanks to the people in #lobsters-advent on Freenode, we had interesting discussions, helped some, got help by some and overall had a pretty fun time there, I think.

A few things I noticed, in no particular order:

  • This was easier than last year, but not completely easy
  • I still make a lot of stupid mistakes
  • The examples are tremendously helpful
  • I don't think I'll ever be a really fast competitive coder
  • Some problems were SO MUCH easier because I did last year's puzzles
  • Python is kinda good for this
Appendix 1 - My scores
      --------Part 1--------   --------Part 2--------
Day       Time   Rank  Score       Time   Rank  Score
 25   16:38:16  10815      0          -      -      -
 24   04:49:01   6304      0   05:43:24   5673      0
 23   04:32:43   5932      0          -      -      -
 22   04:41:07   8298      0          -      -      -
 21   10:21:08   8603      0   10:28:39   8306      0
 20   12:58:27   9174      0          -      -      -
 19   07:07:14   7068      0          -      -      -
 18   06:02:02   9832      0   07:07:41   8782      0
 17   10:11:06  12078      0   11:05:30  11791      0
 16   03:42:55  10456      0   09:33:01  11968      0
 15   04:45:21  13157      0   05:01:59  11581      0
 14   05:23:19  13112      0          -      -      -
 13   05:33:38  16323      0   18:58:52  20144      0
 12   03:24:47  10414      0   03:57:55   9099      0
 11   03:21:04  11101      0   04:56:02  10654      0
 10   03:20:46  17279      0   11:55:31  20904      0
  9   03:45:50  18538      0   03:55:53  16723      0
  8   01:52:35  12259      0   02:42:13  11727      0
  7   02:13:51   9452      0   03:08:32   9004      0
  6   04:26:47  20665      0   05:18:12  21331      0
  5   04:40:12  18957      0   04:46:23  17794      0
  4   13:31:12  48151      0   14:12:31  39562      0
  3   02:31:56  15312      0   02:36:33  13956      0
  2   02:28:28  13739      0   02:34:01  12841      0
  1   02:20:34   9723      0   02:41:57   9822      0

 

That's 44 of 49 stars. No part 1 missing, but 5x part 2. Two of those I never tried, and for three I gave up after trying. No completions > 24h later this year (as of writing this post). Interestingly the exact same number as last year, if I don't count submissions past Dec 25th.

I really don't like that the personal leaderboard only has the global timestamp, that's why tried to write down my personal completion times, as I didn't get up at 6 am a single time for this this year. I did get up an hour earlier to have an hour before work on a few days, that's all the submissions in the 1-4 hour brackets.

https://f5n.org/blog/2020/advent-of-code-2020/
Security, Backups, and Update Woes Part 2
Show full content

First of all, the Nexus 5 is really dead. I think it made it to ~19h and then it was stuck in the boot loop again. I got it to boot up from time to time but I mostly lost confidence, even when it was working for a few hours.

So on Thursday I pulled the trigger and ordered a Motorola moto 4X for 190 EUR, and it arrived yesterday. Feels good, looks good, a few grams heavier but otherwise nearly the same size as the Nexus 5X. The only odd thing was the patching. It shipped with Android 8.0 and I had to click "contine, reboot, search for updates" like 10 or more times until I arrived at 9.0 now.

But that wasn't the actual thing I wanted to write about, but this is what triggered it. I've been less annoyed by the loss of my favorite phone or the need to buy a new one (had it long enough and the new one was cheap) but it will shock you what happened next...

So I tried to buy something online with a credit card and to do that (and for other reasons of course) I have two at 2 different German banks.

Using number one popped up this 3D secure thing where I need a special app by my bank, of course this part hadn't been backupped and restored - so now I needed to order a new letter via snail mail, if there's even another way of recovery they're doing a terrible job of telling it to the user.

So at bank number two I couldn't even login to the online banking without a special TAN app (again this is not for banking per se, just authentication).

At least they offer an SMS-based workflow to pair a new device with your account, the problem is that it doesn't work. In this case you should log in to online banking, be in a kind of locked down state, but can trigger an SMS with a special link. I got the link but tapping on it I just got "TAN app not installed" so I called the hotline. First this also didn't really work, but after a few tries I could copy the entire SMS and paste it in the app and it parsed out the magic part of the URL and now my new phone is paired. Yay.

So half of this drama is over I guess. Still it would be so easy if they supported my Yubikeys...

On to the Google Authenticator 2FA stuff. First of all, I've never had a problem with Google Authenticator itself. I use it for basically all websites that support it. Not that many, in my case, this is the sad thing.

twofactorauth.org has a big list but I don't use many.

Github

I think Github takes the #1 spot without any real contenders. Also it has the potential for massive damage if someone would commit something nasty.

  • authenticator app
  • multiple Yubikeys
  • one-time codes
  • no forced SMS auth, but as a fallback comm. channel
Google/Gmail

Seems close to Github, but I don't really care about this account. It has my calendar and I bought apps for < 20 EUR in 10 years. It's not my primary email and not used as a recovery email address afaik.

  • authenticator app
  • multiple Yubikeys
  • one-time codes
  • haven't tried to remove SMS auth
Namecheap

Bought a domain here, so far everything went perfect.

  • multiple Yubikeys
  • OR authenticator app - that's a little weird
  • one-time codes
DigitalOcean

Spun up some droplets in the past, currently not actively using it.

  • authenticator app
  • one-time codes
Scaleway

Got 1 VM here right now.

  • authenticator app
  • one-time codes
Amazon

Don't have to explain this one I guess.

  • multiple authenticator apps, but can't remove old ones, wtf
Blizzard Games, formerly World of Warcraft only

Pretty good for a game.

  • keyfob OTP generator
  • own authenticator app
Star Wars - The Old Republic
  • keyfob OTP generator
  • own authenticator app
EVE Online

Didn't try this myself.

  • authenticator app
Final Fantasy XIV

Didn't try this myself.

  • keyfob OTP generator
  • authenticator app
What does that mean?

So yes, you read that correctly. Of all the hundred or so of online accounts I have only 4 have 2FA enabled, but of course I didn't check all of them, but I don't think I'll find a lot who do support it. Compare this to like every major MMO I've played in the last 10 years, they all support it - and as I don't have a gaming laptop it would be even easier to have this somehow temporarily bound to a certain computer, in a sense of alerting of logins from different machines, whereas you can bet I will login to several websites from a laptop or phone from a different subnet multiple times per day.

Also still very disappointed by both of my banks, if I didn't make myself clear already how much I love my Yubikey.

Stuff I'm using that should support 2FA, but I don't use it:

  • Discord, app
  • Slack, app

Also, famously no support:

  • Strato, a hoster I use
  • Booking.com - ok, not sure the hardware key would be useful for me
TLDR
  • authenticator app without one-time codes is annoying or stupid
  • many workflows of "I have a new phone" converge to "just click on 'I lost my phone' - why can't I act proactively?
  • I know restoring the authenticator from an Android backup might be insecure, but not being to use my CC sucks. A lot.
  • I want more Yubikey support, dammit
https://f5n.org/blog/2020/security_backups_update_woes_ii/
Update Woes
Show full content

My phone is a Nexus 5X, I bought it on July 21st, 2016 - that's 3 and a half years ago. According to GSMArena it came out in October 2015, so it wasn't exactly brand new - but it was affordable and it was the best phone I ever had. I had (and have) no plans of replacing it, but Google stopped shipping security updates in December 2018, and I somehow missed this and was a little shocked when I noticed a few weeks ago - and I'm on a kind of ancient version of Android 8.1.

So I had the plan to install LineageOS because I had heard good things about it, the device seems to be supported.

So last Saturday I pulled the plug. The last time I had put a ROM on a mobile phone was probably in 2016, maybe 2017.

The installation instructions were straightforward.

  • boot into bootloader
  • unlock bootloader
  • flash recovery
  • boot into recovery
  • wipe phone
  • sideload the OS
  • add Google stuff
  • reboot

All this worked flawlessly and close to midnight on Saturday I had a phone with a new OS, still 8.1. - but built in 2020 and not in 2018.

I was a little surprised I could just restore from (Google Cloud-) backup, but it went fine and so I went to sleep at some point.

I got up on Sunday, the phone was charging overnight and unplugged it around noon and let it sit on my desk. In the evening I had a look at it and it had gone dark. Weird. So I started it and that's where the fun part of the story begins. It was stuck in a boot loop. Great. Couldn't even get into recovery, no matter what I tried.

So I didn't try too hard to solve it any further and did what everyone would do on such an occasion. Find out where the project IRC channel is and ask there. Didn't get answer in the morning but it was kinda quiet. So I asked again in the evening and got some hints, but nothing that made me go "yay, solved" instantly. Meanwhile after the phone being unplugged for hours I actually managed to get it to boot once, but it went out after like 10 minutes again, just when I had stopped looking at it.

The final thing I tried was flashing TWRP-3.3.0 instead of TWRP-3.3.1, but I don't really see how the recovery would influence anything, but as I couldn't boot into the recovery I had flashed I wanted to try this first.

Intermission: The Nexus 5X is a little infamous for being stuck with a boot loop, many people have experienced that - I personally know two people. One had it soon enough to just get LG to replace the phone. So one of the interesting links was this one about boot loops. I did find it kind of unlikely though that after 3.5 years of daily use it would just get this issue 16h after I had flashed another OS. Weird coincidence.

Some reasearch also resulted in some people saying that they did the ghetto reflow version that's been around since at least the XBox 360 days - take out the board and put it in the oven for 5-10 minutes at 200°. I had wanted to try that with my 360 when it was locking up while playing Rock Band a lot, but I never did it. So with no high hopes to ever fix the phone I did just that.

Disassembled it, took the board out (was surprisingly easy) and baked it for 6 minutes at 200°. Let it cool for 10 minutes and what can I say? Plugged it in, phone booted up just fine (albeit with an empty battery) and it's been running for roughly 24h now. The camera works and I'm a bit wary of surprises but it seems good.

I have a second Nexus 5X here that's as old and it doesn't recognize any SIM cards anymore. Now that I know it can be easily disassembled I'm inclined to do that in the near future and investigate if I can somehow see a mechanical problems and maybe properly touch of on the solder of the SIM slot parts. Or just get to baking again. Wouldn't hurt to have a working backup solution - I don't see a compelling reason to buy another 250 EUR phone when this one works just fine - if only it weren't for lack of updates...

Thanks to #lineageos on Freenode for help and emotional support :)

https://f5n.org/blog/2020/update-woes/
Home Server
Show full content

After the hardware upgrade in November and a somehow rekindled interest in playing around with hardware and self-hosting after a few months of mostly playing games... I found myself with a spare i5-3570K with 16GB RAM. I'm pretty happy with my FreeNAS box, but it's not the fastest (AMD Turion(tm) II Neo N54L) and it doesn't run docker and I don't even want to try to run a beefy VM on it. The NAS should be stable and left alone. (I run 2 jails, but they're just serving files, in a sense.)

Also I tried to have my Raspberry Pi 3 as a "development box" here, but it just felt too slow. Maybe it was the USB stick over USB 2, I don't know. And WSL also doesn't excite me, really. It just feels wrong, somehow.

So incidentally a years old 650W PSU died on me a few weeks back and I had already transplanted my i5's PSU into that other computer, so I needed a new one anyway if I wanted to use that computer. Sadly it was in a midi tower that was just a little too big to fit under my desk (there's already my main machine, my NAS, a container with wheels and my subwoofer that doubles as a foot rest most of the days).

So I looked for a small case and a "smaller" PSU and then I ordered

Now it fits under my desk. I didn't want to go full-out proxmox because I only want to run a few docker containers and one "pet" VM where I have a normal Linux box available without having to boot a laptop and that can use 4 cores a lot of RAM. So my host was supposed to be kinda bare-bones, so I decided to Alpine, which I hadn't used in a while, and mostly in VMs and containers.

The wiki was helpful, as usual, but I'm still copying my steps here in case they change it.

  • install alpine via alpine-setup (3.11 in my case)
  • uncomment the /community repo in /etc/apk/repositories
  • install packages:
apk update

# for docker & libvirt, not 100% sure if you need virt-manager
apk add docker bridge libvirt-daemon qemu-img qemu-system-x86_64 dbus polkit

# for my own convenience
apk add sudo curl file htop

# for docker-compose (there should be a better way, but it didn't work)
apk add py-pip python-dev libffi-dev openssl-dev gcc libc-dev make

  • add user to correct groups:
    • addgroup USER docker
    • addgroup USER libvirt
  • start daemons on boot:
    • rc-update add docker
    • rc-update add libvirtd
    • rc-update add dbus
    • rc-status
  • enable remote access for virt-manager:
# cat /etc/polkit-1/localauthority/50-local.d/50-libvirt-ssh-remote-access-policy.pkla
[Remote libvirt SSH access]
 Identity=unix-group:libvirt
 Action=org.libvirt.unix.manage
 ResultAny=yes
 ResultInactive=yes
 ResultActive=yes

  • check networking (brctl might be smarter than manual fiddling):
# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
        hostname whatever
        bridge-ports eth0
        bridge-stp 0
        bridge-fd 0
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.1

  • finalize:
    • reboot and check if everything works
    • brctl show
[...]
br0             8000.c86000ecf792       no              eth0
                                                        vnet0
docker0         8000.024214a852b8       no
virbr0          8000.52540047d4cc       yes             virbr0-nic

* connect via ssh + virt-manager from anywhere

Addendum:

The only open ports should be:

# netstat -tulpen
Proto Local Address  PID/Program name

tcp   127.0.0.1:5900 6419/qemu-system-x8
tcp   0.0.0.0:22     4380/sshd
tcp   :::22          4380/sshd
udp   127.0.0.1:323  3027/chronyd
udp   ::1:323        3027/chronyd

Low RAM usage in idle, no CPU power wasted in idle, looks good. So far Alpine looks like a good choice. I only need a script or two to quickly spin up some throwaway VMs, but maybe virt-manager is also good enough for that.

https://f5n.org/blog/2020/home-server/
A Static Site Generator
Show full content
Why?

A little while ago I wrote about micropub and this meant I needed a way to integrate dynamic content into this static site.

Of course the easiest way is to just let some dynamic part create a new file (or append to one) in this input folder and then rebuild the website, but I didn't find that very elegant. But i looked into this (and especially hugo's data feature) and it looked ok, but not great.

Anyway, I tried to upgrade hugo from a 4 year old version and while it worked, there were some things that felt needlessly changed and I had to rewrite some templates and overall I was a little annoyed at the thousand features I didn't need and the amount of docs to be read.

This was a while ago and a week ago I thought it might be fun to see just how much time and effort it would take to write a static site generator from scratch, because for all of the myriad of blog system I'd written in the past, I never wrote a static site generator.

And I think I'm finished now and decided to write a bit about nextgen.

Just the facts
  • Written in Rust
  • 333 lines of code (plus a few external crates, of course)
  • Fast enough (250 markdown pages in 0.1s)
  • It can build this website kind of identical, not bit by bit but structurally the same
  • It took roughly a week to build it, a few hours each night
  • seriously, don't use this in its current form
How it evolved

The first commit still uses a lot of regex parsing, was mostly playing around. But the basic flow is the same already and the static asset handling hasn't really changed: Use the walkdir crate to look for matching files in a directory and copy them to ./public/static.

The pulldown_cmark crate for Markdown parsing works great.

The second commit introduces the tera create for templating, which is similar to Jinja. I tried liquid at first, but it really didn't click.

This is the final form of the templates.

Then I introduced sections, which means that for example everything under /blog/ is grouped under the blog section. Also for years I had kinda wondered how websites calculate this "takes 5 minutes to read" but never looked it up. Well, hugo has that feature and so I searched a bit and settled on a very basic algorithm. Count the words in the Markdown file, divide by 200. This was close to hugo's output, but not perfect, so I am simply adding one minute and it seems to mostly match.

The next planned dependency was toml to read the front matter of the markdown files (and also the site config) and it also needed serde.

Then I noticed that I should generate directories with an index.html inside and not a file called e.g. /foo.html - thus this boring commit.

Next up were the section index pages (live example). If there's a file called _index.md in the blog folder, this gets generated, otherwise nothing happens. I got the idea how this is handled from Zola because of course I looked at a few static site generators this week.

I couldn't really work with/format dates yet, thus the next commit introduced the chrono crate, as expected.

Next up were the section index pages, which made me restructure how I keep the parsed pages in memory. These can only be generated once all the pages in this section have been parsed. I first implemented these in Rust and not in the template.

Commit #9 introduced section rss feeds (Atom actually), which was pretty straightforward.

Then the section index pages were converted to the template language and everything was cleaned up a bit.

Here all parsed markdown pages are finally sorted into a defined section. _index for the /index.html, _default for normal pages (like my about page) and the section for e.g. /blog/ pages. Everything that is not a section index or index also goes into _pages. This makes it possible to show the latest posts on the index page, in my case the last 10 of the sections blog or stack.

Now a little refactoring to eliminate a fourfold code duplication of 4 lines to write the resulting pages to disk.

And finally only the main RSS feed is missing, but the list of pages is already there, so it's easy.

An overview

And that's how the final program looks:

  • read config.toml
  • let tera read all the template files
  • copy static files
  • identify the sections
  • parse every markdown page and prepare the variables for the templates
  • if it's a normal page, just generate it
  • if it's the index or a section index, defer writing, but save the variables
  • sort by section, but keep a list of all pages
  • go over the sections and generate the section index and the section rss feed
  • generate the index page and the main rss feed

I didn't do a real comparison in the browser yet, only looked at colordiff output of the different types of pages, so there might be a few small bugfixes left, but the goal of replicating all of hugo's features that I actually use is achieved. I don't generate CSS from SASS but looking at my Makefile it's not even done by hugo now...

Next steps?

I'm not sure if I'll switch to nextgen or if I will add the features I need for micropub, but working with Rust for a few hours made me understand a few things better and I can really use the training.

So yes, I do think hugo went a little off the rails in the last few years, but I am still very happy with it and I'm thankful it was written, it was the best one I found back then.

But I dreaded updating and so I never did it, for over 4 years. Good thing is that it only parses my own content, is not a network service and so I don't need to care about security.

https://f5n.org/blog/2020/a-static-site-generator/
First steps with WSL
Show full content

It is January and I decided to bite the bullet and finally try out the Windows Subsystem for Linux, despite my bias against development on Windows. I have a Rust app I want to have a look at again and I don't want to install Git on Windows, for starters. And always editing code with vim grows old, if you're only doing it because your code sits on a box without a GUI, not because you love vim and want to use it all the time.

OK, installing it is easy enough, PowerShell as Admin, one command, reboot. Adding Ubuntu 18.04 as well, download one file, one command, find it in the start menu, wait a little, done.

First problem arises. Since I installed this I don't have the keyboard layout chooser anymore, and right now I have a US Intl. keyboard connected. This is really painful already. Why does this happen?

  • Settings -> Time and Language -> Language
  • English -> Options -> Keyboards
  • Add a keyboard -> US-Intl

Now I have a different keyboard selection icon in the taskbar, but fine. Digging deeper in the settings this seems to be the 'Language Bar' that is acting in a weird way. If I set it to float it's gone, but by changing stuff in 'Advanced keyboard settings' I can make it reappear. Aaanyway.

apt-get update && apt-get upgrade works, good. Installing tmux and git, creating a new SSH key, cloning, fine.

OK, now I need rust. I want to build for Windows, so can I do this in WSL or do I still need it in Windows? No idea, let's use the Windows rustup-init.exe.

Addendum: Trying to install rustup inside WSL, I do get a default host triple of x86_64-unknown-linux-gnu, as expected, so it was the right choice.

It's really been a while since I installed Rust on Windows, but did you always need the 4.5 GB C++ Visual Studio support files? This is weird, but ok.

Next problem, running cargo build in \\wsl$\Ubuntu-18.04\ is really, really slow and errors out after 30%. Twice. OK, this doesn't seem to work. After reading some posts and articles I should be glad to be able to have write access at all, it seems.

Good, copying over my 30kb of project files to a Windows dir, rerunning, this works fine. I'm using VS Code right now for Rust.

A day later I'm minding my own business and suddenly Windows Defender pops up and says there's a trojan in my /bin/su file of the Ubuntu WSL thing. A Windows trojan, nonetheless. I wouldn't say I panicked, but I was a little concerned indeed. It's supposed to be a normal Ubuntu 18.04.3 - so I connect to a real server I have and start comparing stuff. Same version of the package, which files are in the package, what are their md5sums... It's 2:30 am already and I'm a little tired and wanted to to go to bed just before this, so I miss checking the "infected" executable properly. Turns out if it's overwritten with only zeroes the checksum might indeed be different... Restoring didn't work, so I fired up FileZilla and copied the Ubuntu 18.04.3 su binary to one of my Windows partitions and boom, quuarantined again. This time restore worked though and I was calmed down enough to let it rest. Filed a false positive report (at least that went quick without an account) and went to bed. When I got up 8h later it was already accepted, at least this worked fine.

Still. I know why I hate Windows as a development platform, but the WSL seems to be good enough for certain things.

  • have a full Linux system available instantly
  • not having to bother to install most development tools on Windows
  • there is some amount of cross-access so I can use e.g. grep on files easily
  • ip a didn't work yesterday but today it does?
  • the terminal has a few oddities, putty is better

Starting services on WSL when Windows starts seems to be a bit of a hassle, but I wouldn't want them running all the time anyway, I guess

I need to play around with it a little more. It's definitely better than a full-blown VM, and some things are kinda seamless, but there have been a few awfully sharp edges for a good first experience.

https://f5n.org/blog/2020/first-steps-with-wsl/
2019 in review
Show full content

These review posts have proven incredibly useful when looking up stuff, so I'll continue this tradition.

 

( 2018 / 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • World of Warcraft
  • FFXIV
  • EVE Online
  • Borderlands 3
Books I've read

Worst year ever, again. Zero novels. Reading Thinking in Systems right now.

The pile of shame - books I wanted to read

Same as last year:

Movies I've (re-)watched
  • Thor: Ragnarok - a bit weird, but ok
  • Star Wars: Solo - really good
  • 6 Underground - ridiculous and funny. mostly ridiculous
  • Big Trouble in Little China - very 80s, but it's really ok
  • The Lord of the Rings - The Fellowship of the Ring - Extended
Movies I didn't manage to watch TV Series I've (re-)watched
  • Brooklyn Nine-Nine (Netflix) S1-S2 - funny
  • Firefly - about time for a rewatch
TV Series I didn't watch
  • Wynonna Earp S2
  • The Expanse S2+
  • The Shannara Chronicles S2
  • Jessica Jones & Luke Cage
CDs I bought
  • Arch Enemy - Rise of the Tyrant
  • Arch Enemy - Khaos Legions
  • The Chats - Get This In Ya
  • The Chats
  • In Flames - I, the Mask
  • In Flames - Battles
  • In Flames - Sounds from the Heart of Gothenburg
  • Gloryhammer - Legends from Beyond the Galactic Terrorvortex
  • Amon Amarth - Jomsviking
  • Amon Amarth - Fate Of Norns
  • Amon Amarth - With Oden On Our Side
  • Amon Amarth - Twilight Of The Thunder God

Only one In Flames album missing from my collection now, discovered The Chats, and been listening to a lot of Amon Amarth lately.

Other stuff I bought
  • Fenix PD25 Flashlight - nifty
  • Gerber Paraframe Mini pocket knife - went camping, lost it without using it once. doh
  • a new computer
  • my first smart home device, a smaho wifi power plug
  • replaced my Roccat Kone+ mouse with a Roccat Kone EMP, I hope they won't stop making those
  • first batch of LED light bulbs as my inherited stock of old heatballs was finally used up
  • bought a slim/small leather wallet after searching for a long time
Social network usage
  • Twitter - no change - regularly, not overly much
  • Facebook - logged in maybe three times?
  • Instagram - posting a photo from time to time, checking others' stuff once a month
Messaging
  • IRC - daily use, default communication channel for many people I communicate with
  • Matrix - daily use
  • MS Teams - work stuff, it's not as bad as it sounds, but Slack is better
  • Jabber - server was shutdown, might revisit
  • Email - same as usual
  • Slack - using two communities, sparingly
  • WhatsApp - replaced FB messenger
Trips
  • road trip (France, Switzerland, France, Monaco, Italy, Liechtenstein, Austria) in June
  • Austria in January
  • Chaos Communication Camp near Berlin in August
(Online) services
  • Still subscribed to Netflix and Amazon Prime
  • stopped using xmpp/jabber, migrated to Matrix
  • upgraded my mailserver, Ubuntu 14.04 was EOL, I'm using docker-mailserver now, originally planned to do mailcow
  • upgraded my Neo N54L NAS, it has 8 GB RAM now and runs FreeNAS 11.2-U7 now
Programming languages used, roughly in order of hours spent
  • C++ - work, I like it a lot more than I had thought
  • bash - still too much
  • Python - work and a few private things, deployment and packaging is still hell
  • PHP - for one private project
  • Rust - still learning
  • several for AoC
Podcasts I listen to

Very irregular this year:

  • Battle Bards - "A musical journey through MMO soundscapes"
  • ATP - I'm not using any Apple products and still listen to these guys sometimes.
  • some real gaming podcasts, but even less regularly
Stuff that kinda worked out
  • write more blog posts: 7 isn't a lot, but it's ok, also wrote elsewhere
  • get my self-hosted services in shape, trimming unneeded, keep everything updated, etc
  • learn try out some new programming language(s)
  • after 2 years I'm no expert in C++, but I can work just fine with it
Stuff I planned to do this year but didn't
  • start properly learning Spanish
  • write a replacement for my podcast downloader of choice (JuicePortable), because it stopped working
  • solve the deployment problem of hobby projects
  • add Micropub support for this site. Started but didn't finish.
  • do more Rust
  • do more Clojure
"New Year's Resolutions" aka stuff that would be nice if it would work out
  • be able to read cyrillic letters fluently and practice enough to memorize them
  • learning from AoC: focus on one or two languages for hobby stuff and get good with it, not just be able to use it and forget stuff all the time
  • read at least 3 novels this year (starting slow, somehow I lost the enjoyment of reading. Literally lost it, my shelves are full with books I read.)
  • get my podcast management thing to at least a usable state

These lists keep getting shorter and shorter, maybe the focus on media consumed and used for communication is not the right angle anymore.

https://f5n.org/blog/2019/2019-in-review/
Advent of Code 2019
Show full content

This is my first time taking part in the Advent of Code, although I had heard about it earlier.

At first i thought I didn't have time, so I didn't start on day 1. Apparently I first committed something on day 3, and my solutions for day 1 and 2 show > 24h for solving.

My goal was to use C++ with the stdlib because all I ever do at work is Qt and so I'm not really good with standard C++. But I also thought it could be neat to try a few languages.

TLDR: code is on github

I don't aim to describe the problems, there's no plan to remove them from the site, read them there :)

Day 1 - The Tyranny of the Rocket Equation

Easy start, don't remember if I did it in C++ first (probably), but I also did a solution in Crystal (part 1 and 2 in both languages).

Day 2 - 1202 Program Alarm

Now this was a bit of a surprise, building a virtual machine. Did this in C++ first, later added a TypeScript version for part 1 and 2, although I guess solving part 2 via brute force in a shell also works. Also I would later rewrite it in Java because of reasons that will become clear.

intcode part 1

Day 3 - Crossed Wires

Only managed to do part 1 on that day (in C++), but I iirc I had coded 1.1, 1.2, 2.1 and 2.2 on the same day. I redid part 1 in Nim on day 5, and also solved part 2 in Nim shortly after midnight. I would later try to solve this one in pure Bash (on day 15). It was horrible - it's slow and hard to grasp, but I did it (after many hours of learning just how inflexible arrays in bash are).

Day 4 - Secure Container

Used Python3 for this one, solved it in reasonable time. Later did a Tcl version of part 1 and a PHP version of part 2 (on day 7). Much later added part 2 in Tcl and part 1 in PHP (day 24). In retrospect, this is the first day where I noticed 100% overengineering of my solution. I added all the (un)necessary boundary checks and made this work for basically all inputs, whereas other people just solved the problem in < 5 minutes. Also surprisingly the Tcl version was really slow (5s) because of this and with a little restructuring and making it easier I brought it down to 2s in a few minutes.

Day 5 - Sunny with a Chance of Asteroids

Adding instructions to the intcode VM, did part 1 in the morning and part 2 on lunch break. C++, extending the day 2 solution.

intcode part 2

Day 6 - Universal Orbit Map

Used Python again and struggled for quite a bit, as I was traversing the graph in the wrong direction. After some hints to try the other direction it went kind of quick. Part 2 solved 16 min after part 1, record time. Also tried to rewrite in Clojure, but as of day 27, still not 100% done with part 1 (it's buggy). That was finally fixed on day 28, and again I am a bit surprised how concise and readable the Clojure solution is, it's just that I need hours to arrive there.

Day 7 - Amplification Circuit

This was a saturday so I solved this at around noon, part 2 only later. C++ again. Here a little annoying trend surfaced for the first time. Sometimes you'd need to reset the VM between runs and sometimes keep state. Not really hard to do, but easy to mess up if you're extending your code and evolving it based on previous assumptions.

intcode part 3

Day 8 - Space Image Format

Sunday, time to code. Finished part 1 in C++ before lunch, part 2 45min later. Then did a Common Lisp version that surprisingly only took less than 4h (going by commit time now). Looking back this was one of my favourite problems. Not too hard, not too fiddly. But also not a real walk in the park. Also much more to what I am used to code, compared of some of the other days that were really abstract for me. Doing this in D later on Day 29 took a little longer than expected mostly because of off-by-one errors, they're my Kryptonite.

Day 9 - Sensor Boost

OK, no idea why exactly I didn't solve this until the 11th, but I think it was because I was out with friends on day 9 and day 10 and didn't get up at 6 or 7 to have a go before work. C++ again. I would later rewrite the day 9 version of the intcode VM in Java (for day 21) because I wasn't happy with the software architecture and apparently had some bugs. It took 2h, should've done that earlier, no matter in what language.

intcode part 4

Day 10 - Monitoring Station

Another slow solve, done on day 13 in Python after spending a lot of hours searching for ideas and going in the wrong direction, trying to grab all vectors, then checking if they are on the same line. This should work, but it didn't. First time not having fun at all.

Day 11 - Space Police

Oh yeah, that was a fun day. I had broken my VM and had to use someone else's to write the actual day 11 code. The solution went surprisingly quick. Fixed my VM on day 13. Also pretty close in spirit to day 08, imho.

intcode part 5

Day 12 - The N-Body Problem

Was on vacation that day, so had some spare time. The solution for part 2 took quite some time, but part 1 was ok I think. Used Lua(JIT) for this, that was fun.

Day 13 - Care Package

Breakout! That was awesome. C++.

intcode part 6

Day 14 - Space Stoichiometry

Used Python and again hit some sort of road block until I got a clue, again the solution was to start from the other side and not build a tree. My solution was good for part 1, but very, very slow. So again I borrowed someone's part 1 solution in order to be able to do part 2. Half-cheating, maybe. Rewrote this from scratch in Perl on day 16 and apparently made the same mistake, it's just as slow. Finally solved (in Perl) on day 26 after consulting some other solutions and doing a detailed analysis why mine was so slow.

Day 15 - Oxygen System

I totally failed at BFS. I don't like mazes and this was the first time I ever tried to write path-finding code. Not fun, not my thing. Still managed to solve part 1 with luck and then manual counting of steps on the discovered map. Part 2 is unsolved as of day 30. C++ again.

intcode part 7

Day 16 - Flawed Frequency Transmission

Used Ruby for this one. Solved part 1, but executing it took roughly 50min on a slow server. I think I actually managed to cycle to work while it ran and then also started it on my laptop, just in case. Part 2 was a lot harder, spent the whole evening on this but I had a good idea in the end. I did have to look up someone else's solution to fix an off-by-one error. Still counts as solving it on my own, I guess, I didn't change anything meaningful in my code. Interestingly I found the solution to the problem by manually writing out the results of the example in a text editor and looking for patterns. It helped.

Day 17 - Set and Forget

C++ again for this one. Solved part 1 in record time (for me) 1:32h after in unlocked. I think I got up pretty early, but still only ~1h. But then I totally misunderstood part 2, and struggled for a while until I got a hint how to read the problem description. In the end I didn't write the compressor (as of day 22) but as my instructions were correct, I manually compressed it in ~5 minutes on a sheet of paper. Good enough for me.

intcode part 8

Day 18 - Many-Worlds Interpretation

Mazes again :( Tried in Python (my most productive language I guess) but still unsolved as of day 30.

Day 19 - Tractor Beam

This was a fun one. Started very late in the evening because I was sick that day and had slept for ~16h but it didn't take really long to solve part 1, and then I even managed to solve part 2, submitted my result and went straight back to sleep. Would not recommend, took a while to even reproduce the results a few days later :P

intcode part 9

Day 20 - Donut Maze

Mazes again :(( But after finding a BFS implementation in Python I actually kinda solved this one pretty quickly. Had the right idea about the portals and that was that. Tried to solve part 2 for quite a bit with no result. Didn't revisit yet.

Day 21 - Springdroid Adventure

This is where I noticed that my VM is beyond redemption. I was asking people how I should jump over 8 wide holes and the widely accepted answer was that there should only be 1-3 wide holes. Quickly rewrote the VM, came to the part where you need to do the Boolean math and kinda failed. Could've done without the manual calc, De Morgan's laws, etc, I guess... Had to look up the solution in the end. But at least that gave me enough ideas to solve most of part 2 on my own. So this was done in Java, actually.

intcode part 9

Day 22 - Slam Shuffle

Finally felt confident enough to use Rust, and managed to solve part 1 after just 2h. Part 2 proved to be trickier, really, really tricky indeed. It was to be known as the mathiest problem of this year and in the end I gave up and copied a solution. I am 100% sure I would've never discovered this.

Day 23 - Category Six

Got up at 6, used my shiny new Java VM, made a few stupid mistakes, still managed to get my first place under 1000 after 1h 57min. And then I totally messed up part 2 and only managed to finish it in the evening after rewriting my code completely for 3 times. It was too easy to be true... In the evening I tarted porting my Day 10 code to Julia and finished part 1.

intcode part 10

Day 24 - Planet of Discord

Oh, Game of Life. Not sure I ever did one before. Part 1 was pretty easy and besides a few stupid mistakes it went smooth. First submission in under an hour leaderboard time, ~49 minutes after getting up, rank 848. This reminded me of Day 20 and so I had a solution after 2:32h, leading me to rank 670. Had some time, so did 4.1 in PHP, 4.2 in Tcl and started 22.1 in C. Oh, and 1.1 + 1.2 in PowerShell.

Day 25 - Cryostasis

Oh, a text adventure, neat. At first I wanted to solve it automatically (not like day 15 where I started with manual input) but then I noticed that the rooms are not evenly spaced. So I did go the manual route again and drew a map on paper. Then I noticed what I will call my personal bug of the year 2019, including all work stuff.

In this problem you're supposed to walk through some rooms, pick up some good items, avoid some bad items and in the end have the correct items. So everything seemed to work - I could traverse the rooms in any order, I could get to the last room with the check... but I didn't find a single item to pick up. After a while of being astonished I asked for someone else's input with an exact location of an item and tried that - same result. That means I had a bug in my IntCode VM that did not trigger on Day 09, Day 21, or today - with the exceptions of the items. I was a little frustrated after a while and asked on Reddit, then got back to my C++ IntCode VM and tried that. Sadly (obviously) it still had the other weird bug, the one that surfaced on Day 21 and which prompted the rewrite, and it kept crashing. But after a while I fixed those bugs and could finally walk through my rooms, grab the items and then tried the correct solution with pen and paper. After I found this, the folks on Reddit pointed me to the correct bug location and after only a few minutes of thinking I could fix it. And then finally I was a little surprised that the 50th star, for Day 25 Part 2, is only awarded if you have 49 stars, so everything solved. Apparently that's the case every year...

intcode part 11

Day 26 and beyond

As I'm writing this on the 27th, I've finished a lot of TODOs but still have a few things that I want to finish up before I end this chapter.

When I say "VM" - I do this knowing that VM may not be 100% the correct definition. It's an interpreter of machine instructions for a made up computer system.

DONE after the event
  • Grabbed a 22.2 implementation, I have zero interest to solve this on my own
  • Rewrote 22.1 + 22.2 in C
  • Rewrote 16.1 + 16.2 in D
  • Finally fixed 10.2 in Julia. What a nasty bug to find. "negative value mod positive" in Julia returns a negative value, python makes it positive
  • Fixed my 14.1 in Perl to be fast enough for 14.2
  • Added a Makefile to most directories, mostly to document how to build/run those 20 languages
  • Rewrote 12.1 + 12.2 in Go
  • Added 2.2 in TypeScript
  • Tweaked my early C++ solutions (and some others) to consistently take the input file as the first CLI arg, not via stdin
  • Wrote down some basic benchmark numbers for most solutions
Open TODOs
  • Solve 15.1 properly in Java
  • Solve 15.2
  • Solve 20.2 (aka fix my WIP code and see if it works)
  • Solve 18.1 + 18.2
  • Fix 6.1 in Clojure, then do 6.2 (done on day 28)
  • Get that damn 50th star :)

What they all have in common (Exception: Day 06) is that they are maze/path-finding problems. I'm really bad at BFS/DFS, so I need to read up first.

Ideas, more than TODOs

I'm a little unhappy that I broke my self-imposed rules by copying someone else's code for some days instead of writing my own, so there are some languages where I might redo another day in that language, with my own code. Not trying to reinvent everything, but at least only porting my own code.

  • Perl and Day 14, but it's not fun to use :P
  • D and Day 16. Might pick an easier day, but D is really ok. (Did day08 on the 29th)
  • Rust and Day 22. I think I aced part 1, but not part 2.
  • C and Day 22. Again Part 2 is not my code, so I want to do another day in C. (Did day06 on the 28th)
  • Have a go (no pun intended) at the Day 09 Intcode VM in a few more languages and setups.
Cancelled TODOs
  • Get to 25 languages, 20 is enough
  • My Day 16 Part 1 is really horrible and slow, and I won't try to properly solve it
  • Day 21 Part 1 - My code is correct, but I cheated with the puzzle.
Languages used:
  • Bash: day03
  • C: day22, day06
  • C++: 1,2,3,5,7,8,9,11,13,15,17,19,25
  • Clojure: day06
  • Common Lisp: day08
  • Crystal: day01
  • D: day16, day08
  • Go: day12
  • Java: 9, (15), 21, 25
  • Julia: day10
  • Lua: day12
  • Nim: day03
  • Perl: day14
  • PHP: day04
  • PowerShell: day01
  • Python3: 4, 6, 10, 14, (18), 0, 4
  • Ruby: day16
  • Rust: day22
  • Tcl: day04
  • TypeScript: day02

Total: 20 languages

Learnings about the languages
  • Bash
    • Not fit for writing proper software. EOD.
    • I use Bash often, but usually not because I love it.
  • C
    • Not my cup of tea, and I don't really know it.
  • C++
    • Surprisingly good to use if you're not a total beginner. Bit unwieldy for quick solutions.
    • stdlib is still new to me.
  • Clojure
    • Didn't use it for too long. Would love to use it more.
  • Common Lisp
    • Surprisingly nice, after an hour of warming up to it.
    • Think I'd tried it once in the past.
  • Crystal
    • Very much like Ruby, I guess?. A few odd differences. Don't forget to compile, or it's really slow :P
  • D
    • Overall really nice, but Ranges are weird. Or maybe I hate lazy stuff that's not as transparent as in Clojure.
    • First time.
  • Go
    • Still a really good language to quickly solve problems.
    • Hadn't used it for ~2 years.
  • Java
    • If you don't forget to use .equals() instead of ==...
    • I was surprised how quick it was to write without proper tooling, just VIM and tmux.
    • Not used for ~2.5 years.
  • Julia
    • Probably really good for Data Science, but being 1-indexed and subtly different than Python while looking very alike.. not my thing.
    • First time.
  • Lua
    • Still awesome and fun to use.
    • Not really used in a while.
  • Nim
    • Surprisingly straightforward to use. A few odd things, but overall really nice.
    • First time.
  • Perl
    • Nope, never liked it and probably won't. Hash references are the worst. So much fiddling.
    • Not used for non-one-liners in... forever.
  • PHP
    • If you don't really use it for a few years, the struggle to remember needle/haystack order is real.
  • PowerShell
    • A lot nicer than bash, but I don't think I want to write real software with this. Kinda ok for scripts.
    • First time not just changing a line.
  • Python
    • Default language for quick results for me. No surprises, even though I never really used Python3 extensively yet.
  • Ruby
    • I don't really know Ruby, but it's easy enough to get results.
    • Also not used for years.
  • Rust
    • This went with a lot less pain than I anticipated. The borrow checker liked me this time.
    • Not used in a few months, still pretty much a beginner.
  • Tcl
    • Not my favorite language, but it gets the job done. Easy to pick up, just the syntax is a little odd.
    • First time.
  • TypeScript
    • Only ever wrote a few lines at work, it seems to be pretty usable. Definitely want to use it more.
Languages that didn't make it
  • JavaScript (21-25)
    • Had done TypeScript - so... why?
  • Ocaml (21-25)
    • Just didn't have the time to dig into it again, I'm a little sad :(
  • Pony (21-25)
    • Skimmed the manual, looked a little too complicated for this
  • Fennel (21-25)
    • It looks nice but I have quite a little respect for new (to me) functional languages
  • Kotlin (21-25)
    • the only language where I gave up instantly, as nothing worked out of the box
    • the compiler flags in the tutorial were all unknown
    • import java.io.File - paraphrased: "Java? Who dis?"
  • Scheme (21-25)
    • Was quite at the bottom of the list, simply didn't make it to 25
  • Racket
    • Simply forgot to add it to the list
  • LOLCODE, Brainfuck, etc.
    • Just not a fan, even I think it's wasted time
  • Scala
    • just nope
  • Haskell / PureScript
    • I suck so bad at this, but I'd actually think about it
  • Pascal / Delphi
    • Maybe worth revisiting after 25 years. I didn't like it.
  • Basic
    • This might actually be fun.
  • F#
    • Does this even run on Linux? Worth investigating
  • C#
    • Apparently not a bad language, but the entry barrier is too high for this event
The end

Ok, so this is how I spent most of my spare time in December 2019. I guess by using just one or two languages I could've saved massive amounts of time. But where's the fun in that?

There are really a few lessons I took away, although some were not surprising:

  • Read instructions carefully
  • Write 5 lines of a test harness code to quickly run your test inputs
  • Worse is better. Don't even try to structure at first, just solve it
  • Don't even try to compete with the fast people
  • I'm really not quick to code up solutions
  • I don't think I'm a really good coder, this micro-problem-solving is not what I do at work
  • This doesn't have much to do with software engineering, sans a few caveats when extending the intcode vm
  • Maybe I should really focus more on a few tools over having a broad spectrum

Will I participate again next year? Maybe, if time allows.

Finally I want to say a huge thanks to the #lobsters-advent IRC channel where we talked a lot about Advent of Code and I got massive help in the form of clues or having some stuff checked when it absolutely didn't make sense. Also it's just more fun if you have people to talk to. In the end i think I finished 14th on our leaderboard, with 3 people from the channel way ahead of me, but I'm totally happy with my result.

And of course thanks to Eric for doing this. I watched the talk and it seems to be quite some work. Also thanks to the subreddit, it's a good one.

Some links: Appendix 1 - My scores
      --------Part 1--------   --------Part 2--------
Day       Time   Rank  Score       Time   Rank  Score
 25   07:17:37   1411      0          -      -      -
 24   00:57:35    848      0   02:32:54    670      0
 23   01:57:11    919      0   14:21:51   2287      0
 22   03:03:04   1270      0       >24h   2222      0
 21   17:23:49   2652      0   18:09:25   2351      0
 20   07:38:16   1722      0          -      -      -
 19   14:40:16   3867      0   18:44:10   3363      0
 18          -      -      0          -      -      0
 17   01:32:37   1771      0   15:56:28   3125      0
 16   03:46:54   2808      0   18:03:19   3388      0
 15   09:21:04   2806      0          -      -      -
 14   17:49:46   4837      0   19:51:49   4466      0
 13   05:18:30   4900      0   09:59:36   4323      0
 12   06:39:46   5491      0   12:05:28   4383      0
 11   03:13:20   3110      0   03:20:20   2877      0
 10       >24h  13355      0       >24h  10938      0
  9       >24h  13094      0       >24h  13060      0
  8   04:13:22   5674      0   05:04:49   5703      0
  7   06:43:14   6574      0   09:23:38   4617      0
  6   11:27:08  11745      0   11:43:15  10447      0
  5   03:06:15   4384      0   08:00:35   6755      0
  4   16:07:14  22517      0   17:21:01  21033      0
  3   16:08:54  18054      0       >24h  26882      0
  2       >24h  37905      0       >24h  41205      0
  1       >24h  56901      0       >24h  51381      0

 

That's 45 of 49 stars, of which I got 44 including the submission of 25.1 - the official last puzzle. One day is missing completely, and two days are missing part 2. And I finished only 22.2 after the 25th.

https://f5n.org/blog/2019/advent-of-code-2019/
Tools for Windows: 2019 edition
Show full content

Despite never speaking very highly of it, Windows is still the OS of choice for my main machine at home, because it's mostly used for gaming and I still find it highly annoying to work on Windows.

I've written about what software I use in 2014 and 2016 and now, with the new computer and using Windows 10 for the first time, it makes sense to update the list.

I guess the overarching theme is that I need less specialized stuff as I have completely moved development off this platform.

  • Browsers:
    • Firefox and Firefox Developer, only because the taskbar stacking/pinning makes it really annoying to just use two profiles at the same time
  • E-Mail
    • Thunderbird for the main account
    • SylpheedPortable for testing stuff
  • IRC
    • Quassel
  • Audio/Video
    • foobar2000 for mp3s
    • VLC for Videos
    • Greenshot for screenshots
    • IrfanView for images, but it's a bit weird on Win10 so far
  • Editors
    • Notepad++ for everything that's not code
  • Voice
    • Discord
  • Passwords and encryption
    • KeePassXC
    • VeraCrypt
  • Networking stuff
    • PuTTY
    • FileZillaPortable
  • Misc
    • CopyQ for clipboard management
    • SharpKeys to rebind CapsLock to F9
    • WinSplit Revolution for window tiling
    • 7ZipPortable
    • Launchy because Linux has spoiled me for launchers
  • Game Launchers
    • Steam
    • Epic Games
    • GoG Galaxy
    • Twitch for free stuff and WoW addons

Then some things I have put off installing for now:

  • Visual Studio Code when I really, really need to develop on this machine
  • f.lux
  • MP3Tag
  • VirtualBox
  • SumatraPDF
  • cmder
  • Audacity
  • Spotify
  • JuicePortable (writing my own replacement)

And stuff that I left out and don't plan on using in the near future:

  • any jabber client
  • Chrome
  • CDEx (no drive anymore)
  • InfraRecorder

So overall I still think that list is too long, but on the other hand compared to the old lists and the dozens of small tools I had installed these are kind of the essentials.

https://f5n.org/blog/2019/tools-windows-2019/
Hardware Upgrade
Show full content

The old computer was nearly 7.5 years old, so it was time for a new one:

At 866 EUR without graphics card I'd call that pretty cheap.

Hardware I didn't replace:

  • ASUS ROG Strix RX470, from 2016
  • Roccat Kone EMP
  • Logitech G710+ MX Brown
  • Dell U2715H 27"
  • Samsung SyncMaster 2443BW 24”
  • Samsung EVO 860 1 TB SSD

Update 2021-01: Despite the market's best effort to deny me one, on December 28th I managed to order a GeForce RTX 3070 (GIGABYTE Eagle OC 8 GB) for just under 600 EUR and it arrived on January 2nd. Also I've been running a 3rd monitor since a bit before that, a 27" Samsung LS27C350, which is not great, but I got it for free.

https://f5n.org/blog/2019/hardware-upgrade/
Looking at Micropub
Show full content

I'm not new to IndieWeb but apart from implementing webmentions in clojure a few years ago I never really participated.

This weekend I thought about how I use social media and if I want to preserve and "own" some of those posts, so I looked into it again. What's interesting to me is Micropub and maybe being able to import stuff from Foursquare and Instagram and maybe post some quick notes from my phone or a computer without having to ssh to this box and write a post with vim and markdown :)

So here's a little braindump on tools and misc.

On a computer I like the token login via OAuth. Github is fine here, but doesn't work on my phone where I am not logged in and with 2FA it's a real hassle.

TLDR: Nearly everyone who wants micropub support writes their own library, endpoint, or whole cms or blog engine. Not that this isn't fun, but right now I'm just looking for a minimum viable product to be able to use micropub.

The PHP micropub project does exactly that, but not sure it's worth forking and adapting at this point. I didn't look at hugo-micropub yet but maybe I can rip out the git integration and just let it create markdown files. Finally, there's nothing written in Rust yet :P

I'll probably first try to hack up php-micropub for quick results and then see if I need to rewrite it.

https://f5n.org/blog/2019/looking-at-micropub/
Switching to Regolith
Show full content

The only thing I've been writing about seem to be desktop environments lately, especially i3 and kde.

Some time ago I found Regolith Linux which is an Ubuntu derivate on the one hand, and a ppa with a set of packages on the other hand. I guess most smaller Ubuntu derivates work like this, but that is not the point.

Quoting from their website:

Regolith Linux is a distro for people that prefer a spartan interface with polished and consistent system management. It brings together a trifecta of Ubuntu’s ubiquity, i3-wm’s efficient and productive interface, and Gnome’s system configuration features.

So in short it seems to be i3, with a set of preconfigured defaults, and the one thing I was missing when not running a full desktop environment, but just a standalone window manager - the system settings stuff.

So I tried it out by installing the packages from the ppa and nearly everything worked out of the box, with a few small things I had to tweak.

  • reintegrate dmenu over rofi, but maybe rofi could be fixed for me
  • copy parts of my old i3 config, carefully merging it to theirs
  • fixing the workspace names for i3-wk-switch to work again, not 100% there
  • this was a hard one: uninstalling ibus, because it claims ctrl-shift-u without any means to undo that (in the version in 18.04) and I absolutely need that shortcut daily in Qt Creator (as this is my work laptop)

Also some config things I merged or I'm using both versions because I am still undecided what I like best:

  • win-p starts rofi in default mode, using .desktop files
  • win-shift-p starts dmenu in my old config, also having ~/bin/*
  • win-enter starts st, regolith's default terminal
  • win-shift-enter starts terminator, my default terminal

RAM usage so far seems to be a tiny bit better, but I've not measured it, objectively or otherwise.

But overall, I'm 99% happy with Regolith so far and while I still have a few tweaks to do - none of them pressing issues, actually most of it is my stuff ignoring their color scheme, so a lot of black over bluish, and I don't care - I really like it and it fixed all the weird small problems I had with the unorthodox i3+plasma setup.

https://f5n.org/blog/2019/switching-to-regolith/
Desktop Environments
Show full content

I stumbled over this post about the new Xubuntu 19.04 and what's going to be included I remembered writing about i3 and kde.

Maybe time to reevaluate this choice after 6 months? Do I really need KDE/Plasma? I certainly need a tiling WM, be it i3 or xmonad (or back to awesome). Am I taking advantage of what a full-fledged Desktop Environment brings me versus using just a "lightwight" window manager?

I think my original problem with just xmonad was the lack of status bars and a tray area, out of the box. Sure, there are tools to fix this and it usually worked. But I also had a somewhat arcane setup with dhcpcd and wpa_supplicant instead of network-manager. It worked fine, but I didn't want to try to reproduce it on the (new) work laptop. Let's just say I've regretted it already a few times when nm behaved badly or just takes many seconds to connect to a wifi whereas my old setup is mostly really fast. I also thought I could easily add OpenVPN to this nm-applet or whatever it is called these days but I ended up forgetting about it and using CLI openvpn all the time anyway, also I'm only using wireguard on a regular basis these days anyway...

Another problem was the bad/non-existant discoverability of configuration for input and output devices. I'm really happy with the KDE "System Settings" application.

A funny thing is that I use graphical file managers so seldomly that I usually forget which one I actually have installed on the machine I'm using currently, be it dolphin, thunar, or whatever. I usually start them 3-4 times per year. Again there would be the KDE Start Menu, but I also forgot I had that, expecially when sitting at my desk with 2 external monitors and the laptop (with the KDE bar in the bottom) tucked away to my far right side... Doh.

I still launch everything with win-p via dmenu although I also have KDE's alt-space launcher. Speaking of this, spectacle is quite nice for screenshots, but I could use that one without a full KDE desktop, of course. I guess the same is true for Okular (PDF viewer). I don't really know if I use any "KDE applications" that aren't just by chance associated with KDE or written in Qt. Nothing deeply integrated in the system, at least.

KDEConnect seemed pretty cool but it's useless to me as my private mobile phone is in the guest wifi at work whereas my work laptop is in the internal one.

I'm also quite set in the ways of where my applications end up (which workspace/virtual desktop) and I think I don't use so many, anyway.

  • 2: QtCreator (C++) + Visual Studio Code (TypeScript, Python, misc)
  • 3: Chrome (primary browser)
  • 4: Slack, Quassel, Toggl (TimeTracking)
  • 5: TextAdept (text editor, my scratch buffer) + misc tools
  • 9: Firefox (secondary browser) + misc tools like Krita for graphics
  • 0: system settings and other stuff like VirtualBox if needed
  • 1: terminals with currently active project
  • 6,7,8: terminals (non-main project and if I need more)

Where did my 16GB of RAM vanish, again? Not many applications open. I think only the password manager is missing from the above list. I'd use Thunderbird more often but due to always lacking RAM I decided to not use it for the moment.

So yeah, apparently when doing development work I don't need a whole lot of GUI tools, so I might as well not use a full Desktop Environment. I guess I'll stick to KDE+i3 as long as this installation of 18.04 doesn't die. When I choose to upgrade I might try something else, and although a lot of that blog post in the opening paragraph sounded interesting, I guess I simply won't use it, just as I don't take advantage (or simply don't need) the plethora of tools that come with a DE.

I remember I always check out everything that any linux distro installs by default (been doing that for 20 years now) but I think not much "sticks" - most of these tools are novelty or solving special problems I am lucky I don't have. For all the common and regular-but-rarely I have a set of tools and I don't change them all the time, just because there's something newer or better, only when problems arise.

When I reboot for the next time I still think I should measure base RAM usage of this KDE stuff, it didn't look too bad, but if I could reclaim a GB I might ditch it for pure i3 again...

https://f5n.org/blog/2019/desktop-environments/
2018 in review
Show full content

These review posts have proven incredibly useful when looking up stuff, so I'll continue this tradition.

 

( 2017 / 2016 / 2015 / 2014 / 2013 )

Non-Board Games I've played/bought
  • SW:TOR - Subscribed for the 2nd half of the year, played a lot
  • EVE Online - Not subscribed, but played a little
  • Diablo 3 - a little
  • Destiny 2 - a little
Books I've read

Worst year ever, I guess. Zero novels.

  • Effective C++ (Meyers) - Had to learn and improve my C++, I guess it's good.
  • Operating Systems (Tanenbaum) - Reread my 17 year old copy. Still good for basics.
The pile of shame - books I wanted to read Movies I've (re-)watched
  • Wonder Woman (Stream) - pretty good
  • A Wrinkle In Time (Cinema) - wasn't bad, but not awesome either
  • Avengers: Infinity War (Cinema 2x) - ok, 2nd time was in Spanish
  • Black Panther (Cinema and Airplane) - pretty good
  • Tomb Raider (Airplane) - awesome, best movie this year
  • Ghost in the Shell (Airplane) - actually quite good, still would've preferred a Japanese main
  • Ready Player One (Airplane) - really good, but the book is better
  • The Fate of the Furious (Airplane) - not as bad as I thought
  • Deadpool (Airplane) - rewatch
  • Deadpool 2 (Airplane) - first one was better
  • Supercharged Otters (Airplane) - how can you make a documentary about otters that is not good? :(
  • Neat (Airplane) - bourbon documentary, interesting and kinda good
  • Ghostbusters (Stream) - wasn't terrible, but not so good either
  • Kingsman: The Secret Service (Stream) - finally, and it's good
  • Suicide Squad (Stream) - not good
  • American Ultra (Stream) - not good
  • A-Team (Stream) - not bad
  • Jupiter Ascending (Stream) - finally, not so bad as I had feared. Not terribly good either
  • John Carter (Stream) - actually kinda fun
  • Baywatch (Stream) - not so bad as I had feared, pretty funny
  • RED (Stream) - moderately good
  • RED 2 (Stream) - moderately good
  • Fast Five (Stream) - ok
  • Fantastic Beasts 2 (Cinema) - pretty good, first one was better
  • Christmas movies:
    • Arthur Christmas (Stream) - second best christmas movie I know, funniest movie I've seen in a while
    • Die Hard (Stream) - well, this is the best christmas movie :P

I had two long international flights. And then I wanted to catch up on some stuff.

Movies I didn't manage to watch
  • Blade Runner 2049
  • Baby Driver
  • Valerian and the City of a Thousand Planets
  • The Lego Movie
  • Sin City: A Dame to Kill For
  • Veronica Mars
  • Chappie
  • Mara und der Feuerbringer
  • Jurassic World
  • Fantastic Four
  • Straight Outta Compton
  • actually bought those and still didn't watch:
    • Thor: Ragnarok
    • Logan
    • Star Wars: Solo
    • Big Trouble in Little China
TV Series I've tried to watch
  • Archie S1E1 (Netflix) - meh
TV Series I didn't watch
  • Wynonna Earp S2 (Netflix)
  • The Expanse S2 (Netflix)
  • The Shannara Chronicles S2 (Prime)
  • Jessica Jones & Luke Cage
CDs I bought
  • Arch Enemy - Will To Power
Concerts attended
  • Wintersun & Arch Enemy
  • The Prodigy (& Slaves)
Other stuff I bought
  • new LCD screen and battery for my x230
  • 8 GB RAM for the NAS
  • a new Bluethooth speaker (JBL Go2), because the MillSO stopped working
  • Tai Hao Triple Play keycaps from Massdrop
Comics I read
  • Web comics:
  • Paper:
    • Several Dork Tower, Sandman (Neil Gaiman), Miss Marvel, She-Hulk
Social network usage
  • Twitter - no change - regularly, not overly much, more reading and answering than writing
  • Facebook - not checking it regularly, no more active messaging now
  • Instagram - posting a photo from time to time, checking others' stuff once a week
Messaging
  • IRC - daily use, default communication channel for many people I communicate with
  • Jabber - still practically dead this year
  • Email - same as usual
  • Slack - using three communities, sparingly
  • Matrix - started using it in Oct/Nov - it kinda works
  • WhatsApp - replaced FB messenger
Trips
  • Belgium (FOSDEM) in February
  • Croatia in May/June
  • Austria in June
  • Netherlands in August
  • Mexico in September/October
  • Berlin (Qt World Summit) in December
Online services
  • Still subscribed to Netflix
  • Still using Tarsnap, but less
Programming languages used, roughly in order of hours spent
  • C++ - work, I like it a lot more than I had thought
  • bash - still too much
  • Python - work and a few private things, deployment and packaging is still hell
  • Rust - still learning
Podcasts I listen to

Very irregular this year:

  • Battle Bards - "A musical journey through MMO soundscapes"
  • ATP - I'm not using any Apple products and still listen to these guys sometimes.
  • noclip - awesome documentaries/podcasts
  • some real gaming podcasts, but even less regularly

TLDR: This is even less quantifiable than last year, I'm kind of confused where all the time went. Didn't watch much in the first half of the year, didn't read, didn't play much. Played more in the second half of the year and watched a few more movies than in the last years. No shows that take a lot of time though.

https://f5n.org/blog/2018/2018-in-review/
The Stack - Week 46/2018
Show full content
Books/Algorithms C Living Math Matrix Windows WTF
https://f5n.org/stack/2018/week-46/
The Stack - Week 44/2018
Show full content
Admin Algorithms Audio Badges/Defcon Bash Books C++ CI Communication Docs ESP8266 Fonts/Windows Fun Game Development Games/Consoles Games/History GDB Graphics History IRC/Slack JavaScript
  • gothinkster/realworld - "The mother of all demo apps" — Exemplary fullstack Medium.com clone powered by React, Angular, Node, Django, and many more 🏅
Markov Math Python REST/HTTP Rust Security Travel Video/Peertube Writing
  • ocean1/awesome-thesis - A curated list of practical tips and tricks to help you achieve an awesome CS master thesis
WTF XMPP
https://f5n.org/stack/2018/week-44/
i3 and KDE 5/Plasma
Show full content

I've had used i3 from time to time in the past but I was still a staunch supporter of xmonad, so when I got a new work laptop in late 2017 I of course tried to use xmonad, as I have been since early 2012. But for some reason it didn't really work on Ubuntu 16.04 (neither 0.12 nor 0.13) so I switched to i3.

There's one feature I was missing though, in multimonitor mode I absolutely need the screens to switch places. Gladly someone wrote a helpful addon, but I had to poke around a bit.

Anyway, now it was time to upgrade my work laptop to Ubuntu 18.04 and after having a look at the live cd I was very impressed with Kubuntu, so I wanted to try that. But there's a dilemma: Plasma is no tiling wm.

So I went to look around bit and found some configs, which I had to modify a little and now it seems to work a bit. (Source 1 and Source 2)

The key lines in the i3 config file seem to be:

exec --no-startup-id wmctrl -c Plasma

for_window [title="Desktop — Plasma"] kill; floating enable


for_window [class="plasmashell"] floating enable
for_window [class="Plasma"] floating enable
for_window [title="plasma-desktop"] floating enable
for_window [class="Plasmoidviewer"] floating enable

# Float by type
for_window [window_role="pop-up"] floating enable
for_window [window_role="task_dialog"] floating enable
for_window [window_type="dialog"] floating enable
for_window [window_type="menu"] floating enable


#focus_follows_mouse yes

no_focus [class="plasmashell"]
no_focus [window_role="pop-up"]
no_focus [window_type="notification"]

focus_on_window_activation none

To get xmonad's screen switching behaviour I had to comment thse lines:

#bindsym Mod4+1 workspace 1

and replace them with these:

set $x_switch exec --no-startup-id ~/.config/i3/i3-wk-switch/i3-wk-switch.py
bindsym Mod4+1 $x_switch 1
bindsym Mod4+2 $x_switch 2
bindsym Mod4+3 $x_switch 3
bindsym Mod4+4 $x_switch 4
bindsym Mod4+5 $x_switch 5
bindsym Mod4+6 $x_switch 6
bindsym Mod4+7 $x_switch 7
bindsym Mod4+8 $x_switch 8
bindsym Mod4+9 $x_switch 9
bindsym Mod4+0 $x_switch 10

Here's my current config without the above modifications at the time of writing.

https://f5n.org/blog/2018/i3-kde5-plasma/
The Stack - Week 36/2018
Show full content
React/JavaScript Remote/Work RPG RSS Rust Rust/Qt/GUI Rust/Web Science Fiction/Movies Security Serverless Software Sound/Hardware Terminal Ubuntu/Security VIM VPN/Wireguard WM/X11 XMPP
https://f5n.org/stack/2018/week-36/
The Stack - Week 35/2018
Show full content
Games/Consoles Hardware/Retro/VAX History/Languages History/Retail IRC Keyboard Languages LEGO Linux/CLI Lisp/Common Lisp Maps Math Machine Learning Monitoring Monitoring/Linux Music OCaml Org-mode/Emacs Postgres Privacy
https://f5n.org/stack/2018/week-35/
Mechanical Keyboards
Show full content

It's a nice and sunny cold and rainy Saturday and I noticed I have never written about keyboards, but I did post a few pictures on the Fediverse, so I thought I'd rather save them in a proper format.

At the time of writing I own 4 mechanical keyboards (and a handful of old non-mechanical ones, all unused - the newest of them is probably 7-10 years old already), of which I use two on an almost daily basis.

Logitech G710+ MX Brown
Logitech G710+ MX Brown

This is a Logitech G710+ MX Brown with a German QWERTZ layout. I bought it in February 2018, on ebay, for 60 EUR. I had successfully put off getting one for so long that I didn't get a new one. Whatever. It was described as lightly used, as good as new - I had problems with the included USB hub, but I couldn't care less. It was clean, had no blemishes, and everything works perfectly. I use this on my main workstation/gaming machine (Windows 7) after I had used a Logitech G10 for close to 10 years (or maybe 12? I don't remember). The color was coming off the keys already, the LEDs were fading, it was becoming very hard to clean... But I already miss the 3x4 additional G keys when playing MMOs, but it's ok.

Noppoo Choc Mid MX Black
Noppoo Choc Mid MX Black

This is a Noppoo Choc Mid 87 MX Black, with a Tai Hao Sunshine Keycap set from MassDrop. I've had this one since July 2013 (so 5 years now) as a work keyboard, and got a nicer keycap set in early 2016. I originally wanted a rainbow one, but then settled for Sunshine as it was available at the time and I didn't regret the choice. This is the best keyboard I've ever had (since 1994) and I hope I can use it for a few more years.

Noppoo Choc Mini MX Black
Noppoo Choc Mini MX Black

This is a Noppoo Choc Mini MX Black ANSI US International NKRO, I bought it in July 2012 for 88 EUR after having either this one or another Mid at my workplace back then. So this was my 2nd Noppoo Choc already. I'm not happy that the INS key is only available via Fn, and the arrow keys could be more prominent, but it's ok. Would be a cool travel keyboard if it had a detachable cable and was a bit lighter.

Motospeed Inflictor CK104 Blue Switch
Motospeed Inflictor CK104 Blue Switch

This is a Motospeed Inflictor CK104 Blue Switch I bought in April 2017 for 41 EUR. This is a pretty nice keyboard, it was cheap and because I bought it for the sheer fun I took the white+rose gold version, not my usual color scheme. I think it doesn't have original MX Blues but they feel similar. It's absolutely not usable in an office, or anywhere with people around, and I personally don't even like Blues that much. But I now know that for 40 EUR, instead of 100+ for a "proper" keyboard.

I don't plan to buy more at this time, but who knows what the future will bring?

https://f5n.org/blog/2018/mechanical-keyboards/
The Stack - Week 34/2018
Show full content
Algorithms Android/Lisp Art Audio BSD/Games C++/HTML CDN Chrome Design Distributed Editors
  • Leo's Home Page
  • arximboldi/ewig - The eternal text editor — Didactic Ersatz Emacs to show immutable data-structures and the single-atom architecture
Emoji/Icon/Design Fediverse/Mastodon/ActivityPub Fun Game Development
https://f5n.org/stack/2018/week-34/
SSL enabled
Show full content

So the word is that Chrome displays "Your connection to this site is not secure" as of two weeks ago. I'm not debating that.

Most of the websites on this host were already given SSL certs by Let's encrypt over the last year, this one and 2-3 more were missing, I just fixed that, the canonical URL is now https://f5n.org - permanent redirects should be in place.

https://f5n.org/blog/2018/ssl-enabled/
Lunar eclipse
Show full content

So yesterday the lunar eclipse was supposed to be seen quite nicely and as I usually complain that my balcony only gets sun during breakfast time and is no use to sit there in the evening because it's going out to the east... at least I could try to watch the lunar eclipse from 21:30 to 23:13 (00:54).

Pictures (taken with a Sony DSC-RX100) aren't terribly good, but it was what was available and still ok.

I know I've been doing it wrong, I like the last two pictures taken at 00:30 when the real eclipse was already over a lot more.

Oh and of course I had to be reminded to actually post some photos...

23:29

23:30

00:35

00:36

https://f5n.org/blog/2018/lunar-eclipse/
Linux and Multimedia
Show full content

I've been using Linux on the desktop for quite a few years now, on work machines exclusively since 2010, and casually for a while longer. Also all my private Laptops have run Linux at least in dual boot since 2004 or 05. The one thing I've never been happy about is sound though. It usually works well enough but then again I've never tried to do anything advanced.

Yesterday I had friends visiting and wanted to play some music in the living room (something I don't usually do) and so I grabbed my T460p (running Debian Stretch) and started the first full-blown desktop environment I had installed, which happend to be Cinnamon 3.2.7 instead of my daily driver on this machine, XMonad (running i3 at work, because I'm on 16.04 there).

First there was the problem of getting the MP3s from the NAS mounted. I don't know when they renamed smbfs to cifs-utils but I don't use this stuff often enough to have remembered, but the name does ring a bell. Surprisingly, Cinnamon's file browser (nemo) recognized the network mounts without any user intervention already, but I couldn't drag and drop folders to Rhythmbox for whatever reason, so I did mount the folder via CLI. Still didn't work so I switched to Clementine. (Somehow I don't seem to need a graphical file browser more than twice a year.)

The TV was instantly recognized as an external screen, mirroring worked (not a surprise, I hardly know problems with external monitors) but sound didn't go over HDMI. This could quickly be fixed via Preferences, Sound, Switch from Analog to Digital, though. This seems to be PulseAudio, but unlike pavucontrol and friends, it was easy to use.

Annoyingly, the screensaver kept on activating and killing off the sound over HDMI after 10 minutes even though I disabled it. I somehow got it really deactivated after a few tries though.

So, the only takeaway is that while I prefer total control via xmonad or i3, managing external screens manually with scripted xrandr, etc - sometimes it's really nice to have some GUI dialogs for stuff you don't have time to read up on or only use once every few years.

Yes, maybe not surprising to people who haven't stopped using Gnome et al. many, many years ago - I was pleasantly surprised to get everything running in a mere 5 minutes. The only thing Windows 10 does better (depending on how you see it, but for this use case..) is automatically switching sound to the external TV when connecting HDMI.

Despite this nice experience there are indeed a few problems with cinnamon. First, desktop scaling - there are 2 options, Normal (which is too small), and Double (which is too big). Also all the Preferences are a bit weird to access in the "Start" menu. Sure, might be nice to save click to start the one you need, but more likely it's a fair bit of scrolling and you need to know that "System Settings" is the one with all the preference dialogs in them.

I've had a plan to try out some parts of xfce in addition to xmonad/i3, some of those audio/display preferences might come in handy. Also, one day I will remember the "logout" key bindings for xmonad/i3 and not have to kill X to logout :P

https://f5n.org/blog/2018/linux-multimedia/
20 years
Show full content

As the topic came up at work this week and I've also been thinking about it for a while and still nearly forgot, this May marks my 20th anniversary of being online.

We've had computers since Christmas 1994, but no internet connection, and I wasn't old enough to be interested in much besides games and getting to know DOS and Windows 3.11 (mostly to get games to run, to be fair - damn you emm386, himem, mouse drivers, config.sys and autoexec.bat). In 1995 until 1997 I saw the first websites advertised in magazines, but it wasn't a huge draw. I started visiting LAN parties in 1997 and people with access to the internet brought some interesting things with them. I learned about Back Orifice, NetBus, MP3s, and other stuff. I don't even remember if I was really adamant about getting online.

In May 1998 we got ISDN at home and that started the online part of my life. It wasn't really different than dialup via modem, just that we had internal PCI Fritz!-Cards, logging in went a little faster and a lot more silent, and the speed was a bit higher (64kbit/s instead of 56kbit/s for the faster modems). It was still dialup with costs per minute (or second). I think we went through at least a dozen ISPs in those first two years, always taking advantage of the cheapest option at the time (sometimes nightly was better than daily, sometimes it rounded full minutes, so just checking something was better by second, whereas longer sessions were better with a one-time fee for the first 1 or 5 minutes, and so on). Some I remember were germany.net, okay.net and a few others. At some point I was even an AOL customer. It was also a time of hopping between email accounts from various providers and some freemail providers until I secured the first domains in 1999 (iirc).

There was also RivalNet, a local gaming dialup provider that didn't give you access to the internet, but to a spiced up chat, internal newsgroups, and most importantly, the ability to play games, sometimes even ones that didn't work so well over normal internet connections.

The first flatrate dialup offers for ISDN came in mid-2000 and some of them didn't really last long, Sonnet, MobilCom, NGI are names I remember. Some of them even had some specialized login application you had to keep open that displayed ads.

At some point there came DSL, at that time mostly by Deutsche Telekom, and it was 768kbit down, 128kbit up and I don't really remember the year, probably 2001. Then at some point there was an upgrade 16 Mbit down, 1 up - that was probably 2006 when I moved. Now I'm at 50Mbit down, 10 up and again not sure since when, but I might still have that paperwork somewhere, must have been later than 2009. Maybe I'll try to upgrade to 100 down, but I see no immediate need. So far for the unexciting tale about connection speeds.

At least I was lucky enough to not need the fast unmetered internet access at university, although I did have access to it - but already having a DSL flat rate at home worked out 99%, maybe unless grabbing a huge ISO that could wait a day or two.

So that's 20 years of using the web, 20 years of using email, ~19 years with the same primary email address, what else? I have an 8 digit ICQ UIN with a leading 1, that also makes it from late '98 or early '99 - I haven't used it in years, but I can still login - also I based my mobile phone numer on it (just left one digit off) and I got that one in 2001. Not sure when I first used IRC, that must've been summer 2000 because in 2001 I went to HAL2001 and met up with people I knew from IRC for a while.

From a hardware perspective, I already mentioned the Fritz!-Cards, of which we had at least 2, maybe 3 in the house. At some point I installed the first Linux router made of spare computer parts in a big tower sitting in the basement. I think I used FLI4L, Gentoo, and SuSE and then finally settling on Debian. As an aside, the process for joining as a Debian Developer back then was so elongated ("expect a reply in a few months") that I simply stopped bothering and always stuck to projects where I could start with a few drive-by commits and maybe stick around for a few years then.

I only have a SuSE 6.2 manual here, so I really don't know if this also marks 20 years of Linux or only 19, I do remember getting some Red Hat version in a magazine as my first distro, maybe I still have it somewhere.

The third anniversary is 19 or 20 years of programming, but again I can't really pinpoint it down to the month. My first experience was Turbo Pascal in an elective subject in 6th grade, but it was mostly typing up listings and it was DOS and I didn't really like it. I had a lot more fun when I could generate or parse HTML and put stuff online. The first meaningful program I remember was generating HTML playlists from M3U files (that was before WinAmp had that feature, I might add), written in Visual Basic. On the web front I started with SSI (Server Side Includes, not a proper programming language) and moved to PHP3 quickly. That also landed me my first jobs as a programmer, but that's for another day.

So to summarize, 1998 was pretty important and I may not have ended up as a software developer if it hadn't been for that first access to the internet and the subsequent years.

https://f5n.org/blog/2018/20-years/
The Stack - Week 20/2018
Show full content
Algorithms Backup Books/Finland C++ Comics Conferences Design Docker Economy Git
  • jonashaag/klaus - pip install klaus -- the first Git web viewer that Just Works™.
Golang Internet IRC
  • 42wim/matterircd - Connect to your mattermost or slack using your IRC-client of choice.
Keyboards Language Languages/Hardware Maps Music Network OSDev/History PHP Physics Rust/Qt Skateboarding Startup VPN
https://f5n.org/stack/2018/week-20/
The Stack - Week 15/2018
Show full content
API ARM Audio Bash/OpenGL C++ Demoscene Development IRC Linux Maps Postgres rsync Security TV
https://f5n.org/stack/2018/week-15/
The Stack - Week 14/2018
Show full content
C CLI
  • Seashells - "pipe output from command-line programs to the web in real-time"
Compilers D-lang
  • DiamondMVC/Diamond - Diamond is a powerful MVC / Template Framework written in the D Programming Language, inspired by ASP.NET using vibe.d as backend.
Game Development i3
  • greshake/i3status-rust - Very resourcefriendly and feature-rich replacement for i3status, written in pure Rust
Language Maps Math Network/Game Development Rust Screensaver SQL/CSV
  • dinedal/textql - Execute SQL against structured text like CSV or TSV
Static site generators Travel
https://f5n.org/stack/2018/week-14/
The Stack - Week 13/2018
Show full content
Big Data BSD C++ Diagrams DNS Editors
  • onivim/oni - Oni: Modern Modal Editing - powered by Neovim
Game Development/Maps Games/Consoles Golang/RaspberryPi Hardware IDE Infra IRC Keyboards Linux
  • intoli/exodus - Painless relocation of Linux binaries–and all of their dependencies–without containers.
  • zevv/lsofgraph - lsof to graphviz
  • alols/xcape - Linux utility to configure modifier keys to act as other keys when pressed and released on their own.
Location Network NixOS OCaml OpenBSD Rust Space Sportsball strace TDD Terminal Video
https://f5n.org/stack/2018/week-13/
The Stack - Week 11/2018
Show full content
AWS/make Blockchain C++ Comics Compilers Developers Game Development Games Git Kafka Languages Lisp Linux Movies Network Python/Async Qt/Python
  • mherrmann/fbs - Create cross-platform desktop apps in minutes, not months
Rust Science Security Software Terminal XMPP
https://f5n.org/stack/2018/week-11/
The Stack - Week 09/2018
Show full content
Bookmarks E-Mail Fonts Hardware/Laptop HTTP/Performance Language make Postgres
  • zalando/patroni - A template for PostgreSQL High Availability with ZooKeeper, etcd, or Consul
Terminal WTF
https://f5n.org/stack/2018/week-09/
The Stack - Week 07/2018
Show full content

Just shy a week for a 3 month break, let's hope the regular schedule will continue now.

Ansible
  • Uberspace/paternoster - Paternoster provides users with the ability to run certain tasks as root or another user, while ensuring safety by providing a common interface and battle tested parameter parsing/checking.
Audio/Cli C C++ CI
  • fastlane/ci - Open source, self hosted, mobile optimized CI powered by fastlane
DNS E-Mail Encoding Game Development Git
  • rgburke/grv - GRV is a terminal interface for viewing git repositories
History/Software/Music Identity JavaScript Language Latex Meltdown/Spectre Open Source Qt Reverse Security/Fuzzing Security/Spectre/Meltdown Software/Android Software
  • TreeSheets This seems like a useful replacement of Excel/GDocs for structured lists
VIM
https://f5n.org/stack/2018/week-07/
2017 in Review
Show full content

These review posts have proven incredibly useful when looking up stuff, so I'll continue this tradition.

 

( 2016 / 2015 / 2014 / 2013 )

A bit late this year (last year?) but before it gets too weird:

Non-Board Games I've played/bought
  • WoW - Was playing a bit for the first 4 months of the year
  • SW:TOR - Played quite a lot in autumn/winter, unsubscribed around New Year's Eve
  • EVE Online - Not subscribed, but played a little
  • Guild Wars 2 - Quite a bit, but more randomly in bursts
  • Marvel Heroes - More at the start of the year, and now it's been shutdown :(
  • Mass Effect 3 - Managed to finish it, awesome!
  • Fallout Shelter - Mobile game I played on the PC. hmmm.
Books I've read

Again not much in the sense of vacation and thus not much reading done.

The pile of shame - books I wanted to read Movies I've watched Movies I didn't manage to watch
  • Wonder Woman
  • Thor: Ragnarok
  • Blade Runner 2049
  • Baby Driver
  • Logan
  • Valerian and the City of a Thousand Planets
  • and the 2014 and 2015 lists still stand, minus Edge of Tomorrow and Maleficent
TV Series I've watched
  • Iron Fist S1 (Netflix) - meh
  • Wynonna Earp S1 (Netflix) - awesome
  • Dirk Gently's Holistic Detective Agency (Netflix) - weird, but good
  • The Expanse S1 (Netflix) - good
  • Miss Fisher's Murder Mysteries ~S1 (Netflix) - ok
  • Rick and Morty (stopped after S1E1) - meh
  • Adventure Time (stopped after S1E1, might continue)
  • unCaged S1E1-S1E2 (Stream) - could've been good, wasn't
  • Daredevil S1-S2 (Netflix) - good, not as brutal as I had feared, because people had said that
  • Killjoys S1-S2 (Netflix) - surprise hit, it's a little wannabe-Firefly
  • Punisher ~S1 (Netflix) - didn't like this Punisher in Daredevil at first, but now it's ok
  • Godless ~S1 (Netflix)
CDs I bought
  • a few Iron Maiden albums I was missing
  • Guardians of the Galaxy - Awesome Mix Vol. 1
  • Guardians of the Galaxy Vol. 2- Awesome Mix Vol. 2
Other stuff I bought
  • my first Bluetooth item - a speaker. MillSO BV170 - pretty awesome for 13EUR
  • Kickstarter/Indiegogo - nothing

Wait, that's weird. Either I'm missing something big or I really didn't buy any unusual stuff. Hmm...

Comics I read Social network usage
  • Twitter - no change - regularly, not overly much, more reading and answering than writing
  • Facebook - no change - maybe a few more posts, regularly messaging with a few people
  • Instagram - actually using it, posted a pic a day on vacation and from time to time
Messaging
  • IRC - daily use, default communication channel for many people I communicate with
  • Jabber - still practically dead this year
  • Email - same as usual
  • Slack - using two communities, sparingly
Trips
  • Scotland in June
  • Austria in January and December
Online services
  • Still subscribed to Netflix
  • Still using Tarsnap
Programming languages used, roughly in order of hours spent
  • Java - work, not so bad
  • Python - work and a few private things, deployment and packaging is still hell
  • Go - work and a few small things, not a huge fan anymore
  • C++ - work, I like it a lot more than I had thought
  • Rust - still learning
  • Clojure - still tinkering with multiplex
  • bash - still too much
Podcasts I listen to

Very irregular this year:

  • Battle Bards - "A musical journey through MMO soundscapes"
  • ATP - I'm not using any Apple products and still listen to these guys sometimes.
  • Under the Radar - short and kind of interesting views from app developers
  • some real gaming podcasts, but even less regularly
https://f5n.org/blog/2017/2017-in-review/
The Stack - Week 47/2017
Show full content
Books/Algorithms CSS E-Mail
  • SparkPost/heml - HEML is an open source markup language for building responsive email.
Emacs Game Development Golang Hardware History JavaScript Laptop Matrix Money Movies Music Postgres Proxy Security Security/Passwords Shell Slides Sqlite SSH Technology Themes Tools Windows
https://f5n.org/stack/2017/week-47/
Manic Street Parade 2017
Show full content

Got encouraged to check out the manic street parade, it's called a "club festival" -whatever that means- but a quick listen to their preview playlist got a "live music - ok" seal of approval. It seems to be the second year but I hadn't heard about it at all until last Thursday.

Matthew Matilda @ Pigalle

Not my type of music, but still not bad. Apparently they got moved to this venue at short notice, and the sound check took ages and then there were some sound problems. Still worth a listen. Just need to figure out what kind of music they actually play. Some of it was rock (70s stoner rock?), some of it was blues-y? I am bad with categories.

Facebook | Spotify

Ropoporose @ Südstadt

Sadly only heard 3 songs before they stopped, but I liked them. Need to listen to a few more songs. My first expression was rock/electronic.

Facebook | Spotify | YouTube

Poppy Ackroyd @ Kirche St. Anton

After tha last two this was bit unexpected... but enjoyable, even if a little slow and not making you tap your foot.

Facebook | Spotify | YouTube

Unno @ Pigalle

They were so good I would've been happy to pay for the ticket to just see those 3 guys.

Facebook | Spotify | YouTube

Lambert @ Kirche St. Anton

Guy on the piano accompanied by a guy with a guitar and a guy on the drums, all wearings masks.

Facebook | Spotify | YouTube

Leyya @ Strom

Wikipedia calls them a "Trip Hop Duo" and that's probably correct but I wouldn't have said Trip Hop. Doesn't really matter anyway, I liked them. Unlike the other locations it was a bit loud here, as to be expected with a club/concert sound system I guess.

Facebook | Spotify | YouTube

About the locations

Südstadt looked really nice, would love to see it on a normal night. The light setup in the church was amazing. Strom was a typical club/small concert venue. Didn't like Pigalle at all. And didn't manage to visit Substanz.

TLDR

Saw six different artists/bands I had never heard of for 30 EUR, now I want to listen to more stuff by some of them. Good idea.

Only semi-related, saw a tour poster for Gogol Bordello at Strom, remembered them and now I want to go...

https://f5n.org/blog/2017/manic-street-parade/
The Stack - Week 42/2017
Show full content
Audio/Windows Discord E-Mail Editors Games Golang IRC JavaScript Lua Markdown/Rust Python Rust Rust/Discord Rust/Web Development Security Sql Testing Tmux UX Video VIM WTF
https://f5n.org/stack/2017/week-42/
The Stack - Week 37/2017
Show full content
Cassandra Electron/GUI Fonts Linux Python Science Software/Windows Wallpapers Webpack/JavaScript WTF
https://f5n.org/stack/2017/week-37/
Blogging anniversary?
Show full content

I've kinda stopped blogging regularly, I think I've migrated mostly to Twitter like many people did. Some weeks I found enough interesting (at least to me and as I hope, to my roughly five readers) links to post an update to The Stack, but not much in the way of real content. Words, pictures, essays? Ok, mostly rants. I'm still posting stuff on various websites, but not in this "blog" format, maybe because I didn't want this iteration of "my personal website" to be daily journal back in 2011 when I went live. Maybe for some other reason.

Anyway, I found the oldest posting in one of my earliest blogs - it's dated September, 11th 2000 - at 20:09:48 (not sure if UTC or German time). It's the id:1 post in the database that's run until 2005-06-12 when I completely moved to the blog where I mostly wrote about studying, it's still online and I stopped posting there at the end of 2011, a bit after this site went live. So this is kind of a 17 year anniversary - because I have no clue when I really started, if it was late '98, somewhere in '99, or earlier in 2000, my guess is 1999 as I found another website that apparently went live in '99 - but that first entry talks about a new design and porting content. Sadly the oldest snapshot on archive.org is also from September 2000 and it has no content at all - so I just don't know when I moved to that domain and I also don't remember if I was already blogging on that Geocities website I had before.

Summary, because I kept having to amend stuff all the time:

  • 1999? - 2000-08 :: Geocities?
  • 2000-09 - 2002-12 :: first blog on own domain
  • 2003-01 - 2005-06 :: blog at munich.art-core.org
  • 2004-10 - 2011-12 :: blog at codeschmie.de
  • 2011-06 - now :: blog at f5n.org
  • other stuff
  • 2004-02 - 2005-09 :: first gaming blog about Ragnarok Online
  • 2007 :: second gaming blog about World of Warcraft
  • 2009 - now :: third gaming blog
https://f5n.org/blog/2017/anniversary/
The Stack - Week 34/2017
Show full content
Art AWS Books Compilers Docker Flying Games Graphics Icons Money MySQL OSDev Software WTF
https://f5n.org/stack/2017/week-34/