๐Ÿ’พ Archived View for laniakea.rodoste.de โ€บ md โ€บ journal.md captured on 2024-07-09 at 00:02:29.

View Raw

More Information

โฌ…๏ธ Previous capture (2023-12-28)

-=-=-=-=-=-=-

# record the screen and save as .gif

2023-12-14

A relatively simple program to record a section of the screen and store it as animated gif

The commands available on the Linux shell are *much* more powerful than one thinks. Case in point:

I had the need to record a small section of my screen and convert that into an animated .gif to share in an online forum. 

I already had a script that records a video file and was wondering if `ffmpeg` can convert video to gif. Of course it can.

The naive approach yields gifs that look okay-ish, with some flickering pixels and huge in size.

Introducing an intermediate step to extract a color palette from the video first and then encode a gif using the video and the color palette yields fantastic results.

I didn't come up with this myself, the people behind the GIPHY platform were kind enough to share their approach, link below. My script uses the more readable version of their approach.

#!/usr/bin/env zsh

if [ $# -ne 1 ]; then

basename=$(basename $0)

echo "Usage: $basename filename.gif"

echo "records a selection of the screen and saves it as animated gif"

echo

exit 1

fi

gifname=$1

videofile="$gifname.mp4"

palettefile=$(mktemp /tmp/palette-XXXXXXXX.png)

echo "draw selection to record"

geometry="$(slurp)"

stoprecord() {

echo "converting to gif now..."

}

# record video

trap stoprecord INT

wf-recorder -g "$geometry" -f "$videofile"

trap - INT

# create color palette

ffmpeg -y -i "$videofile" -filter_complex "[0:v] palettegen" "$palettefile"

# convert video to gif, using palette

ffmpeg -i "$videofile" -i "$palettefile" \

-filter_complex "[0:v][1:v] paletteuse" "$gifname"

# clean up

rm "$palettefile"

rm "$videofile"


The script works well enough. I'm happy with the resulting files but I'm not happy with how verbose the script is. Oh well, I might improve it later.

One thing I should note is that `wf-recorder` is a tool for the Wayland compositor, it probably won't exist/work if you're using X11, but alternatives will.

## Links

- [GIPHY explaining how to convert video to gif and vice versa](https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/)

---

# a simple docker shortcut

2023-12-08

I found a simple CLI shortcut for docker.

Actually it is an alias for `docker ps -a` which I do use a lot. Typing this isn't tough but what annoys me is that the default output is too broad and that makes finding the right information in a long list of multi-column output tedious.

It turns out you can tweak the table formatting. The command becomes unwieldy but this is what shell aliases are for so here we go:

alias dls="docker ps -a --format 'table {{.ID}}\t{{.Names}}\t{{.RunningFor}}\t{{.Status}}\t{{.Networks}}'"


It lists everything I need to know and it fits on a half-screen terminal on a full-HD monitor โ€” you know, tmux...

That's it, just a quick one.

---

# ๐ŸŽฒ Scoundrel

2023-11-26

A single player dungeon crawler

Thanks to Lettuce for their โ€œe-zine of solo gamesโ€ in which they mention Scoundrel, a game by Zach Gage and Kurt Bieg. It is a solo dungeon crawler of sorts that is played with a single deck of normal playing cards.

Me and the wife have adapted the rules slightly and made it a cooperative game. It is quite fun. Each game takes only ten minutes or so and the minimum space requirements โ€” both in materials to carry and playing space โ€” make it an ideal travel game.

The goal is to slay monsters โ€” you know, as you do in a dungeon crawler โ€” and clear all rooms of the dungeon. If you make it out alive you win. There is a point mechanic but to be honest we didn't care.

## setup

Jokers are discarded before playing, so are Ace, King, Queen, Jack of hearts and diamonds. The remaining cards are shuffled and form the dungeon pile.

You draw four cards and place them face-up. This is a room in the dungeon.

You start with 20 points of health.

## cards

- clubs โ™ฃ and spades โ™  suit are monsters. They deal damage equal to their face value. (A=14, K=13, Q=12, J=11)
- cards of the hearts โ™ฅ suit are healing potions. They heal their face value in points, up to your maximum of 20.
- cards of the diamonds โ™ฆ suit are weapons. They reduce monster damage by their face value, your health pool takes the rest. I guess this makes them more like shields rather than weapons?

## rules and gameplay

The player can heal only once per room, additional healing potions can be discarded but won't have an effect.

Monsters always die after being fought, and are discarded. 

Weapons get used up by fighting monsters. Defeated monsters are placed on top of the weapon (with the weapon face value still visible). From then on the weapon can only fight monsters that are weaker (have a lower face value) than the monster before.

The player can chose to fight a monster bare handed, taking their full damage, but preserving the weapon.

> Example:
> A Eight of Diamonds weapon is equiped. I fight a Queen of Spades monster with it. The queen deals 12 damage, my weapon reduces it by 8, I take 4 damage. From now on the weapon can only be used against Jack-level monsters or lower.

You progress through the dungeon by clearing rooms. For that you need to use at least three of the four cards of a room in order to progress. Rooms can be skipped but not more than one room in a row. Skipped rooms are placed back at the end of the dungeon pile, so you will eventually face the room.

Used cards are discarded. Once one or zero cards of a room remain, you may move to the next room and draw more cards to get back to four.

## two-player variants

So far we've come up with three playstyles work for us:

In all playstyles, all rules from above remain in place. Both players equip and heal from the same four-card rooms as before and fight the same monsters. 

### Truely cooperative gameplay

A player may chose to act as many times as they both agree to. So one player may clear multiple rooms completely and equip weapons if the other player is low on health and there is no healing potion available. 

The flexibility of this game style makes winning relatively easy. It might make sense to remove more high-grade weapons and healing potions or add a second deck of cards (with the same cards removed as outlined above) since that adds more monster damage points than weapons/heals.

### Room-based turns

This is like a relay race. Again both players equip/heal/fight the same four-card rooms but one player is responsible to deal with one room. The other player must tackle the next, and so on.

Honestly this works really well. Cooperation still exists in the form of consciously leaving a heal or weapon of one room for the next player. 

### Single-card turns

Each player gets one action before the next player takes over. One action is using a heal, equiping a new weapon, fighting a monster.

This does require significant amount of planning and talking. This feels like hard-mode.

## Links
- [Lettuce's solo game e-zine <3](gemini://gemini.ctrl-c.club/~lettuce/1x1.gmi)
- [Scoundrel on boardgamegeek.com](https://boardgamegeek.com/boardgame/191095/scoundrel)
- [The official rules as PDF](http://stfj.net/art/2011/Scoundrel.pdf)
---

# signing git commits with GPG

2023-11-09

I had recently written about publishing this blog through git to make it available offline. Signing commits with GPG makes sense for this, to prove authenticity.

We live in a world of fake news, fake images, fake videos, fake revenge porn โ€ฆall of them both manually crafted or AI-generated. Proof of authenticity of content is becoming more and more relevant.

Proof of authenticity is why I GPG-sign my emails. I usually don't and can't encrypt them, because GPG (or PGP) is so absolutely unknown to the wider public. At least my emails can prove โ€” to anyone who cares โ€” that they really originate from me.

If you're curious about proving authenticity of your own emails or even encrypting them so no one except the intended audience can read them: I highly recommend the โ€œemail self-defenseโ€ article by the Free Software Foundation, link below. 

For the last couple of weeks, I am providing this journal through a git repository for offline browsing. How can I prove that the commits are really me, that the articles committed are really reflecting my opinions and that the site hasn't been hijacked or โ€œalternative versionsโ€ pop up, giving an impression of reflecting my views and not someone elses?

It turns out the same principle applies: Simply sign the git commits with GPG. So I've started to do that earlier this month. At least from now on, authenticity can be verified.

It is surprisingly simple, too. You add the GPG key to sign with to your git config and then set a flag to automatically sign each commit. You can do this either globally or on a per-repository level:

# use my key to sign all commits

git config --global user.signingkey 0123456789ABCDEF

# automatically sign all commits

git config --global commit.gpgsign true


New commits will then automatically be signed and you'll be prompted to enter your GPG password every now and then. To verify this works simply call `gpg log --show-signature` after you've completed a signed commit.

If you're annoyed by the frequency at which GPG asks you to confirm the password, you can extend the period: Set `default-cache-ttl 86400` in `~/.gnupg/gpg-agent.conf` and restart your gpg-agent to be asked only once every 24 hours.

I learned all this from an article by Daniel Doubrovkine from 2021, link below.

## why bother?

The question seems relevant. I'm no one important. My ramblings here are on niche topics, and on a niche medium. Who would bother faking my journal and claiming to be me? Probably: Absolutely no one.

Then again, trolls simply exist.

Also, maybe someone finds my gemini page generation scripts useful and adopts them for their own page through an innocent git fork: My commits are now part of their site. 

Fact of the matter is, it doesn't matter how likely it is. I have GPG in place and setting the GPG-signing up takes less time than reading this article. It did cost me nothing, while providing reassurance to me and anyone who reads this.

## Links

- [email self-defense](https://emailselfdefense.fsf.org/en/)
- [my article about providing this site through git](/journal/2023-10-21-read-this-from-git.gmi)
- [signing git commits by Daniel Doubrovkine](https://code.dblock.org/2021/04/16/adding-work-email-to-a-gpg-key-and-signing-git-commits.html)
- [this gemini site through git](git://rodoste.de/laniakea.git)

---

# base conversion script for BASH

2023-11-04

I got tired of starting a calculator or wasting energy by doing an internet query to convert numerical bases so I wrote a script.

> Update 2023-11-08: Emilis reached out and suggested to swap the order of the input parameters. This would make aliassing the script much easier. That's a great idea! Thanks Emilis! The script below is updated as per their suggestion.

Shell scripts are powerful. Each shell command โ€” and there are many of them โ€” does one thing and does it well. It is the combination of these building blocks that multiply their potential.

Anyway.

At times I need to do a lot of conversions between decimal, hexadecimal and binary numbers. Over time I've gotten somewhat okay of doing _some_ of them in my head or simply remembering them. But regardless I had to use a calculator or use a conversion website, which was tiring.

So eventually I got around to writing a short shell script.

#!/usr/bin/env bash

if [ $# -ne 2 ]; then

basename=$(basename $0)

echo "Converts a decimal number into another base"

echo "Usage: $basename target_base decimal_number"

echo

echo "Examples:"

echo " $basename 2 30 converts decimal 30 to binary 11110"

echo " $basename 16 73 converts decimal 73 to hexadecimal 4B"

exit 1

fi

decimalNum=$2

obase=$1

prefix=""

# convert bases

if [[ $obase == "h" || $obase == "hex" ]]; then obase=16

elif [[ $obase == "o" || $obase == "oct" ]]; then obase=8

elif [[ $obase == "b" || $obase == "bin" ]]; then obase=2

fi

# helpful prefixes

if [ $obase -eq 16 ]; then prefix="0x"

fi

targetNum=$(echo "obase=$obase;$decimalNum" | bc)

echo "$decimalNum in base $obase is $prefix$targetNum"


As is usually the case, the actual logic of the script is quite short โ€” in this case: a single line โ€” and the majority is taken up by input sanitation, usage hints and convenience conversion.

`bc` is actually a complete calculator, capable of so much more. But I'm scripting it by setting it to an output conversion base and then simply passing a decimal number.

## aliases

Let's say you need conversion to hexadecimal more than anything else. With the updated parameter order you can make an alias like `alias to-hex='bases.sh 16'` and use it conveniently as `# to-hex 73`. Nice. Thanks again Emilis!

## Links

- [bc on gemini](gemini://freeshell.de/tldr/bc.gmi)
- [https link to the bc man page](https://manned.org/man/bc.1)

---

# why cellular automata fascinate me

2023-11-03

Cellular automata have been fascinating me for a while now. Time to talk about it.

Cellular automata come in all sorts of varieties, in one to any number of dimensions. But to get to the bottom of they do fascinate me it is enough to look at simple one-dimensional cellular automata.

## the basics

A cellular automaton is a system which works on an endless grid. In the horizontal axis one end quite often wraps around to the other one, to form a ring. The vertical axis can in some forms also wrap around (forming a torus), or just continue infinitely, for examples as rows in an output.

The grid consists of cells (x/y coordinates). 

Each cell can โ€” in the simplest cellular automata, which I'm focussing on here โ€” either be alive or dead, active or inactive, binary one or binary zero.

## primer on neighbourhoods 

Whether or not a cell is alive or dead depends on the combination of states of its neighbours. This dependency forms the rule of a cellular automaton.

For 1-dimensional cellular automata, the active world / grid consists of a single row. The neighbourhood which determines the state of a cell are in the previous state of the world: The row above it. Specifically, the neighbourhood of a cell in 1d automata usually consists of the cell directly above it and the two neighbours of that cell:

....LMR....

.....X.....


`X` here is the cell we're looking at, its neighbourhood is the cell directly above it `M`, and its two neighbours `L` and `R`. 

The individual states of these three neighbourhood cells determine the state of the `X` cell.

## Wolfram rules

Stephen Wolfram has formulated a very useful convention to declare what a specific rule for a 1d cellular automaton is:

You can consider the three neighbourhood cell states as three bits of information. For each combination of these three bits (8 possible combinations) we need to determine whether the target cell `X` is alive or dead, 1 or 0.

This realization makes way to a binary notation of 1s and 0s for all 8 combinations. And since eight bits make up one byte, we can conveniently communicate the rule for any given 1d cellular automaton as a number between 0 and 255.

## somewhat well-known 1d automata rules

You may not it by name but most of you will have seen this shape:

1

1 1

1 1

1 1 1 1

1 1

1 1 1 1

1 1 1 1

1 1 1 1 1 1 1 1

1 1

1 1 1 1

1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1

1 1 1 1

1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1


This is the Sierpinsky Triangle. It is a fractal, a self-similar shape. The Sierpinsky triangle can be generated by a 1-dimensional cellular automaton with rule 90. 90 in binary being `01011010`. Just this rule and a single active cell in the top row, will lead to an endlessly growing shape like the one above.

Let's decompose the binary representation of rule 90, `01011010`, to see how it generates that shape:

111 110 101 100 011 010 001 000 <-- 8 possible combinations of neighbour states

0 1 0 1 1 0 1 0 <-- resulting state of the cell


So you see, if only the `M` cell directly above `X` is alive, we have neighbourhood `010` and according to the table above, the `X` cell will die.

But the cell immediately to the left of `X` will have its `R` neighbour as the only alive one (`001`), and as per rule 90 it'll become alive. The same is true in a mirrored way for the cell immediately to the right of `X`: Its neighbourhood is `100`, which also means it'll become active under rule 90.

The cellular automaton calculates all states of all cells in a row based on the cells of the previous one, then repeat with the next row.

Another interesting rule is rule 110, or `01101110` in binary. It generates a somewhat random looking triangle shape. The curious thing about rule 110 is that it has been proven to be Turing complete in a truely infinite grid. That is to say, with the right initial cell configuration (you'd need _lots_ of predetermined cells) you can compute anything. In theory you can implement a whole computer operating system with rule 110. Not that it is practical: It'd be slow and enormous.

A third honorary mention must be rule 30. It also generates random shapes, but the randomness or 1s and 0s in every column is so good that it has been used as a pseudo random-number generator in computer programs.

## about my fascination

Cellular automata exhibit emergent complexity out of very simple rules and preconditions. When you have a single active cell on a grid and a single byte of instructions how to build all future states, you wouldn't think this can possibly lead to anything even remotely complex or interesting.

And yet it does. 

Emergent complexity is everywhere in our world, and cellular automata are a great simple way to shine a light and to simulate a small part of that.

I invite you to take some time with the search engine of your choice and tumble down the rabbit hole of cellular automata. It leads to truely crazy places. And it keeps reminding me that to produce something complex, evolving and seemingly โ€œaliveโ€, we don't need very much. 

---

# better cellular automata in ORCฮ›

2023-11-02

The initial version of cellular automata in ORCฮ› wouldn't let me rest, so I made a better one.

My first version of 1d cellular automata in ORCฮ› [1] was very limited: It could plot a playing field of 18 cells width at most. For some reason my brain wouldn't let go of this and kept returning to the problem of expanding the width.

What I've come up with is a relay system that transmits information over longer distances but also over several time steps. This mandated a stoppable clock to allow signals to reach the other end of the field before being read. 

Ultimately the solution has an elegance in simplicity but it took a couple of hours to figure out. 

I've also rewritten the part that reads the three neighbouring cells from the playing field before calculating the value for the cell to be written. Devine, the creator of ORCฮ› kindly pointed me to the `Q` operator as a better alternative of using three separate `O`. 

- [screenshot: generating Sierpinsky triangles.](/gfx/20231102/1dcellautom.jpg)

.....cVo...Vc.......Cz......................................#.1d.cellular.automata.....version.2.....2023.anmd.#......................................................

.........zCo........dzT1111123456789abcdefghijklmnopqrstuv............................................................................................................

........yV3...Vy....xVa...............................................................................................................................................

..............3Ac.....................................................................................................................................................

.............rVf....................Vr.............................Vr.............................Vr.............................Vr...................................

......................Vy..........1Xf............................1Xf............................1Xf............................1Xf....................................

........Vc..........3A3Y3A1.......Vx.............................Vx.............................Vx.............................Vx.....................................

.Vr...1Xo..........nV6.mV4........af3Q...........................af3Q...........................af3Q...........................af3Q...................................

.fBb.1X..........................4M...Y.........................4M...Y.........................4M...Y.........................4M...Y..................................

..4YY4Io............Vc..........1X0.J..J.......................1X0.J..J.......................1X0.J..J.......................1X0.J..J.................................

....4A4......Vr...1Xo........Vx..42M...J....................Vx..42M...J....................Vx..42M...J....................Vx..42M...J.................................

...wV8.......fBb.1X.......92Xa9..0A0...J.................92Xa9..0A0...J.................92Xa9..0A0...J.................92Xa9..0A0...J.................................

..............4YY4Io.........Vw...0YY0A.....................Vw...0YY0A.....................Vw...0YY0A.....................Vw...0YY0A..................................

................2A4.......a0X8........08T.1.11.1.........a0X8........08T.1.11.1.........a0X8........08T.1.11.1.........a0X8........08T.1.11.1.........................

...............oV6...................a8X............................a8X............................a8X............................a8X.................Vo..............

.....................................Vm.............................................................................................Vn.............20X6.3O............

.........................42O...Vo.20X4t2O..................2O........t2O..................2O........t2O..................2O........t6O................c6X.............

........................z.X...76O.....4X.................x.X..........X.................x.X..........X.................x.X..........X.................................

#.INTERESTING.AUTOMATA.....#...#.l.....rL.......x.............l........r.......x.............l........r.......x.............l........r.......x.............l.......Rl#

#.124:.#..11111.#..........#...#...0.#...............................1...1.......................................................1...1................................

#.110:.#.111.11.#..........#...#...1.#..............................1.1.1.1.....................................................1.1.1.1...............................

#.102:.#.11..11.#..........#...#...2.#.............................1.......1...................................................1.......1..............................

#..90:.#.1.11.1.#..........#...#...3.#............................1.1.....1.1.................................................1.1.....1.1.............................

#..30:.#.1111...#..........#...#...4.#...............1...................1...1.......................................................1...1...........1...1...1...1....

#..16:.#....1...#..........#...#...5.#..1.1.1.1.1.1.1.1.............................................................................................1.1.1.1.1.1.1.1.1.

#...2:.#.1......#..........#...#...6.#.................1...........................................................................................1..................

#..........................#...#...7.#................1.1.........................................................................................1.1.................

#.enter.code.into.Ts.above.#...#...8.#...............1...1.......................................................................................1...1................

...............................#...9.#..............1.1.1.1.....................................................................................1.1.1.1...............

#.VARIABLES................#...#...a.#.............1.......1...................................................................................1.......1..............

#.o:.number.of.rows..const.#...#...b.#............1.1.....1.1.................................................................................1.1.....1.1.............

#.x:.read.and.write.column.#...#...c.#...........1...1...1...1...............................................................................1...1...1...1............

#.y:.raw.row.counter.......#...#...d.#..........1.1.1.1.1.1.1.1.............................................................................1.1.1.1.1.1.1.1...........

#..........................#...#...e.#.........1...............1...........................................................................1...............1..........

#.m:.r2l.wrap.read.row.....#...#...f.#........1.1.............1.1.........................................................................1.1.............1.1.........

#.n:.r2l.wrap.write.row....#...#...g.#.......1...1...........1...1.......................................................................1...1...........1...1........

#.o:.l2r.wrap.row.counter..#...#...h.#......1.1.1.1.........1.1.1.1.....................................................................1.1.1.1.........1.1.1.1.......

#..........................#...#...i.#.....1.......1.......1.......1...................................................................1.......1.......1.......1......

#.r:.read.row.counter......#...#...j.#....1.1.....1.1.....1.1.....1.1.................................................................1.1.....1.1.....1.1.....1.1.....

#.w:.write.row.counter.....#...#...k.#...1...1...1...1...1...1...1...1...............................................................1...1...1...1...1...1...1...1....

...............................#...l.#..1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.............................................................1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.

...............................#...m.#.................................1...........................................................1..................................

...............................#...n.#................................1.1.........................................................1.1.................................

......................................................................................................................................................................


## Links

- [[1] my initial article on cellular automata in ORCฮ›](/journal/2023-10-28-cellular-automata-in-ORCฮ›.gmi)
- [ORCฮ› thread in the lines community forums](https://llllllll.co/t/orca-livecoding-tool/17689/)
- [ORCฮ› on Hundred Rabbits' internet page](https://100r.co/site/orca.html)

---

# 1-dimensional cellular automata in ORCฮ›

2023-10-28

Encouraged by randomly discovering a binary counter, I made a cellular automaton.

I've introduced the ORCฮ› only recently on this gemlog. It's a grid-based system that can generate MIDI messages to be picked up by external instruments, to compose / compute music in a live-coding kind of way.

The thing is, ORCฮ› is not a musical instrument. It is a language. A weird one, made by weird people living on a boat. A minimal one, a cryptic one.

I _love_ minimal, cryptical geek-things.

The other day I created a binary counter in ORCฮ› through a lucky typo. Musical instruments don't generally do binary counters, programming languages do. 

For reasons that deserve at least one separate journal article, I've taken that happy accident and ran with it. I made a one-dimensional cellular automaton.

It is limited by the fact that ORCฮ› โ€” to my knowledge โ€” has no means of counting further than 36. Due to the math I'm doing to calculate cells and their neighbours, the playing field is limited to a width of 36 / 2 == 18 cells. Not very impressive but it does get the message across.

What I _really_ like is that the code can produce all 256 varieties of 1-dimensional cellular automata simply by entering the associated Wolfram code in binary form into the sequence of the `T` operator of ORCฮ›. Another happy accident in a way.

I've tried to make the code somewhat well-commented. It was important to me to keep the code itself compact, to get as much space as possible for the playing field itself. 

I unfortunatelly have no easy way to introduce syntax-highlighting here on gemini so the code will look somewhat crappy in the gemini browser of your choice. It _will be_ somewhat more readable once loaded into ORCฮ›.

#....................................#......#.numeric.pointers.................#

#.......1d.cellular.automaton........#...................Ci......Ci........iCm..

#....................................#.................hAf.1X..1Af.1X.....aA2...

..................................................Ci....wYYwIi..gYYgIi...yVc....

.#.block:.inject.y.offsets.#....................xVf.......0Ve.....2Vg...........

......Vy....................................#.middle.cell.left...right..column.#

....Vyc...Vy....................................................................

.d2Xc.Jd2Xc...#.block:.read.3.neighbour.cells.#.................................

...8..J..5......V0.Vx.V2........................................................

...e0Xc.......6Ae3Af0Ag.........................................................

...............kcOicOgcO......#...read.from.offsets...........#.................

...............4M.2M.1M.......#...multiply.with.powers.of.two.#.................

..............lV0mV0rV0.......#...store.in.variables.l.m.r....#.................

..............#.block:.calculate.child.cell.value.#.............................

................Vl..Vm..........................................................

#write.offsets#.0Y0A0..Vr.......................................................

.......Vy..........0Y0A0........................................................

.....9Bc...Vx.........0B7......#.build.decimal.sum.of.binary..#.................

...i0X3.c0Xf...........78T...1111....#.......T:.Wolfram.rule.in.binary.........#

.....3................f3X......#.write.child.cell.value.......#.................

............#.0.#...............1...............................................

............#.1.#...............................................................

............#.2.#...............................................................

............#.3.#...............................................................

............#.4.#...............................................................

............#.5.#...............................................................

............#.6.#...............................................................

............#.7.#...............................................................

............#.8.#...............................................................

............#.9.#...............................................................

............#.a.#...............................................................

............#.b.#...............................................................

............#.c.#...............................................................

............#.d.#...............................................................

............#.e.#...............................................................

............#.f.#...............................................................

............#.g.#...............................................................

............#.h.#...............................................................

............#.i.#...............................................................

............#.j.#...............................................................

............#.k.#...............................................................

............#.l.#...............................................................

............#.m.#...............................................................


## update: 2023-10-29

I've restructured a lot of the code to make the generator more compact.

While doing that I've also removed the comments. The code is now a bit less readable but with the first version above this shouldn't be an issue.

Currently I'm working on widening the usable playing field to generate wider patterns but I'm suffering a lot of brain-fog today, this will have to wait.

#.1d.cellular.automaton.#..................................

...........................................................

..Ci..............zVo...#.z.is.number.of.rows.to.generate.#

mVeYYYYYYYe.........J......................................

..J.......J.......iCo......................................

hAe.1X..1Ae.1X...9Aa.......................................

.vYYvIi..fYYfIi.yVj....Vy..Vy..Vy..........................

...lVd.....rVf......22Xj12Xj.2Xj...........................

........................Vl.Vm.Vr...........................

......................6Ad.Ae.Af............................

.......................jjOhjOfjO...........................

.......................4M12M.....#.interesting.rules......#

.....................21X4..0...J.#..30.00011110....a.RNG..#

.................Vz........J...J.#..90.01011010.Sierpinsky#

............Vy.1Xo.......4A0...J.#.110.01101110....Turing.#

..........8Bj.1X..........4YY4A............................

...........bYYbIo.....Vm......4B7#.Wolfram.rule.in.binary.#

............h.Xb...90Xe........38T...1111..................

..............................ebX1.........................

..........................#.0.#.........1..................


## Links

- [My journal on ORCฮ› and Sunvox, my music-making setup](/journal/2023-10-22-ORCฮ›-and-sunvox.gmi)
- [ORCฮ› on Hundred Rabbits' internet page](https://100r.co/site/orca.html)
- [Wolfram code for 1d cellular automata](https://en.wikipedia.org/wiki/Wolfram_code)

---

# Tech degrowth is a process

2023-10-27

Progressing to a simpler life takes time, more than anything.

It's been a little over a year now since I've started to be fully aware of the wasteful and energy intensive life I was living. Some things that are just normal now seemed ludicrous back then. And I am acutely conscious of the fact that I'm not actually doing anything drastic yet.

Examples:

Our microwave oven kicked the bucket a few months ago and we simply haven't replaced it. Re-heating leftover food on the electric stove probably isn't saving any electricity compared to the microwave (I have a suspicion it costs more energy) but it is one less โ€œthingโ€ in our home that will only partially recycled at the end of its life. Plus we have some reclaimed space on the kitchen counter which we really value.

Our dishwasher still works but we're not using it either, same for the clothes dryer. We went through last winter without ever needing the dryer and somehow we just stopped using the dishwasher. Washing dirty dishes by hand (we're a two adult household) is _no_ big deal whatsoever and it gives us some more time to talk and just be with each other.

We switched off the TV one evening after finishing the last episode of a nondescript Netflix series and haven't switched it back on since. Its been unplugged from the wall for a while now and I'm certain the remote is dead. We used to eat dinner watching Netflix or some other stream and we do enjoy good entertainment. But now we spend time talking about our days, make plans for the upcoming days and simply _be_ with each other. 

I barely switch on the second monitor on my computer anymore. With tmux in place and generally me working mostly with commandline programs, the need to see two screens at the same time is much less.

My company forced me to get a new company phone the other week. Apparently my 4 year old iphone will stop receiving updates. I politely told them that I had just gotten an update a few days before their request and that a one day batterylife is plenty since I'm spending 80% of my workdays at home.

But no, I had to get a new one. When I asked whether we have something like a Fairphone or similar alternatives to pick from I only received empty stares. Only Samsung or Apple devices. Grmpf. Apple it is then. I'm not happy with either company but I'd rather not have GoogleOS, thank you very much.

I'm seriously considering spending some of my energy to join the โ€œgreen and socialโ€ initiative we have to make a change there.

Buying local produce and valuing quality over price is another thing. Local food produce is the thing everyone thinks about first. But there is more. I have a leather laptop slingbag for work. It feels good to use it. One of the hoops that hold the shoulder straps snapped the other day. So I found a local leatherworker and gave the bag for repair. It cost me 50 โ‚ฌ to get it done, plus three hours with public transport to bring and take the bag. Totally worth it. The bag is fantastic and the craftsman did an awesome job. That new hoop will probably outlive me. Not only did I get to keep a piece of equipment I really enjoy, I did a small part in keeping a local artisan in business and had a very interesting chat with him.

For 50 โ‚ฌ I can easily get a nylon slingbag made in China and moved halfway across the globe while paying Amazon. No thanks.


Anyway, what is my message here? We all can change something in our lives toward degrowth. The first steps probably won't be drastic. But they'll put something into motion, form a new normal, from which we'll take another step. And another. I'm very certain that this a way forward we can all take.

---

# I made a binary counter in ORCฮ› by accident

2023-10-26

Pretty much what the title says: I made a binary counter in ORCฮ› by accident.

It does work in all four directions (n, e, w, s) but I like w best since you can see the digits move more nicely.

#.binary.counter.

.........D4......

..........Y.H.D2.

.........30xw.*..

.#.#.............

..#.1...........#

..#.0521........#

..#.2152631.....#

..#.42684268421.#


## Links

- [ORCฮ› on Hundred Rabbits' internet page](https://100r.co/site/orca.html)

---

# ORCฮ› and Sunvox

2023-10-22

User Nono on Bubble suggested to share Sonic Pi creations over gemini since it is essentially text. Well I don't use Sonic Pi but I do like the idea so here we go.

## an introduction of sorts
Sonic Pi is a program that allows you to โ€œprogramโ€ music, quite literally. It is one of several environments that form the โ€œlive-coding musicโ€ subspace. All of these environments allow the code to be tweaked while the song is playing, allowing for a performative element. There are even algo-raves. I mean of course there are.

If you're curious, find artists like โ€œDJ_DAVEโ€, โ€œdeerfulโ€ or โ€œLil Dataโ€ on YouTube. There are more of course, these were mentioned in the thread on Bubble.

Since compositions are essentially code (text) it is easy to share them and doing so doesn't take much bandwidth. 

## me in all this
I dabbled with Sonic Pi but I don't like it too much: It is a coding IDE. And I stare at similar pieces of software most of my days at work. So when I dabble in music in front of my computer, I prefer the ORCฮ› system by Hundred Rabbits. It is quite esoteric but that's why I like it: It takes my mind to new spaces. It has a puzzle element to it in the sense that getting it to do certain things isn't always straight forward.

So I'm using ORCฮ› to generate tunes, beats, and such, but ORCฮ› merely generates MIDI notes (or OSC, or UDP) โ€” it cannot make sound. I'm using Sunvox for that. Sunvox originally is a tracker but I have never used it as such. It has a variety of nodes that can be interconnected to create instruments and effects.

I've made a standard instrument template with Sunvox that is MIDI mapped to ORCฮ›. The combination is good enough for what I do.

If you're curious, you can download the Sunvox template below. 

My latest ORCฮ› composition is this:

#.floating.in.Laniakea.#..#.random.melodies.#

#.set.BPM.to.60........#..........Dd.........

............#.kick.#.........................

..............D4.................0r4.........

..#.rnd.key.#..:51C...............34TFCEA....

...R5..R7...#.prime.number.pad.#.77XA.0R4....

...1Y1F2....D2..D3..D5..D7..Db.........13TFAG

.......Y.H...Y.H*Y*H.Y.H.Y.H.Y.H......26XA...

......05xE..00xE02xE04xE03xE01xE#.xylophone.#

.......................................:12C..

.......................................:12F..

.......................................:13C..

.......................................:13F..

.......................................:14A..

.......................................:14A..


Now, I'm aware that if you're unfamiliar with ORCฮ› then this will look beyond crypticโ€ฆ sorry not sorry I guess.

Come to think of it, you can of course play this composition with _your_ MIDI instruments and totally change the feel. 

## Links

- [My Sunvox instrumentation](/music/midimapped.sunvox)
- [the thread on Bubble](gemini://bbs.geminispace.org/s/music/6325)
- [Gemini site of Hundred Rabbits](gemini://gemini.circumlunar.space/users/hundredrabbits/)
- [ORCฮ› on Hundred Rabbits' internet page](https://100r.co/site/orca.html)
- [SunVox Tracker and MIDI Synth](https://warmplace.ru/soft/sunvox/)
- [Sonic Pi](https://sonic-pi.net/)

---

# Read this from git

2023-10-21

You can now read Laniakea offline through git, or download daily-updated Markdown summaries.

I got inspired by an article by Solderpunk to provide my blog articles as easily distributable offline copy through git. Solderpunks article goes conceptually further than I do with my implementation. Nonetheless this was a satisfying experiment.

You can now

1. have a offline copy of this website through git and update it whenever you are online
2. download Markdown summaries of all blog articles in one file and all tui cheatsheets in another
3. use your local git copy from 1. to generate the Markdown files from 2. yourself

## How to do this

### some context

Laniakea (this website) is generated by some commandline tools. This allows me to keep the content separate and โ€œwrapโ€ it in scaffolding that make up headers, footers and such.

If you only want to read my articles offline, this doesn't matter to you. If you want to build a local gemini page to *browse* offline, you'll need Linux, cygwin or something comparable since I'm using `awk`, `sed` and such to get the job done.

### get your offline git copy

git clone git://rodoste.de/laniakea.git


After this you'll find the raw content of my journal in `./journal` and the TUI cheatsheets in `./tui`.

### download pre-generated Markdown files

A chronological archive of all journal entries can be downloaded through gemini:

- [Laniakea Journal](gemini://laniakea.rodoste.de/md/journal.md)

The same goes for my TUI cheatsheets:

- [Laniakea TUI cheatsheets](gemini://laniakea.rodoste.de/md/tui.md)


Both files are markdown-ish. I've taken care to convert gemini links to markdown links. Links to other articles won't work though. Some other peculiarities in gemini script aren't converted to perfectly correct markdown.

The resulting files read fine through a plain-text editor and markdown renderers such as `glow` seem to have no problem either. So this is good enough.

### generate the Markdown summaries from your local git copy

If you have cloned my git repository you can generate the Markdown archives yourself:

./build offline


The .md files will be written to `./static/md`

## conclusion

The idea initially outlined by Solderpunk resonates quite strongly with me. It adds a layer of resilience to online content. In the year that I'm part of gemini space, many of the more interesting articles have already vanished, or changed URLs so I don't find them anymore.

Having the option to clone a git repository solves the link-rot issue almost entirely. Gemini pages are uniquely qualified for this (along with gopher pages) since they are human readable and largely non-interactive. They are text files, essentially.

As such, cloning an entire repository just to read a few articles isn't unreasonable. Text files are small. Even blogs of much more productive writers than myself will hardly ever exceed a few megabyte in size after years of frantic writing.

Interestingly I was hesitant to implement this though. Are my ramblings really relevant enough to offer them as archives and as offline copies? Probably not. What made me decide to go ahead with it is that it doesn't matter.

I'm not putting myself on a pedestal. I don't think my writings are specially important. Maybe this is useful to someone. Laniakea has always been in a git repository, all I've done is provide read-only access and add the Markdown archive generation.

## Links

- [Solderpunks article on content distribution with git](gemini://zaibatsu.circumlunar.space/~solderpunk/gemlog/low-budget-p2p-content-distribution-with-git.gmi)

---

# I finally have offline backups

2023-10-06

My brothers company got hit by an encryption-attack the other week. Time to get an offline backup myself.

So my brothers company got hit by a cyber attack the other week that encrypted all their data, on every server, printer, copier and every client machine that was in the (virtual) network.

The company was smart, having everything backed up on offline tapes. They lost one day of data and one week work to get everything back up and running. I can only assume they took measures to get the infection out, too.

This reminded me that while I believe that I have a reasonable backup strategy resembling 3-2-1 (three copies of the data, two local but on different media, one offsite copy) what I do not have is a cold offline backup. Something that isn't connected to anything and can't be reached no matter how badly the network is infected. 

Time to get on that.

## Starting point

All machines (mine, my wifes, my selfhosting, our phones) do backup their vital data onto a central point in our home network in addition to machine-local backups for most machines. The central backup store then pushes the delta to an offsite hoster in another country weekly.

So all I need to do was to backup everything from that central point.

## Other desires

An 8TB harddrive as backup solution was an obvious choice: It has enough storage to hold all data. It is relatively cheap. It is small and light enough to quickly grab and run in case of natural desaster.

Keeping that last point in mind, I want a self-contained unit. Not only a dumb harddrive with data, but a system that can boot and be used to bootstrap the recovery.

## My approach

The solution I've settled with is this:

The harddrive has a boot partition and a 5GB partition for Debian Bookworm for ARM64 devices. 

A third partition is also 5GB large but empty, this is meant to be free space to create a bootable system for x64 systems. Granted, I probably have to sacrifice the boot partition to swap between ARM64 and x64 but such is life.

The fourth and last partition is an almost-8TB NTFS storage space that houses all backups along with backup / restore tools.

## Setting it up

This section is mostly for my own benefit and serves as documentation.

Getting a Debian image for Raspberry Pi to boot from a >2TB HDD took some time. In the end what worked for me was this:

First, download the debian image and write it onto the HDD with

xzcat 20230612_raspi_4_bookworm.img.xz \

| sudo dd of=/dev/sdb bs=64k oflag=dsync status=progress


Then, convert the partition table from Master Boot Record to GUID. This is the step that allows partitions larger than 2TB and it seems to be crucial to do this _before_ booting that system. Debian will try to expand the root partition to maximum size and that hangs if the partition table is still MBR but the drive is larger than 2TB.

I used the `mbr2gpt` bash script from the usb-boot tools zip file that I found in a Raspberry Pi forum to achieve this, link below.

The system is then ready to be booted and will expand the root partition to fill the entire disk. 

Once that is done, I again reboot into my actual system, mount the backup HDD and re-shrink the boot partition to 5GB. I also add the additional partitions as mentioned above.

Lastly, I can boot back into the Debian system and configure it.

I've kept track of the cornerstone steps of installation in this script:

#!/usr/bin/env bash

# this script ISN'T a 100% faithful recreation of this system

# but it outlines the most important parts that set it apart

# from a baseline Debian Bookworm

# set the hostname to something sensible

hostnamectl hostname backupper

# ensure up to date packages

apt update

apt -y upgrade

# install essentials

apt -y install avahi-daemon ntfs-3g

# install backup / restore related packages

apt -y install ecryptfs-utils clonezilla

apt -y install rsync rclone duplicity

apt -y install zulumount-cli zulucrypt-cli zulusafe-cli

# various utilities

apt -y install git wget tmux

apt -y install figlet lolcat

ln -s /usr/games/lolcat /usr/bin/lolcat

wget http://www.figlet.org/fonts/chunky.flf /usr/share/figlet/

# create a better pre-login banner

figlet -f chunky "I make backups" | lolcat -S 3 -F 0.2 -f > /etc/issue

echo >> /etc/issue

# install a browser

apt -y install w3m

# backup sessions can be long, so here's the original rogue

apt -y install bsdgames-nonfree

ln -s /usr/games/rogue /usr/bin/rogue


The system only has a root user without password. This isn't an issue since the disk will be offline and off-power nearly all the time.

In addition to the steps above I have disabled some daemons, moved SSHd to another port and secured the daemon. I can SSH into the machine with my default key if I ever need to.

## Backup Scripts

Here's an overview of the backup scripts that come with the disk:



Further some tools which were written for the Raspberry Pi but can be used _from_ a running Raspberry Pi to backup mounted disks. They differ in what they can do and whether or not they can shrink backups.



## Other tools 



## Links

- [RonR-RPi-image-utils](https://github.com/seamusdemora/RonR-RPi-image-utils)
- [pi-safe backup utilities. Can't backup the running system, but will shrink backed-up partitions. Useful for SDcards](https://github.com/RichardMidnight/pi-safe)
- [Forum thread where you can download the usb-boot tools](https://forums.raspberrypi.com//viewtopic.php?f=30&t=196778)

---

# This years garden season is coming to an end

2023-09-26

After a long summer and an unusually warm fall, garden season is finally coming to an end. Time for a look at what worked, and what didn't.

Firstly, my tomato plants are still giving fruits but you can tell that the plants are exhausted. It'll end soon. My Chili plants are still going strong. I'm guessing I can bring them in and they keep producing after the outside would be too cold. Interestingly, the Indian chili plant that my wife planted is slowly growing. It is about 15 cm tall now, the bugger takes its own sweet time :D. We'll repot it and bring it inside.

My gherkins are gone for about a month now, but they did give me a bunch more harvests, which have been pickled. That whole endeavour has been a huge success and I'll definitely do that again next year. One thing to note though, I need to keep planting a lot of seeds. Since I want relatively small gherkins to be pickled, and harvesting them triggers the plant to produce more flowers / fruits, I do need a bunch of plants so that one harvest fills at least one, better two, jars. Not a problem, but something to keep in mind. This year I had six plants and that seems to be the lower limit.

We did dial back our efforts to grow herbs this year and focussed on Basil and Sage. The Sage had some issues initially โ€” we think because the pot was overcrowded, it became better when we separated the plants โ€” but it is healthy now. And very tasty! The Basil plants are growing nicely as well and keep providing us with enough leaves for the occasional homemade pesto and fresh leaves to put on pizza. We hope that we can bring the plants inside as well and let them overwinter.

The salads didn't really work. One plant decided to finally grow a few weeks ago and gave some edible leaves. But it is growing long as it is growing towards the light. Something to keep in mind next year: Put the salad in a spot with more direct sun. The salad plant is growing flowers now, I want to see if I can get seeds from that, for next year.

## About the attainable food crafts

I wrote about attainable food crafts earlier this year (link below), let's have a look at what I achieved:



So the only food craft from that list that would be attainable in our current living situation and that we haven't tried is growing mushrooms. Simply didn't get around to it. 

I guess the take-away here is that everyone can get back to the roots and grow some stuff, even in small appartments. Good to know!

We do have some ideas about what we want to grow next year, but we also want to shift houses, so we will have to see what our future situation will be. One thing that I will start in a couple of days though is to plant one tomato seed per month and put it inside, next to our southern window. The idea is that staggered grows would provide us with tomatoes throughout winter, if there is enough sun. We shall see.

## Links

- [Attainable Food Crafts](/journal/2023-05-01-food-crafts.gmi)

---

# One year without a PC

2023-09-11

I swapped my Windows 10 desktop machine for a Raspberry Pi 4 around a year ago. Time for a resume and asking โ€œwould I do it againโ€?

Let's start with the big question: Would I do it again, knowing what I know today?

Well, yes and no. I'm much more happy with the streamlined, terminal UI based workflow that I have now. I feel more focussed and *way* less distracted. I spend less time procrastinating and I'm not really missing much. So that way it was totally worth it.

What I wouldn't do exactly in the same way is migrate to an arm64 platform, on Manjaro Linux. Some apps are simply not available. If I was able to go back in time and tell young me a thing, it'd be that ThinClients exist. They have a slightly higher Wattage but provide a bit more CPU power in return. But most importantly, they're x64, so they'll run anything.

## biggest issue: the internet 

It's ridiculous how fat the internet has become. Firefox is *by far* the slowest application I use. LibreOffice is orders of magnitude faster. So is Inkscape or Gimp. Maybe Chromium would be a slight improvement but I refuse to use it.

Sadly, there is no universal workaround to a โ€œproperโ€ browser. I keep trying w3m but most of todays internet simply doesn't work or isn't readable in a CLI browser. This includes Wikipedia, which is a shame.

Aside from w3m there are two tricks I have up my sleeve:

First: Download as markdown. I'm using pandoc to download a website and store it locally as markdown. This works well for content-rich pages like coding documentation, wikipedia, long-form articles. I guess I could download the pages as html with `wget` but that wouldn't solve the slowness of the browser.

Second: RSS feeds. My most common usecase is to subscribe to the RSS feed of YouTube channels and download the videos as .mp4 through `yt-dlp`, then watch via `mpv`. A few simple shell-wrappers help a lot with that. I've also subscribed to various news pages through RSS, which saves me the trouble to open their website.

## other issues

Other than the aforementioned internet, there's not much that really hurts.

Like I said in the intro, some things are simply not available on arm64. One of them is zeal, an offline documentation reader. It sounds great to be able to read all coding documentation offline (see above for internet woes ;) ). But it's x64 only. Oh well, I'll make do. And here wget really helps in downloading documentation. It's not impractical but if I could to the whole thing without connecting to the internet at all, that'd be great.

Games. Yes I admit it. Sometimes I want to play a game that isn't TUI. There is โ€œEndless Skyโ€ but it hasn't gripped me. There's โ€œOpenTTDโ€ which is nice. But sometimes I really want an indie game that is on steam.

## Links

- [yt-dlp: a YouTube downloader](https://github.com/yt-dlp/yt-dlp)
- [Zeal: an offline documentation browser](https://zealdocs.org/)

---

# So it's been a month, huh?

2023-07-18

About time for an update...

Oh wow, it has been a month since I posted here. Seems like old habbits got the better of me again and I stopped writing. Not because nothing happened, but because that is what I do sometimes.

So what has happened...

## Let's start with the Garden.

The Tomatos are just now turning ripe. They're very small โ€” a bit bigger than cherry tomatos โ€” which wasn't expected but they're tasty. Need to do better research what kind of tomato seed to buy. Oops.

I've already harvested two batches of gherkins and pickled them. All in all around half a kilo of them. This is surprisingly little considering it is seven plants. It's too early to tell how the pickling turned out, they're still in the basement fermenting or whatever you call this :).

The potatos will soon be ripe I think, so will the chillis and the onions.

The dill only did kind-of work. Enough for the pickling and some recipes but I believe the pot is too small / low for the plant. Will try a bigger pot next year.

Salad didn't work at all. Our balcony is too hot I believe, I'll have to think of something next time. The ginger never grew either.

I might have written about this already but me and the wife *finally* managed to go pluck strawberries on a field this year. We plucked a total of six kilos of the stuff and spend the rest of the weekend processing it into jam (I'm *extremely* happy how that turned out!), drying it for my musli, and other things. A good haul, next time we need more :)

## My de-clouding project

(this is the ongoing process of me reducing my presence in the cloud)

I have managed to move a few websites from a very old server of mine to a newer, smaller one and shut down the old one. This marks the end of an era, that thing was online for 8 years or so. Two associated domains were also cancelled. This in combination will save me a bit of money.

The only downside of this is that I've lost my Vaultwarden for work and have to make do with what the company offers. Oh well, I'll live.

## Gadget use

I'm using my smartphone less than one hour per day on average for the last couple of weeks. Pretty happy with that. Before recently I was using it a little over 2 hours on average. 

To be honest I'm not entirely sure what I changed. Oh, yeahโ€ฆ Reddit have become greedy and killed their third party apps. That'll be a good chunk of the hour of my life I got back.

## Game development

My c++ project is slowly chugging along. I'm quite happy to report that I'm not causing a null-pointer exception or other creative means of segfaulting every single time. Seems like I'm learning somethingโ€ฆ yay.

It is still too early for any details of the game here but every now and then I'm thinking whether or not I should add a devlog section to this capsule to keep track of what is happening and to keep myself motivated. Then again I'm thinking I'd rather code than write about what I coded.

## Disillusion

I've gotten *really* tired with what is happening in the real world and with the internet giants lately. So tired that I can't be asked to read about it anymore. Hmm come to think of it this is probably another reason why I stopped writing here.

Reddit effectively killing their third party apps and alienating their mods is one thing.

Microsoft having concrete plans to make Windows itself a cloud system is a new low for them in their struggle to bind their customer base to them. 

I never cared for Twitter, but the fact that Meta isn't launching Threads in the EU because they already know they're violating some gatekeeping regulation due to their account-tie-in with Instagram briefly caught my attention.

I did read an interesting article about how the problem with AI-generate text isn't that we can't tell whether or not *that* text is fake. The problem is that the existance of those texts erode the trust in what is authentic *in general*. So the problem isn't that we trust AI to generate true statements when they're hallucination (although that *is* a problem) โ€” the real problem is that there's a good chance that we will stop trusting *anything at all*.

Add to that a study where large language models trained on the output of large language models show a deteriorating quality. Think about this. AI generated texts are out there and they're not going away.

AI experts writing an open letter about the dangers of their work. Here's a thought: Walk out.

I'll stop myself here.

---

# I am off github โ€” almost

2023-06-17

I'm not going to go deeply into the โ€œwhyโ€, just know that this is part of my getting-off-the-clouds journey and I've grown more and more uncomfortable with the direction Microsoft is taking github as a whole and that they do with the data in there. I encourage you to do your own digging if you haven't heard of it yet, it won't be too difficult to find a few of the more controversial events surrounding github in the last few years.

Anyway, my journeyโ€ฆ In the end this was much easier than expected.

I had already set up a privat gitea instance in May and moved almost all my public repositories there. My vanity took a small hit doing so but realistically no one is really going to miss my stuff. 

Gitea continues to work flawlessly. It is extremely intuitive, offers all functionality I need and it does run on my Raspberry CM4 selfhosted server with around 200 MB RAM being used. That's not bad at all.

What was missing till now is a git repository that is publicly accessible for the few of my repos that actually need that. 

I have one tiny virtual server online with a total of 500 MB RAM so running another gitea instance on that was out of question. I needed something slimmer. 

In the end I've settled with two access routes as described in the official git documentation: Authenticated write-access through SSH public keys, and anonymous readonly-access through the git-daemon.

What this won't let me do is to have complicated control over who gets access to what repository but I believe that I don't need that for a while so this setup is good enough. 

There really isn't much to say, just follow the setup steps in the official manual and you're set. Links below. Overall I believe it took me two to three hours with some testing. My tiny server is happily chugging along unimpressed by the new daemon that's running on it. In fact the monitoring graphs don't show an increase in resource consumption since the git daemon is up.

Ultimately the new setup is less comfortable โ€” I cannot look at repositories and files from the browser, nor can my contributors. But it'll do, I'm sure.

## what is left on github

I do retain my account on github. Plenty of interesting open source projects remain there so I want to have a way to contribute.

Also, I use github as my build chain for docker images. So my account still has some repositories for that. The docker images are built through github actions and the resulting containers are available on dockerhub, quay, and github as well.

## Links

- [Gitea](https://gitea.com)
- [Git server protocol overview](https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols)
- [Git server write access through SSH](https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server)
- [Git Server readonly access through the git daemon](https://git-scm.com/book/en/v2/Git-on-the-Server-Git-Daemon)

---

# world-building in C++

2023-06-16

The bug has hit me again, I'm building a world in a C++ CLI program.

Every now and then this happens. I feel the urge to build a world and watch its inhabitants interact. Sometimes I'm happy to implement cellular automata, sometimes it is the foundation to a roguelike.

This time it is a game that would resemble the โ€œSpace Traderโ€ game of old, or the more modern โ€œโ€Endless Skyโ€ or โ€œX3โ€. A generated universe in which the player takes the role of a trader, pirate, or empire builder. 

I've decided once again to use C++ as language of choise. Two main reasons: One, it is fast and doesn't require any toolchain to talk about. Two, I suck at C++ and want to learn.

It is too early to talk about the game in detail, I'm in the initial stages of world-generation. But I seem to have sparked the interest of an old friend of mine from EVE Online days. 

Stay tunedโ€ฆ

---

# Summer is here

2023-05-29

Looks like spring is over and summer is now here. Time to have a look at our gardening efforts on the balcony.

In case you missed it, we're trying to grow various vegetables on our balcony this year. This post is an account of how the plants are doing, since it seems summer is here.

Oh by the way. If you're wondering about all those wooden skewers in the pots: We have an issue with pigeons routinely raiding our balcony for god-knows-what. The skewers are effective measures to keep them out of our pots. ;)

Oh by the way. If you're wondering about all those wooden skewers in the pots: We have an issue with pigeons routinely raiding our balcony for god-knows-what. The skewers are effective measures to keep them out of our pots. ;)

## Gherkins

One Gherkin plant died, others are noticably smaller than some others. This will be interesting to watch. It is curious that the Gherkins seem to grow thick stems before they grow high.

- [Photo of our Gherkin plants](/gfx/20230529/gherkins.png)

## Tomatoes

They're all doing well. I had transplanted three of the six tomatoes into bigger pots a while ago but sadly didn't have enough pots for all of them. We transplanted the remaining three yesterday. Those transplanted first are noticably bigger (to be expected). Interestingly all the smaller ones โ€” those that were transplanted later โ€” are having flowers while the others are only now starting to bud.

- [Photo of our Tomato plants](/gfx/20230529/tomatoes.png)

## Herbs

We don't have many herbs this year, but they all seem to be doing alright: 



- [Sage](/gfx/20230529/sage.png)
- [Basil](/gfx/20230529/basil.png)

## Chillis

The Indian chilli seeds seem dead. The european ones have grown into about 15cm plants by now. 

- [Chilli plant](/gfx/20230529/chilli.png)

## Onions

For fun we planted some tiny onions in one of the grow bags. Their leaks are growing nicely. 

- [Onion plant](/gfx/20230529/onion.png)

## Potatoes

Two grow bags were seeded with 5 potatoes each. They've been growing like mad. I've topped up the soil three times every two weeks, but now the grow bags are full to the brim. I'm excited about this experiment.

- [Two grow bags chock-full of potato leaves](/gfx/20230529/potatoes.png)

## Ginger

We thought the ginger wasn't doing anything but by now we can see small knobules growing. No stems or leaves yet. This one will take time.

---

# May CLI additions

2023-05-26

I added a commandline cheatsheet for mutt (my mail client) and updated the one for amforai (gemini space browser).

The mutt cheatsheet is not a full step-by-step tutorial, they aren't meant to be. I've done my best to give a structured outline of what I tweaked.

The amfora cheatsheet has gotten an update, concerning http/https proxies and theming.

## Links

- [amfora commandline cheatsheet](/tui/amfora.gmi)
- [mutt commandline cheatsheet](/tui/mutt.gmi)

---

# dithering photos

2023-05-24

I made a short z-shell script to apply dithering to input pictures.

The whole thing started when Skyjake on geminispace.org pointed me to the low-tech magazine the other day. The low-tech magazine operates a solar powered server to host a version of the magazine, fully willing to let it go offline when there is a longer spell of bad weather. One of the many things they do to preserve energy is to convert their pictures to four gray values, dither it for more pleasant looks and apply a tint. 

What I do in my script is inspired by, but different to their final results. I started out to see for myself how big the file size difference actually is but then thought I might one day turn this into something useful.

As chance would have it, today there's a request for such a script on geminispace.

So here it goes, my humble first version of the script. It doesn't check for anything and it requires `convert` from the ImageMagick suite.

#!/usr/bin/env zsh

doTint=1

doGrayscale=0

pastels=("#FEDDB2" "#F0ADDC" "#A47DCA" "#9EC8F3" "#C4F0C2")

color="#ffffff"

if [ $doTint -eq 1 ]; then

n=$((1 + $RANDOM % $#pastels))

color=$pastels[n]

doGrayscale=1

fi

if [ $doGrayscale -eq 1 ]; then

# convert center-crop image, dither it to 8 colors and tint with identified color

convert $1 \

-gravity center -crop 2:1 \

-resize 800x400 \

-colorspace gray -fill $color -tint 100 \

-dither FloydSteinberg -colors 8 -

else

convert $1 \

-gravity center -crop 2:1 \

-resize 800x400 \

-dither FloydSteinberg -colors 8 -

fi


It generates output images in the reduced colorspace of the original, plain grayscale or tinted.
Output looks like this:

- [Earth, in the original colorspace](/gfx/dither-earth-asis.jpg)
- [Earth, in grayscale](/gfx/dither-earth-gray.jpg)
- [Earth, tint variation 1](/gfx/dither-earth-tint1.jpg)
- [Earth, tint variation 2](/gfx/dither-earth-tint2.jpg)
- [Earth, tint variation 3](/gfx/dither-earth-tint3.jpg)
- [Earth, tint variation 3](/gfx/dither-earth-tint4.jpg)

It will print the raw image data to stdout so to use, call it like this:

dither.zsh path/to/image.jpg > output.jpg


or pipe it into an image previewer

dither.zsh path/to/image.jpg | feh -




## Links

- [geminispace.org](gemini://geminispace.org)
- [the solar-powered low-tech magazine](https://solar.lowtechmagazine.com)
- [the convert script from the ImageMagick suite](https://imagemagick.org/script/convert.php)
- [a color palette generator](https://www.schemecolor.com/tools/color-scheme-generator)

---

# Print and Play

2023-05-21

I've discovered the world of print-and-play board games. Oh my god, it is full of stars.

This might very well be the next step in simplifying our lives. Already we've returned to board- and card games, rather than computer games, as part of our entertainment. However, we find it difficult to find board games that meet our criteria: 



โ€ฆand now I've come across the PNP Arcade website and the genre of print-and-play games. These are card or board games made often by single individuals and put online. Often for a small fee, sometimes free. The idea is that you print the PDF(s) out, maybe take a scissor to some of the pages and maybe add some die or counter tokens you have. 

There is no publisher (other than the website that acts as intermediate), no cardboard box, โ€ฆjust you, the PDF and a printer. It is a fascinating idea. 

A bit like the indy scene in computer games, you find all sorts of games in the PNP world, often quite quirky and niche. 

Yesterday we've tried Scuttle!, a pirate-themed card game. Very fun. Quick to learn and one game takes maybe 10-15 minutes.

Also, 6x6 Tales by David D. This one is a die-rolling RPG adventure game. One sheet of paper is the rulebook, a second one is the event index. You can reuse these sheets indefinitely. The third and last sheet is your adventure journal, which is being used up. Aside from that you need two die, as well as a pencil and eraser. Although this is a solo adventure, we had good fun playing it as a team, collaboratively guiding our adventurer through the island. Game progress is highly dependent on your die-rolls but we felt there are enough decisions made by us to feel in control. What we liked especially is the 6x6 tile map that gives the game its name. It starts off empty and you discover the island as you play, sketching in roads and terrain as you go. Infinite replayability. What a gem.

I've downloaded more games but we haven't tried them yet. 

## Links

- [the PNP Arcade](https://www.pnparcade.com/)
- [Scuttle! A pirate-themed card game](https://www.pnparcade.com/products/scuttle)
- [6x6 Tales, a tiny adventure game](https://www.pnparcade.com/products/6-x-6-tales)

---

# Unclouding Report - May 2023

2023-05-18

I've made significant progress to get my data off the cloud.

This is an account of the progress I've made to get my data back onto my own hardware and off the cloud(s).

## GitHub

What feels like the biggest step was getting off github. Well, almost.

After delaying it for way too long I finally installed a Gitea docker instance on my selfhosted server. It was honestly much more streamlined than I was expecting it to be. Human error aside, the whole thing was set up in an hour and I was using the migration feature in Gitea to pull my repositories off github.

What I liked is that if you create an account token on github and give that to Gitea, it can pull the whole repository including releases, wiki, โ€ฆ simply everything, including private repositories. 

I tip my hat to the people developing Gitea. It is amazing. 

Now, what remains on github are some docker images I'm building myself, to use the github actions in order to publish the image to ghcr, docker hub and quay. Gitea cannot โ€” yet โ€” do that, and frankly I'd rather not clog my small selfhosted server with the artefacts required to build docker images.

The only other things on github is one script for the Monome Norns โ€” a fantastically quirky music device โ€” and the raw ingredients to this very website. 

## Google

Github aside, I've deleted three google accounts I had. One was related to one now empty github instance, plus some minor content on YouTube. Others were related to MMORPGs, mostly EVE online. Deleting the accounts was the final step after moving the connected accounts that used the mail addresses to my โ€œofficialโ€ one, downloading whatever I had in Google Drive, getting stuff off YouTube, โ€ฆ the works.

Now I have only two Google accounts left: One for EVE Online and one for everything else. I use both accounts only for gmail, everything else is local. 

Although it irks me that my official mail is feeding the algorithms and surveilance apparatus, I'm still on the fence about moving off of gmail. Gmail isn't going away, and updating _every single email address_ for over 200 online accounts is a pain in the ass. I don't know, maybe I can get off gmail and use an email proxy like DuckDuckGo email to make _an_ address permanent. But then I'm once again trusting that proxy to never go away _and_ them not using /selling the data flowing through their systems.

It's sad that email encryption has never taken off. That would take care of the trust issues at least.

## 2FA 

This next one is a bit of a tangent: I was looking for a FOSS alternative to the Google Authenticator, and I did find andOTP. It does TOTP just was well, gives you access to the underlying secret and allows for encrypted backups. Overall it provides more useful features than Google Authenticator, at a smaller footprint, open source code, โ€ฆ what's not to like.

But then I discovered that Vaultwarden does TOTP as well. I am selfhosting Vaultwarden for all our family passwords, so the data is mine and backups are already in place. Granted, on our phones we still use the official BitWarden app and we're not entirely sure what data is sent home. Vaultwarden is a slimmer, more feature-rich open source alternative implementation of BitWarden, but without a FOSS mobile client as far as I know.

So as a result, both my wife and I don't use Google Authenticator anymore, and we have control over our 2FA secrets.

## Microsoft 

The only thing I have in Microsofts Cloud โ€” aside from github โ€” is a couple of OneNotes. I haven't found a good replacement for OneNote that I can in good conscience enforce upon my wife so that is what it is, for now. I'm not happy about it, Microsoft is extremely visible on my radar these days. Not only do they make up roughly 25% of all blocked DNS requests in our network, they seem to be in the news every other day, and not in a good way. 

Clearly they're struggling. No one _needs_ a new version of Windows, or office. Their line of products is overly mature and they struggle to reinvent themselves. They use their cloud to tie customers to them. That aside, they're extremely intransparent about some telemetry data about their office and Teams products, so much that Germany (or was it the EU?) have ruled that Microsoft Office 365 products cannot be used in compliance with the GDPR. Of course, nothing will get done about it since virtually every company is using Office 365 and Teams. 

Years ago, when Trump was elected US president I was half-joking about earth truely becoming the seed for the Caldari State of EVE online. I still feel that's adequate. If you're not familiar with EVE online, it is okay :).

Let me stop myself there before this turns even more into a tirade. 

## Links

- [Gitea](https://gitea.io/en-us/)
- [Monome Norns](https://monome.org/docs/norns/)
- [EVE Online](https://eveonline.com)
- [DuckDuckGo Email proxy](https://duckduckgo.com/email)
- [andOTP on F-Droid](https://f-droid.org/packages/org.shadowice.flocke.andotp/)
- [Vaultwarden - selfhosted password and secrets manager](https://github.com/dani-garcia/vaultwarden/wiki)

---

# new section: TUI cheatsheets

2023-05-13

I've extended Laniakea to include a new TUI section

I'm talking quite often about my progression toward command line interface (CLI) or text user interface (TUI) programs for my every day use. This is still an ongoing journey and it is not an easy journey so I thought why not document what I use, how I use it and add common keyboard navigation shortcuts to the mix.

This means 



I will not aim for comprehensive how-to-install type articles there. These are done to death and writing those is frankly not something I do enjoy. It'll rather be a growing and changing list of software, brief mentions of useful plugins and customizations. 

Ultimately, this all works for me, your mileage will certainly vary.

## Links

- [my TUI index](/tui/index.gmi)

---

# Attainable food crafts

2023-05-01

We were thinking today about food-crafts that seem simple enough to do as โ€œhobbiesโ€ or passion projects to supplement and enrich the foods that we eat, given the โ€” for now hypothetical โ€” situation of having a home with a garden and ideally some land.

Note that by โ€œsimpleโ€ we're not refering to insta-success, labour-free hacks (those don't exist) but to crafts that have a relatively compact list of skills and tools required.

Those skills will still have to be learned, and mistakes will surely be made. I don't believe there is such a thing in gardening as instant gratification. 

But enough of the disclaimers, here is a list of food crafts that โ€” in theory โ€” sound like each on their own will not become a full-time job and that would add homegrown food to our table.

## bread baking

We are already doing it. There are a bunch of recipes that yield tasty German-stle bread without preservatives or other artificial additives, and without hour-long preparation, planning and kneading.

Somehow we had stopped backing but I eat bread almost every day so since the Spain vacation I've started to bake again.

## Mushrooms

Growing mushrooms does require the right microclimate โ€” two of them in fact โ€” and some care / cleanliness in order not to contaminate the growth medium with other microorganisms that eat the food intended for the mycelium but otherwise seems to be relatively straight foward and hands-off.

There are commercially available mushroom grow kitsโ€ฆ we should try one of those out to get an idea.

Fun experiment for you: The next time you buy those big button mushrooms, take the stem off of one of them and put the head flat onto a white sheet of paper for a day in an area without draft (normal printing paper will do). You might be surprised what you see once you take the mushroom off again. Enjoy!

## Pickling

Pickled sour gherkins, sliced carrots with dill, โ€ฆyummy! I'm sure there is more to explore. Sour gherkins have recently become part of my almost daily diet and we've had amazingly good pickled carrot in Spain. Time to explore this old way of food preservation!

There is one closely-related aspect to pickling that makes it attractive for our long-termin life plan: Aside from a vegetable-patch we hope that we'll be lucky enough to have some fruit tree. 

As any one with fruit trees will know: There is almost guaranteed to bee too much ripe fruit at one time. So pickling would provide a neat way to preserve the excess we can't eat immediatelly.

This leads us neatly to the next food-craft I'd like to learn:

## Jam making

Again, a way to preserve food. In my uninitiated mind this would be more suited to berries and fruits, where pickling is more for the vegetable-end of the garden produce sprectrum.

## Beekeeping

This is more dicey as it involves animals.

Having bee colonies makes sense to me as they help polinate the garden. I don't have a big habbit of enjoying sweet breakfast with honey but I don't dislike it either. So why not try. Surely one of my co-workers that have a few bee colonies will take me in as โ€œapprenticeโ€ for some time.

## Chickens

We use a fair amount of eggs in our diet, so the thought of having a few chicken makes sense. But this seems even more advanced than bees and definitely needs a garden / patch of land.

## Composting

Instead of throwing bio โ€œwasteโ€ away, lets convert it into fertile soil for the garden. That's all the reasoning, reallyโ€ฆ


So yeah, time to get our hands dirty and start to learn what today's city folk โ€” us definitely included โ€” have forgotten. 

---

# Innovation vs. improvements

2023-04-29

Too much of what we do in our industries is improving on products that have long passed a threshold of diminishing returns.

The foundation of what I teach my clients โ€” lean-agile thinking โ€” is easily summed up:

> The world is constantly getting more complex, faster. The management and organizational frameworks that were successful and that have shaped the economic landscape for the last century are struggling in todays' world. Long-term planning and big-upfront design in a complex โ€” and therefore unpredictable โ€” competitive environment isn't economically sound.
>
> The proven solution to this challenge is โ€œiterative and incremental improvements based on empiric feedbackโ€.

That's it, really. Of course the devil is in the details.

The idea is to build an initial version of a product fast and cheaply, and test its acceptance by the market _before_ investing in a fully fledged-out version. If acceptance is not there, stop entirely before major investments or come up with a variation that seems more likely to succeed based on the feedback of the first trial.

Once a successful variant is found, improve it until it is barely sellable and then do so: release.

After initial release, continuously improve the product by showing customers small improvements and keep the feedback cycle going.

Ultimately this requires many paradigm-shifts and a whole new work-culture. But once a company is on its way to transform accordingly, this really works. I'm constantly seeing the benefits for roughly 15 years now, the principles are even older. None of this is new anymore.

What companies and their people often forget though is that continuous improvements โ€” in fact any form of improvements โ€” cannot, and are not intended to, replace innovation and that many products these days are more than good enough and improving on them further does not automatically create a product variant that is better.

The inner-city bus I talked about a few posts ago is one example of this, link below. Multi-blade disposable razors which long-term are more expensive and immediatelly provide an inferior shave than traditional safety razors are another one. A third one is Microsoft Office which hasn't been missing a necessary feature for 99% of us for a long time.

Instead of investing massive amounts of manpower and marketing to create and sell ever smaller marginal improvements onto a line of products, I wish it would be less risky to invest in true innovation:

We need to experiment what _else_ is needed today, invent entirely new products (or rediscover great old ones and re-do them with todays possibilities) instead of riding a long-dead horse.

But the machine of our society doesn't seem to allow for it, at least not often. Innovation is risky, who can tell whether that new out-there idea will be adopted by the customers? So we improve rather than innovate.

Gradual improvements based on data and customer feedback do work for a long time. But they will not endlessly create better products where the actual benefit of the improvements outweigh the development costs.

As I've said before: โ€œProgressโ€ is one step towards a specific destination. Once the destination is reached, further โ€œprogressโ€ will simply continue on the same line and take us _away_ from the destination: The product will get worse _and_ more expensive to make.

There is hope though: Thomas Edison and his Menlo Park Research Laboratory have shown that innovation can be made predictably successful. Today, Elon Musk is proving the same. I have many issues with his world view but he has a predictable success rate and routinely thinks outside the box.

The law of diminishing returns does apply to progress. Product marketing and the unnerving trend that fewer and fewer people seem to question what they're told seemingly makes continuous improvement seem lucrative longer than it probably is.

Be bold people! Be clear on the goal of your product vision and once reached, stop improving and innovate something new.

Improvement by nature is something gradual. Innovation is a an unforseeable riptide. We need more of the latter.

## Links

- [Thoughts on progress in an inner-city bus](/journal/2023-04-09-progress.gmi)
- [Wikipedia on Thomas Edison](https://en.wikipedia.org/wiki/Thomas_Edison)

---

# I made a Soroban

2023-04-22

I built a japanese abacus, a Soroban.

I spent a couple of hours today with a small woodsaw and my powerdrill to finally make a Soroban that I had planned to build for a while now. It consists of simple soft wood for the frame, wooden beads and brass rods for the beads to slide on.

For those curious: The brass rods are 2mm thick and 12mm apart. The beads are 10mm diameter with a 3mm hole. The wood for the top and bottom beams are 10x15mm, the middle beam is 10x2mm.

It was pretty straight forward to build and what I like about it is that it is all press-fit. No glue, no nothing. The brass beams hold everything together and the holes drilled into the wood are tight enough that this won't come apart by accident.

One mistake I made is that I should have gotten 15x15mm wood for the top and bottom beams. As it is, I had to prop up the frame with upholstery nails so that the beads float. Minor inconveniences.

The whole thing looks roughly like this:

โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚

โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•

โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•


My soroban has twenty rods. This is purely because I got the counting beads in a pack of one hundred, so that is the most rods I could make. 

It is imensely satisfying to have made a physical thing, more or less from scratch, that serves a purpose.

I probably won't abandon the calculator on my phone anytime soon but I want to hone my calculation skills on the Soroban. Right now I know how to do addition and substraction on it. I had started to learn multiplication when I stopped practicing, by now I forgot completely how that works. Oh well.

I'm not going to pretend that I'm knowledgable enough to talk about doing math on a Soroban yet but I want to shed a dim light on how it works:

The right-most rod represents the one's digit of a number. The one to the left of that represents the ten's digit and so on.

The four bottom beads are called โ€œearth beadsโ€, when pushed toward the center beam each count one, or ten, or hundred, ... depending on which rod they are.

The single bead on top is called the โ€œheaven beadโ€, when pushed toward the center beam it counts for five, fifty, five hundred, ... 

So if you'd represent the number 5917 on a Soroban, you'd need the four right-most rods and it would look like this:

โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•โ•โ•คโ•โ•

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ”‚ โ”‚ โ—€โ– โ–ถ โ”‚

โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ—€โ– โ–ถ โ—€โ– โ–ถ โ”‚ โ—€โ– โ–ถ

โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•โ•โ•ชโ•โ•

โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ”‚ โ—€โ– โ–ถ

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ”‚

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ—€โ– โ–ถ โ”‚ โ—€โ– โ–ถ โ—€โ– โ–ถ

โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•โ•โ•งโ•โ•

0 0 0 0 0 0 0 5 9 1 7


I'm in a happy place right now. 

---

# Garden season has begun

2023-04-17

A brief overview of our gardening plans this year.

We're dialing down our gardening efforts for this year, since we hope to shift to another appartment later this year.

Regardless, after returning from Spain we've put the first seeds into the ground.

On the 10th I've planted ten gherkin seeds for pickling and by today they have all sprouted and the sprouts are already about 5cm long โ€” these guys are fast! On the same day I also planted a bunch of Cayenne Chillis โ€” no sign of them yet โ€” and six tomato seeds. The tomatos have just broken surface. All these seeds are in our living room โ€” outside is still a bit cold for them. 

We also want to try to grow our own potatos this year โ€” not an economic endeavour since all we have is a balcony, we'll try a bunch of growbags, for science โ€” so I put a bunch of them out next to the gherkins to sprout before I put them into the growbags.

The last thing I did last weekend was to clear one clay planter box on the balcony and sowed fresh Dill seeds. They'll be the only herbs I attempt this year โ€” not counting the basil that we have from last year.

My wife planted some Indian chilli plants midway through last week. No sign of that yet. Chillis are a bit slower.

We have a few more growbags that won't be taken up by potatos, so we are contemplating planting onions or ginger. Neither of which seems ideal: Onions to our understanding won't multiply unless you grow them to flower and collect the seeds. An onion seed will give you one onion, unlike potatoes. Ginger will grow slowly into more ginger, so we're not sure whether or not that's worth it since we're shifting.

Anyway, gardening season has started and we're both excited!

---

# Retrocomputing as form of progress

2023-04-15

I honestly believe much less power-hungry computers for the average user are the way forward.

I couldn't sleep the other night, and instead of doing anything that might actually help me sleep I went down an internet rabbithole of self-made 8-bit computers built around the Zilog Z80.

Now, the Z80 might need some introduction these days: It is a CPU that is 50 years old and still in production. 

Let that sink in. 

It has an 8-bit address-space and a 16-bit memory address space: 64 kilobyte of memory is all you're ever going to get (unless you cheat with paging ;) ). It still being in production makes it a CPU that is quite commmonly used in DIY retrocomputing projects โ€” common as far as anything in a niche culture can be.

Finding those projects made me remember my own abandonned Z80 project. Fond memories came up, and the urge to dust if off and complete it.

Building a computer around the Z80 is actually very simple: CPU, a clock circuit, ROM and RAM chips are all that's required.

It gets tricky โ€” or trickier at least โ€” when it comes to input / output. I/O over a serial connection is relatively easy but then you're using the Z80 by means of another computer and that somewhat defeats the purpose.

But creative and clever people have developed all sorts of interface options: Storage on SDcards, Compact Flash, even IDE hard drives. None of which existed in the era of the Z80. Soundcards and video cards. USB keyboard and mouse. The list goes on.

Most video options in the retrocomputing scene involve microcontrollers clocked many times faster than the Z80 itself and with more RAM, too. That seems odd but todays' monitors and the digital interfaces needed for them make more โ€œera-correctโ€ solutions prohibitively complex.

This apparent paradox made one approach I found in at least two designs quite appealing:

Build a Z80 computer core as described initially, out of discrete ROM, RAM, โ€ฆ chips. Then connect it to a โ€œvirtualizedโ€ I/O ecosystem, simulated by a microcontroller. This enables you to use a USB-keyboard for input, SDcard for storage and a SPI-connected LCD display with relative ease. 

The whole system would still have a relatively low part-count due to the feature density of the microcontroller, and low cost since most microcontrollers cost less than the Z80 and its memory components these days.

This still begs the question of why use the Z80 at all. If a microcontroller can simulate the whole I/O ecosystem, it can probably do a little computing โ€˜on the sideโ€™ as well and replace the Z80 altogether.

The answer I found for myself to this question can be summed up in one word: โ€œlongevityโ€. The Z80 is easy to understand and being in production after 50 years is testament to its utility. I could use the microcontroller as โ€œbootstrapโ€. An initial version of a computer that can be built somewhat quickly. The initial version of the working system would serve as a point to jump off of to complete the system and grow it into something permanent, without needing the microcontroller.

Later, when the microcontroller will inevitably go out of production and be replaced by a newer model, the Z80 will probably still be there. Parts could be replaced and the whole tyranny of obsolescence could be avoided.

What does this all have to do with the โ€œprogressโ€ mentioned in the title?

Reading the books that I decently did has changed my view on what progress is for me.

I no longer apply the โ€œprogressโ€ tag automatically to the latest, newest, shiniest thing that gets thrown onto the market. โ€œProgressโ€ has (again?) gotten a correlation to the question โ€œis it better?โ€

The latest AMD Threadripper is many orders of magnitude more powerful than a Z80, but my journey from such a machine to a Raspberry Pi as my main computer has shown me that โ€œmore powerfulโ€ doesn't automatically mean โ€œbetterโ€.

I am definitely getting more done on the Raspberry Pi than I did on the Threadripper.

I do procrastinate less (that means โ€œbetterโ€ for me). I am less distracted by YouTube, Netflix and such. App notification bubbles simply do not exist on my system (again โ€œbetterโ€ for me). My system uses a lot less electricity (better for the wallet and the planet).

So in that view, the much less powerful system still allows me to do everything I need to get done, gives me a healthier setting and is more eco-friendly. At the same time there are no real downsides โ€” minor inconveniences yes, but no downsides. 

Bottom line is this: The less powerful system is progress for me. It is better โ€” for my situation โ€” than the one before it and thus marks progress.

Progress could be described as one more step in the given direction (towards a worthy goal). In that sense the Raspberry Pi system is one such step.

Ever more powerful computers are not automatically โ€œprogressโ€. Think about it: One more step in the given direction will eventually bring you past your goal. From then on any step in the same direction will move you further and further away from that goal.

Is my current Raspberry Pi system the ultimate achievement, have I reached the goal? Of course not.

The Raspberry Pi system โ€” naturally โ€” still has complexities and complications that I have a hard time to control or get rid of. It still runs a modern Linux system. Linux is fantastic, but it is complex and not always intuitive.

So why not look for another step in that direction of lower power, fewer-moving parts computer systems as a form of progress?

This form of progress, like all, will have its end of course. There certainly is such a thing as a too-simplistic computer system for every day use. 

But during that long, sleepless night I came to the conclusion that it is hard to foresee where that tipping-point actually is.

Maybe it is already reached when my main computer can no longer use the internet ๐Ÿค”.

Maybe I learn to live without internet altogether or internet only on my phone. Maybe a Z80 system would show me a way to another step of progress, one that doesn't need computers at all.

Food for thought!

## Links

- [Oberdada - It seems we share some thoughts on progress](gemini://oberdada.pollux.casa/gemlog/2023-02-18_smile.gmi)
- [Z80 on Hackaday.io](https://hackaday.io/search?term=z80)
- [Z80 Family official support page](http://www.z80.info/)
- [Ben Eater 8 bit computer](https://eater.net/8bit/)

---

# Progress and computers

2023-04-12

Many of the common microcontrollers available in the maker scene today are clocked at over 100MHz and will have more available RAM and flash memory than the Commodore C64 I had as a boy.

It makes me wonder if it would be possible to build an operating system with a shell and programs you can interact with, input via keyboard, output to a relatively low-resolution, ... on a microcontroller. Not a gaming emulator platform, but a computer with applications to do some actual work.

Granted, a microcontroller usually is architecturally very different from a general purpose computer and might not be as suitable to general purpose use because of that.

Reading about Forth and learning it made me come across fome Forth implementations for microcontrollers like the Teensy 3.1 or the newer Raspberry Pico. I'll need to bootstrap one of my spare microcontrollers and find out to what abstraction levels the Forth implementations take it.

I have no illusion that my level of spare time and existing knowledge of low-level programming would be sufficient to build my own ecosystem, but with a decent platform to start off of, building applications would be within reach.

Of course, the obvious question to building a general purpose computing ecosystem on a microcontroller is โ€œwhyโ€. For most applications, the system will be pretty useless and โ€œbecause we canโ€ isn't really a valid answer for me in this context. 

With a microcontroller you can certainly use an SDcard or some USB device as storage device. Connecting it to geminispace might work as well but the modern internet will likely be out of reach, probably even email.

So why then? I think minimizing my setup โ€” or rather having an even more minimal setup as option โ€” would be an interesting exercise in simplification and would alter what I do with computers and how I do it.

So I've done some homework and I found many interesting projects around the idea. Two of them stood out: 

One is PotatoP, a computer built around the Sparkfun Artemis platform that won the Low-Power Challenge. It is written from scratch in Lisp. See the link section below. It neatly shows what a single person can do these days with enough determination.

The other one _really_ caught my attention, it is the ESP32ForthStation. It is based on the LilyGo TTGO VGA32 device as platform which provides the microcontroller (ESP32), PS/2 sockets for keyboard and mouse, an SDcard slot and VGA output. The hardware really provides all the I/O needed to qualify as an independent computer in my opinion. The ESP32ForthStation is a mixup of several open-source projects that brings this whole thing to life. Go check out the github and some of the videos linked there if you're interested.

It turns out the TTGO VGA32 hardware can also be used to run other, old operating systems like the C64 and it is cheap. Ooooh, tempting.

Honorable mention of course is uxn which I've mentioned before. I haven't found a microcontroller implementation that takes this to a full computing stack level though.

## Links

- [PotatoP on hackaday](https://hackaday.io/project/184340-potatop)
- [ESP32forthStation](https://github.com/uho/ESP32forthStation)

---

# yesterday was a good day

2023-04-11

Yesterday was the first day in a really long time where I had the energy and the mental headspace to get stuff done.

We've returned from our vacation in Spain last Friday and had spent the weekend more or less doing nothing, reacclimatizing to our home. I had some IT maintenance to do with our selfhosting services but other than that I'm not quite sure what we did this weekend.

But yesterday was a really good day. I take from it that the vacation really helped and I was able to recharge my batteries and gain some mental distance to every day life.

First thing in the morning I did bake a bread. Since I'm the main bread eater in the house I might as well start to learn how to make my own. Bread from the stores here isn't bad but baking it from dough and yeast is a skill I wanted to learn anyways and it frankly tastes better. I let it cool, then cut the whole loaf and put the slices into bags of four and put those in the freezer. Without preservatives the bread lasts for about a week outside of the freezer but with freezing it comfortably lasts longer so I can eat it all.

Next, I planted some seeds and started the gardening season. Should have done that before the vacation but they would have wilted anyway so I didn't. Now I'm a bit late but in a way I'm glad because the nights here are still very cold, spring is late.

I planted four Tomato seeds, about ten Gherkins for pickling (something I want to try this year) and a few Chilli plants. Oh and Dill as the only herb. We've rediscovered Dill as a herb in Spain. 

Last year my herb-growing adventures didn't go too well, I'll stick with only Dill this year and give it more attention.

All seeds except for the Dill are in small sprouting pots inside the apartment near the south-facing window. The Gherkins take around a week to sprout, the others longer. This gives us enough time to buy more soil before we move the sprouts onto the balcony. Hopefully by then it is warmer.

We discovered that we have a Mason Bee that dug a hole into the building facade, right into the insulation. I've tried to convince the bee that this is not a good place for its offspring by means of gipsum but to no avail. Ok fine, I'll seal the hole when the next bee generation has left.

We used the remaining gypsum on some drill holes inside the apartment and sealed them off nicely. Although this is a simple thing to do I'm quite proud that we got this done. Some of these holes are older than I want to admitโ€ฆ

Once that was done the bread had sufficiently cooled and we made brunch from it with some of the Chorizo we brought from Spain, and local Cheese / Paprika / Gherkins. Yummy. 

After dinner I went for a 9km walk to stretch my legs. I'm quite out of shape after winter so that felt good. The day before I had started to do some back and shoulder exercises again since my back was giving me trouble โ€” I need to consistently do the exercises.

In the evening we tried to get rid off a facebook account of my wife's dad who died last year but Facebook is refusing to log us in even though we have the password. It demands uploading an official ID. Which is kind of stupid for only shutting it down โ€” I won't go into why I think this is excessive to begin with โ€” so we left it.

I'm guessing the ID requirement might be since no one has logged in for such a long time and now we're trying to do it from a country different than what usually used for the account. Oh well. Maybe my wife can get in when she goes to visit her mom next month. And if not, so be it.

So yeah, just a simple update about a simple but very positive dayโ€ฆ have a good one, too!

---

# Progress (?)

2023-04-09

Musings on some of the latest improvements on local city busses.

The city transport corporation apparently has recently purchased a new bus model. It is this bus that triggered a whole line of thoughts. There are a few additions on the bus that struck me as utterly pointless; progress for the sake of progress.

Bus addition number one: USB charging ports, prominently illuminated by blue LEDs. This is an inner-city bus, no one spends more than 30 minutes on it before they've reached their destination. I'd say the actual demand for battery-life saving USB-power on that bus is next to zero. Certainly I have never seen one of these plug points in use.

Think about it โ€” would you have a charging cable with you on your normal city trips to even use the damn thing?

The highest demand for those would probably be by schoolkids, who carry their own powerbank to begin with.

Bus addition number two is a monochrome LCD display sporting an animated arrow pointing toward the โ€œstop pleaseโ€ button. It was backlit. Come onโ€ฆ we all know what the push buttons do, the display isn't needed.

Why then, are these two things being put there? The answer is obvious: The commerce sales machine needs to keep running. Every new model of anything needs to be better than its predecessor, why else would anyone buy an upgrade?

This is fine in itself, progress has gotten us where we are. But progress in itself shouldn't be a goal, but a tool. New models should be _better_ in order to sell them. I challenge the notion that either of these addition makes for a better bus. The bus for me is an example of โ€œprogress saturationโ€. The bus as a concept is mature, of course. The interior is being changed to better comfort the elderly, parents with prems, etc. Certainly, creature comforts for the driver are also improving โ€” which is a good thing โ€” as are safety and security measures, engine and steering mechanisms. etc.

But why not stop there and focus our efforts on very marketable aspects of fuel-efficiency, mileage, cleaner exhausts, and similar things? Certainly that is also done. 

What I've called โ€œprogress saturationโ€ before indicates features being added that serve no actual purpose.

When I teach my customers lean-agile thinking, customer-centricity is paramount. Unterstanding the customers needs is essential to building products that customers want to buy. 

In a restaurant, the concept of customer-centricity is simple: The product is the food (also more indirectly: good service, atmosphere and other factors). Would the restaurant serve you food you didn't ask for, you would likely not eat it or pay for it. You would likely not recommend the restaurant to friends and maybe not return. With busses, the concept of customer-centricity is less trivial.

In the case of the bus manufacturer, the customer is not you or me, the schoolkids, or the commuters. No. The customer is the city transport corporation that buys the busses. The people on the bus are certainly one user group of the bus, but not a customer of the manufacturer (the driver being another, the service crew a third, and so on).

However the people on the bus _are_ the customers of the city transportation corporation. So which one โ€” transport corp or manufacturer โ€” is at fault here? Or is it us? Do we actually demand these features? Do we _seem_ to demand these features?

Working on the assumption that we do not, it would be advantageous for the bus manufacturer not to add the USB charging ports or the LCD displays for the buttons. Probably the bus would not be measurably more fuel-efficient without them but not adding them would reduce the part count, overall complexity of the system and thus streamline its manufacturing a little bit. It would allow for work hours to be spent elsewhere, and/or drive the cost down a tiny fraction. 

Apply this fat-trimming exercise often enough โ€” the one-percent rule โ€” and you're dealing with exponential returns in efficiency-gains.

I wonder what it would take for our society and collective value-system to recognize a focussed, efficient, streamlined system as desirable and marketable.

---

# I am spent

2023-03-15

About over-extending, Spain and the wonders of stack machines.

This place has been quiet. I am completely and utterly spent. Haven't been this tired in years. I took a break from working on my self hosting setup now that it is mostly functional โ€” not complete! โ€” and mostly stable. I also haven't really worked on getting myself off the cloud in two weeks. I believe I have cleared and deleted two google accounts since I last spoke about it here and certainly I have requested deletion of a bunch more online accounts. But there is more to do. I'll pick this up again once we're back from our vacation. 

Thank god for the vacation. Starting this Saturday we're leaving for Spain. Three weeks of decompression, deeeeeep breaths, lots of sleep, good food and drink, reading, talking, connecting with people and hopefully starting aquarell painting again. We plan to also do some scouting for properties, Spain is kinda-sorta on our radar as a retirement plan. Were we live now retirement is too expensive. 

I'll take two books with me to Spain:



"The Retro Future" would connect nicely to "The Ecotechnic Future". "Permanent Record" is long overdue. I'll probably toss a coin. 

Oh, by the way. Recommended movies, none of them new but I finally got around to see them: 



On a brighter note: What I have picked up recently is FORTH. Okay it is not an acronymโ€ฆ Forth, then. It's a simple-yet-powerful and quite old programming language based on computing stacks. I had come across Forth via `uxn` by hundred rabbits (links below), an ultra-quirky and minimal virtual computer developed by a digital nomad living on a sail boat. Seriously, if you don't know hundred rabbits yet you're in for a ride :). โ€ฆwhat was I talking about? Oh yeah, Forth.

I'm still wrapping my head around it all and I have much to learn. But Forth reminds me of times when I was building my own Z80 computer (no, I'm not _that_ old) and dreamt of bootstrapping my own little operating system from scratch. With Forth, this seems to be back in the realm of possibilities. Oh god, why do adults have to work for a living? All the _time_ I would haveโ€ฆ *sigh*

Any attempt of me trying to explain Forth cohesively will be fataly flawed. If you're in for some nerd trip, visit your search engine of choice. 

Alright, this is me for now. Surprisingly incoherent, this post. Time to go to Spain, see you after Easter.

## Links

- [Some information on Forth](gemini://diesenbacher.net/forth.gmi)
- [Hundred Rabbits](gemini://gemini.circumlunar.space/users/hundredrabbits/)
- [Varavara (fair warning, I believe it helps to understand the Hundred Rabbits first)](https://wiki.xxiivv.com/site/varvara.html)

---

# Self-hosting calendars is a mess

2023-03-01

Here I was, thinking that hosting a calendar for my family would be easyโ€ฆ

Currently my wife and me use Google Calendars to keep track of birthdays, times where I'm away from home because of work, etc. You know, the usual things. But since I want to get us off the clouds and regain control over our data, the next item on my list was to see if I could host a calendar server myself.

Oh boy.

CalDAV is a relatively old standard, so I thought this was going to be easy. It wasn't. Setting up each individual piece is relatively straight-forward but to come to a cohesive ecosystem wasn't. Here's what I've found:

## TL;DR 
To sum it up: I believe I got it to work but the final verdict is still out. Relevant components: 



Keep reading for details on all of the above, and my findings about alternatives.

## CalDAV servers
I tried Baikal first, but their docker container isn't capable of changing user/group on the host system. Its probably never a big deal but I don't appreciate a service writing files with elevated permissions for no reason. So Baikal was out.

Eventually I settled with Radicale. It apparently purposefully doesn't implement some parts of the standards but I haven't found anything that isn't working. It has a minimal interface, consumes only 20 MB of RAM and does what I need it to do.

One quirk with radicale: Apparently there is no way to share calendars and such between users โ€” although I'm not sure that is actually a server feature. My work around is that aside from the two obvious personal users for my wife and me, there is a third user โ€œfamilyโ€ for the shared things. This would quickly become impractical for larger user bases but it is fine for us.

Another quirk: When creating calendars, you have the choice to configure it to support any combination of calendar events, journal entries and todos. While I'm sure that works on its own, I had a multitude of issues with my calendar clients and ultimatelly settled with three separate โ€˜calendarsโ€™, one for each type.

Since Radicale itself doesn't have _any_ web-based client capability โ€” and why would it โ€” I settled with a custom docker image that integrades the infCloud web client. InfCloud is old and as far as I can tell not in active development but it seems feature complete and most importantly: it just works.

See the link section below for the docker image.

## Linux client
Next step: getting a TUI client for me on my Linux desktop system.

More fun.

From what I found, there are three main TUI calendar applications, in various stages of maturity: โ€œkhalโ€, โ€œcalcurseโ€, โ€œcalcureโ€

Calcurse seems to be the most mature and it comes with its own way to sync with CalDAV servers. It does support Todos (more on that later). I didn't settle with this because I didn't manage to configure it so that events from different calendars are displayed in different colors. This seems like a minor thing but I really don't want to think about which calendar a certain event is from. The second issue I had was that calcurse doesn't seem to display subtasks of a todo correctly โ€” all subtasks show up as their own todo, without any obvious option to hide them. Try that with a shopping list, it does get messy quickly.

The youngest entry is calcure. I _really_ like the user interface and I will definitely keep an eye on further development. Currently however it doesn't support calendar colors โ€” it has a different approach to indicate that โ€” so it is out.

So I settled with khal. The user interface of khal is alright. vim-keys are a plus and it is functional, but it doesn't win design prices. It also doesn't have support for todos, and it cannot sync with CalDAV servers by itself. But it does have color-support. In a way it is the one app with the most limitations. But is definitely the one that fits my usecase the best.

## Linux CalDAV sync
To get my data synced from Radicale to khal I'm using the recommended vdirsyncer. Took me a minute to figure out a workable directory layout for multiple calendars but it gets the job done and now syncs quietly in the background via systemd/Timers.

## mobile
Now, this is another beast.

Step one: Syncing with my Radicale server. I'm using DAVx for that. It is open source and it is available on F-Droid. Again: Took a minute to get the configuration right but that was because _all_ pieces of this puzzle were moving and I had to wipe and restart a few times, not with the app itself.

Step two: A calendar. I'm certain I could simply have continued to use the Google or Samsung calendar apps but I feel that would defeat the purpose of the whole getting-off-the-cloud thing. 

For now I'm using the โ€œSimple Calendar Proโ€ app on F-Droid. Sadly it supports todos only for the hard-coded local calendar but for appointments, birthdays, meeting reminders etc it is good.

Step three: Todos on Android: I'm currently evaluating the โ€œTasksโ€ app from F-Droid since it is supported by DAVx. It does support tasks and subtasks โ€” remember the shopping list! โ€” and in contrast to the โ€œjtx Boardโ€ app it doesn't throw errors when syncing with Radicale. I haven't gotten rid of Microsoft Todo yet.

## Links

- [docker image of Radicale with infCloud integration](https://hub.docker.com/r/parrazam/radicale-docker)
- [DAVx CalDAV sync client for Android on F-Droid](https://f-droid.org/packages/at.bitfire.davdroid/)
- [Simple Calendar Pro for Android on F-Droid](https://f-droid.org/en/packages/com.simplemobiletools.calendar.pro/)
- [Tasks.org for Android on F-Droid](https://f-droid.org/en/packages/org.tasks/)
- [vdirsyncer CalDAV sync for Linux](https://github.com/pimutils/vdirsyncer)
- [Khal Linux calendar TUI client](https://github.com/pimutils/khal)

---

# my todo app

2023-02-21

Instead of why mentioning my todo app every other time, why not just show it?

On the off-chance that you're a terminal user like me, you do use z-shell and you're in the market for a micro-sized task manager: here you go:

----

#!/usr/bin/env zsh

autoload colors

colors

# ensure files exist, load lists

FILE_DIR=~/.todos; FILE_TODO=$FILE_DIR"/todos.txt"; FILE_DONE=$FILE_DIR"/done.txt"

if [[ ! -d $FILE_DIR ]]; then echo "directory '$FILE_DIR' not found"; exit 1; fi

touch $FILE_TODO $FILE_DONE

TODOS=$(<$FILE_TODO); DONES=$(<$FILE_DONE)

# prepare glyphs. if you want to use plain ASCII, I recommend o, x, ^, v

GE=$reset_color

G=($fg[red]" ๏˜ฐ "$GE $fg[green]" ๏˜ด "$GE $fg_bold[yellow]"๏ฑ"$GE $fg[cyan]"๏ธ"$GE)

# functions

move_tasks() {

for i in $s; do echo $1 | awk 'NR=='$i' {print;exit}' >> $2; sed -i $i'd' $3; done

}

# run commands

if [[ $# -ne 0 ]]; then

COMMAND=$1

shift

IFS= \n' s=($(sort -nr <<<"$*")); unset IFS; # sort potential task id list

case $COMMAND in

add|a) echo $* >> $FILE_TODO ;;

clean|c) echo -n "" > $FILE_DONE ;;

done|d) move_tasks $TODOS $FILE_DONE $FILE_TODO ;;

rename|r) sed -i $1'd' $FILE_TODO; shift; echo $* >> $FILE_TODO ;;

trash|t) for i in $s; do sed -i $i'd' $FILE_TODO; done ;;

undo|u) move_tasks $DONES $FILE_TODO $FILE_DONE ;;

*)

SELF=`basename $0`

echo "Usage: $SELF (add|clean|done|rename|trash|undo|)"

echo " $SELF prints current open and completed todos"

echo " $SELF add some task adds 'some task' as open todo"

echo " $SELF clean clears completed todos off the list"

echo " $SELF done N marks the Nth todo as completed"

echo " $SELF rename N new descr. renames Nth open task to 'new descr.'"

echo " $SELF trash N deletes the Nth open todo"

echo " $SELF undo N marks the Nth completed todo as not done" ;;

esac

# clean and re-sort both files

grep -v -E "(^#|^\s*$)" $FILE_TODO | sort -u -o $FILE_TODO -

grep -v -E "(^#|^\s*$)" $FILE_DONE | sort -u -o $FILE_DONE -

else

if [[ -n $TODOS ]]; then

echo $TODOS | nl -s ") " -w2 | sed "s/^/$G[1]/;s/:high:/$G[3]/;s/:low:/$G[4]/"

fi

if [[ -n $DONES ]]; then

echo $fg[yellow]" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€"$reset_color

echo $DONES | nl -s ") " -w2 | sed -E "s/^/$G[2]/;s/(:high:|:low:)\s*//"

fi

fi


Seriously, this is it. 

What you should do is create a ~/.todos directory and possibly also create a convenient alias for the script above. Then just start it. It'll tell you what to do. 

Functionality is limited โ€” it isn't Microsoft To Do โ€” but it is sufficient for my use cases. I'm still quite proud of this one, it is elegant and simple. Surely, there are things that could be added and improved, but I'm resisting. Let this one be.

---

# text-only interfaces

2023-02-19

I'd like to talk a little bit about how I've changed my private workflow more and more towards text-only interfaces.

It started when I had caught myself sitting in front of my triple-monitor Windows 10 machine, evening after evening, either mindlessly performing โ€œdailesโ€ in one video game or another, or watching YouTube videos that barely interested me. I had stopped *doing* and was only *consuming*, passing time until I could fall asleep.

I felt that what I needed was _less_. Less technicolor, ultraHD, dolby surround. More focus, more purpose and communication.

So, a challenge then: I got my hands on a Raspberry Pi 4, an Argon40 case and a 500GB SSD. This would be my main computer from now on. What followed was more than a month of struggling, trial and error and re-learning Linux. I started off with Ubuntu 22.04. It worked well enough to show me that it would be possible. But ultimately it was too sluggish. I persevered because I could feel that it would be possible to have a good experience with the right setup.

Fast forward a couple of months and without realizing I have set myself up in a niche within a niche within a niche. Using a Raspberry Pi as main computer is a niche but not an oddity anymore. My distribution is Manjaro, that's the second niche. I like the continuous upgrade pathโ€ฆ the idea of potentially never having to upgrade a whole distro is pleasing. My window manager is sway, the final niche.

I didn't realize it back when I started but naturally not everything that is available on Linux is available for the ARM64 platform. Yet even less is available on ARM64 Manjaro. But it is far from a barren wasteland, I can make do.

So, how has my interaction with computers changed?

Most importantly, I really like the keyboard focus of SwayWM. I don't use the mouse nearly as often. Keyboard shortcuts to zip around the tiled windows on the two monitors, resizing them, moving them to another virtual screenโ€ฆ fantastic.

Neovim is my main editor. The Primagean on YouTube has showed me the way. I had prior experience with vi itself so neovim was a logical choice, but let's just say there was a learning curve :). I've applied the vi keyboard logic to all other applications that would let me. Consistent keyboard shortcuts are a fantastic thing.

My main file explorer is ranger, another text-user-interface software. It can use vim-keys so that made sense. 

I listen to music through ncmpcpp. Again text-based, again vim-keys.

IRC and matrix access is provided by weechat. This one is relatively new, I like it but I haven't found flow with it yet. 

I largely read mails on mutt, but since for now my mails are on google mail I do miss the possiblity to use the labels as folders. There are howtos to get that to work with mutt, but I haven't been able to.

I have w3m set up to browse the internet, again with vim-keys but I don't do that very much. The internet of today โ€” or the pages I frequent โ€” is really not suited for text-based browsers.

Amfora is my gemini browser. vim-keys TUI goodness.

When I feel the urge to play a game, there are always MUDs, but there's also roguelikes like ADOM or angband. I'd love to play Dwarf Fortress or Rimworld on the Pi but RimWorld refuses to work and Dwarf Fortress would simply melt the Pi, I know that. But to be fair, angband / ADOM are complex beasts in their own right and offer plenty of distraction.

Sometimes I do make music not on my Eurorack sync but on the comp. Here this is through SunVox and ORCA, a quirky little piece of kit.

I've written my own todo app and a calculator for the command line and a bunch of other tools. Coding is fun again!

The list goes on. 

I've themed sway and my main applications nicely, opacity in alacritty terminal emulator provides some gentle eyecandy. A nerdfont provides glyphs way beyond the 8-bit terminals of the past.

Overall this setup is actually good and very much distraction-free. And it is eye-opening.

When I bought the Raspberry I was lucky enough to get a model with 8GB RAM. I wasn't sure how much RAM I'd need back then. Now I know that 4GB would have been plenty.

The only regular concession to modern times is Firefox. This is _by far_ the most sluggish piece of software on this machine. Gmail, YouTube, but even managing my docker containers through Portainer is a meditative experience. Odd. GIMP, LibreOffice etc all start very fast and working with them is good, but working on the web isn't. I'm using the Brave browser on all other devices but it doesn't seem to exist for Manjaro, yet.

I guess this explains why geminispace is so appealing to me. Content first, no distractions. I just wish there would be more non-tech content on gemini. Then again my journal isn't helping eitherโ€ฆ

So what is my verdict: It is good. I do stuff again, I barely consume. Moving to the Pi and setting up my selfhosting environment has kept me busy for a long while now but the todo lists are getting very short now. I don't miss the modern ways. I do miss a few interactions, I should see that I catch up with those people.

## Links

- [Amfora gemini browser](gemini://makeworld.space/amfora-wiki/)
- [Manjaro Linux for Raspberry Pi ](https://wiki.manjaro.org/index.php/Manjaro-ARM)
- [Sway Window Manager](gemini://gemini.clehaxze.tw/gemlog/2023/01-25-first-time-messing-with-sway.gmi)
- [ranger](gemini://freeshell.de/tldr/ranger.gmi)
- [neovim](https://neovim.io/)
- [The Primagean on YouTube](https://www.youtube.com/playlist?list=PLm323Lc7iSW_wuxqmKx_xxNtJC_hJbQ7R)
- [ncmpcpp ](gemini://freeshell.de/tldr/ncmpcpp.gmi)
- [mutt ](http://www.mutt.org/)
- [weechat](https://weechat.org/)
- [angband ](https://rephial.org/)
- [ORCA](https://hundredrabbits.itch.io/orca)
- [my todo app](https://github.com/MrOnak/cli_todo)
- [my calculator](https://github.com/MrOnak/c_rpncalc)

---

# digital spring cleaning

2023-02-12

Progress report on my efforts to get off the cloud and centralize my data where I have control over it.

The last week was a bit crazy. As part of my job I am sometimes busy as a trainer for Agile Processes. This week there were two trainings back-to-back which meant teaching and talking Tuesday to Friday and being largely braindead on Saturday. But I got some smaller things done, and actually had a breakthrough with my self-hosting efforts.

Firstly, I made some progress cleaning my digital logins. This means going through my password safe and finding logins that I'm not using anymore. Then going to that website and see if they have a way to request account deletion. If they do, click that and remove the login data from my password safe. It is unbelievable how tedious and time-consuming that is. Granted, most pages nowadays do have account deletion options, but not all of them. Some high profile ones do not, surprisingly. I thought with the GDPR in place this would be a thing in the pastโ€ฆ anyway, I got 32 accounts deleted and found 14 accounts that I would *like* to delete but couldn't find how. Of note: Blizzard BattleNet and Surfshark, a VPN provider. Blizzard doesn't really surprise me but a VPN provider that is all about security not having an easy-to-find delete option did. I'll keep at it, there are still 218 accounts in my password safe.

Secondly, more spring cleaning: One of my Google Drives is completely empty now. There wasn't much to begin with but I downloaded it onto my NAS. Thankfully google documents convert very well into LibreOffice files. Got a few more accounts to go through but this makes me happy. Am I paranoid or do you also have a sneaky suspicion that google doesn't actually delete the files, they just don't show them to you anymore? I have no evidence whatsoever to back this up but somehow I feel this is what's really happening.

In other news: I have managed to use Caddy as a reverse proxy for my self-hosted services. It took a bit of reading but setting up Caddy was actually trivially easy once I understood how it works and what I wanted it to do. It now generates Let's Encrypt SSL certificates for all my services without being exposed to the internet at all. This is borderline magic to me. But as a result all my services are now internally served over HTTPS โ€” irrelevant for most, crucial for some โ€” *and* since Caddy is accessible from my VPN, now all my services are, too. We can access our wiki, the task board, RSS aggregator, โ€ฆ from anywhere on the planet now as long as we're connected to the VPN. Fan-fucking-tastic.

Next steps on the self-hosting front will be to set up a centralized authentication provider through the reverse proxy (I'm hoping for Authelia) and then moving my password safe into self-hosting as well. After that it should be smooth sailing. There's a bunch more services that I want to self-host though, like a Contact/Calendar service (WebDAV/CalDAV), a bookmark store, and hopefully something to replace Microsoft Todo.

## Links

- [Caddy 2, self-hosted reverse proxy](https://caddyserver.com)
- [Authelia, open-source authentication and authorization server](https://authelia.com)

---

# I'm doing 2FA wrong and I bet you are, too

2023-02-05

Two-factor authentication is inherently flawed by the reality we live in. Hear me out.

The idea of two-factor authentication is simple: Rather than relying only on a password to unlock something, it relies on two factors: 

One thing (factor) that you know โ€” usually a password.

Another thing (factor) that you have โ€” often that is a gadget which generates a unique and time-dependent PIN.

Anyone only knowing what you know, or only having what you need to have, will not gain access to whatever it is you're protecting. As long as they don't have both, they're not getting in.

Sounds good? It is! โ€ฆuntil smartphones happen.

What is the most frequent way to reset my password on any given internet site? Right, they mail me a link. I click on the link and I can enter a new password, after entering my PIN (the 2nd factor). Alternatively they mail me a one-time password directly and I'm forced to change it the next time I'm logging in.

My second factor in the 2FA-scheme is the Google authenticator app, on my phone.

Now, the problem is: I can read my mails on my phone.

โ€ฆand there we have it: Both factors are merged into one. Anyone in possession of my phone has access to the generated PINs and will receive any password-reset mails.

It took the death of my father-in-law to realize this. After he was gone I was making sure we get control over his mails, digital contracts, online banking, and so on. It took maybe two hours and I had every password replaced and had access to all his bank accounts, his internet service provider, Facebook, WhatsApp, Dropbox, you name it. All because I had his phone and we managed to unlock it.

The whole 2FA system is broken by how we use smartphones.

---

# on quality

2023-02-04

Just a quick one today: A big โ€œDankeschรถnโ€ to Michael Nordmeyer. He unknowingly reminded me through one of his posts that gemini content is in written in UTF-8 and that this opens up the possibility to use proper typography.

I am absolutely certain that the vast majority of users / readers won't even notice the subtle differences, but it gives me a great deal of joy. Let us all thrive to bring some good old-fashioned quality back, shall we?

So here we have them and their usage: 

ellipsis           : โ€ฆ


hyphen             : -


n-dash             : โ€“


m-dash             : โ€”


lastly, the quotes:


Of course we can take this a step or three forward... UTF-8 also provides latin script letters in ๐‘–๐‘ก๐‘Ž๐‘™๐‘–๐‘๐‘ , ๐›๐จ๐ฅ๐, uอŸnอŸdอŸeอŸrอŸlอŸiอŸnอŸeอŸdอŸ and sฬถtฬถrฬถiฬถkฬถeฬถtฬถhฬถrฬถoฬถuฬถgฬถhฬถ. The downside of those being that they fix the font to being serif, sans-serif or whatever you chose โ€” usually that decision should be given to the client, not the server.

I'll be pondering the use of those, the usual Markdown _underline_ and *emphasis* do work fine in my opinion, even though gemtext doesn't define these as having meaning and thus clients usually won't do anything with it.

What do you all think about this? Maybe you've already come up with a similar โ€” or very different โ€” solution?

So that is itโ€ฆ go and visit Michael Nordmeyer on his own page, it is a good one.

## Links

- [Michael Nordmeyer](gemini://michaelnordmeyer.com/gemlog/2023-01-30-i-use-proper-typography-in-gemtext.gmi)
- [Yaytext, copy & paste a text in various Unicode styles.](https://yaytext.com/)

---

# ChatGPT

2023-01-31

Me and my wife have done some experiments with ChatGPT recently.

- [OpenAI ChatGPT](https://chat.openai.com/chat)

It is quite fascinating once you understand how to work with it. It of course has no comprehension of what it is generating, it doesn't "understand" and can easily be tricked:

> Us: Lisas mother has three children. Two of the children are Paul and Peter. What is the name of the third child?
> ChatGPT: It is not specified what is the name of the third child.

It is a statistics engine, after all. Thank god.

But it is good in exploring factual situations, even if they're hypothetical.

At one point we were having a conversation with ChatGPT on potentially life bearing moons of Jupiter (โ€œEuropaโ€) and quizzing the bot on specifics of the subsurface ocean, the thickness of the ice on the surface, why there is liquid water to begin with, โ€ฆ Finally we tried to get it to come up with specifics of a human habitat in that subsurface ocean. It didn't really get into the details of what is required but I'm quite sure better questioning from our end would have improved the results.

We had it explain Dark Matter and Dark Energy in layman's terms and as far as I can tell (I'm a space nerd but not an astrophysicist) it got it right.

We had it write a poem about a stuffed toy. It also wrote a comparative analysis between MacBeth and Othello for us. According to my wife, an english teacher, the bot did alright. Alright in the sense that it was factually sound and would have passed off as homework from a child. Now we're both secretly waiting until one of her school kids hand in an essay written by ChatGPT which will be factually wrong. It's a matter of time, for sure.

The other day I used it to write AWK scripts. This was tricky but ultimately successful. I do have a decent understanding of programming in all sorts of languages but I don't know AWK at all so I couldn't give ChatGPT a headstart. Instead I started with a simple task and gradually asked the bot to improve the code - much the same process as I would follow if I was writing the code myself, I _love_ iterative design / fail-fast.

Initially the bot would generate code that would throw syntax errors. When pointed out, the bot excused itself (sic!) and corrected the code. At one point I asked it to write a recursion. It didn't really do that but changed the code to run the same code twice. When pointed out that this wouldn't "infinitely" recurse, again, the bot excused itself (sic!) and implemented a recursive function.

Ultimatelly I was able to have the bot iterate the code into what I needed.

On another occasion I used ChatGPT to learn more about IPTABLES and how to write firewall directives for my selfhosted setup. The bot never really wrote the correct directives but quizzing it about what this or that part of a rule did, it consistently gave helpful replies and I was able to write the rules myself.

So yeahโ€ฆ ChatGPT is good. I'm quite sure I'll use it as a learning tool from now on.

---

# The flu

2023-01-26

Oh the joys. I felt the first symptoms of coming down with something on Monday. Somehow I coughed and struggled through a four hour workshop that had already been postponed a few times and pretty much collapsed into bed immediately after dinner. You know, man-flu.

Seriously though, this is the third time in a couple of months that I have fallen sick. I do think that generally speaking I do take care of myself, but the situation at work is getting to me more and more. I neglected the first two outbreaks and went back to work relatively fast. This time hopefully I'm smart enough to take some rest.

So far I'm proud of myself. I sleep _a lot_.

I've spent my waking hours reading โ€œThe Ecotechnic Futureโ€ by John Michael Greer. Good read, but depressing. Which is why it is important I read it. The book discusses visions for how our industrial civilization will change in a world after peak-oil. It is scary, but it also highlights very well how the current system is unsustainable.

Is anyone else also tired of the common misuse of this word, "sustainable"? Well there is no helping it, actual sustainability is non-negotiable.

I'll bring the book up again in a later post. Today I'm about a third through and it feels premature to talk about it.

What else have I been up toโ€ฆ mostly bashing my head against IPTABLES. :(

In my selfhosting setup I'm providing a few apps to myself and my wife: A wiki, a taskboard, RSS reader, data synchronization, ad-blocker. They're all accessible from within our appartment. But I want to be able to access them from anywhere, but without exposing them to the internet.

I'm already hosting a VPN network for us which is working well. So the idea is to provide the selfhosted apps on the VPN by means of clever routing and a reverse proxy.

The task for now is to forward DNS requests to our adblocker: From the wireguard VPN network to the adguard instance which shares a docker network with the wireguard client on our gateway machine that provides the single access point from the outside world into our LAN.

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“

โ”ƒ LAN client โ”ƒ โ”ƒ mobile client โ”ƒ

โ”ƒ eth0: 192.168.0.238 โ”ƒ โ”ƒ eth0: * โ”ƒ

โ”ƒ wg0 : 10.42.78.100 โ” โ”„โ”„โ”„โ•ฎ โ•ญโ”„โ”„โ”„โ”จ wg0 : 10.42.78.150 โ”ƒ

โ”ƒ DNS : 10.42.78.200 โ”ƒ โ”Š โ”Š โ”ƒ DNS : 10.42.78.200 โ”ƒ

โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”› โ”Š โ”Š โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›

โ”Š โ”Š

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ทโ”โ”โ”ทโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“

โ”ƒ VPS / wireguard server โ”ƒ

โ”ƒ eth0: (VPS) โ”ƒ

โ”ƒ wg0 : 10.42.78.1 โ”ƒ

โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฏโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›

โ”Š

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”Š

โ”ƒ machine A โ”ƒ โ”Š

โ”ƒ eth0: 192.168.0.45 โ”ƒ โ”Š

โ”ƒ wg0 : - โ”ƒ โ”Š

โ”ƒ dn-wg: 172.20.0.0/24 โ”ƒ โ”Š

โ”ƒ โ”ƒ โ”Š

โ”ƒ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”ƒ โ”Š

โ”ƒ โ”‚ docker wireguard โ”‚ โ”ƒ โ”Š

โ”ƒ โ”‚ wg0: 10.42.78.200 โ”œโ”„โ”„โ”„โ•‚โ”„โ”„โ•ฏ

โ”ƒ โ”‚ eth0: 172.20.0.2 โ”œโ”„โ•ฎ โ”ƒ

โ”ƒ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”Š โ”ƒ

โ”ƒ โ”Š โ”ƒ

โ”ƒ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Š โ”ƒ

โ”ƒ โ”‚ docker adguard โ”‚ โ”Š โ”ƒ

โ”ƒ โ”‚ eth0: 172.20.0.3 โ”œโ”„โ•ฏ โ”ƒ

โ”ƒ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”ƒ

โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›


- [by the way, UTF-8 border characters are awesome](https://www.utf8-chartable.de/unicode-utf8-table.pl?start=9472)

But man, IPTABLES are hard. I know only very little about networking itself so writing these rules is more guesswork than anything else. I've been reading loads of documentation and asked for help on reddit but so far I'm not really making progress. It is frustrating. I've been at this for a couple of weeks now. Granted, usually I have an hour of consecutive time and a complex subject like this isn't really suitable for that. Now that I'm down with the flu I do have more time but my brain is in power saving mode so it's not any easier.

---

# Spot the mistake

2023-01-21

Simplicity can mean different things to different people.

I particularily like this one:

> A simple solution has elegance. It is the result of exacting effort to understand the real problem and is recognized by its compelling sense of rightness.
>
> Charles H. More, Inventor of Forth

A simple tool allows us to achieve mastery with it, to fully understand its capabilities and its limitations. Fully understanding the limitations of a tool sparks creativity.

If you're curious what that could mean, consider guitarists. Six strings and a couple of frets is all their tool, the guitar, has. Yet there is a vast variety of guitar music in the world.

A digital example is old 8-bit computer graphics and how far Masters of the art pushed ith troughout the years.

My own CLI todo application falls well within what I consider a simple tool. It does what I need it to do, and no more. 50 lines of shell script is all that was required for it. With some calls to _man_ I will always be able to understand every aspect of it and change it if needed.

In the same vein, I can relate to the appeal of websites driven by Markdown. Where the content is stored in human readable text files rather than SQL databases, rendering into modern websites on the fly with the help of a tool chain. In fact, when I started to think of creating Laniakea, I did some research into static site generators, and eventually decided _fuck it_, I'll write everything by hand.

Why is that? I couldn't find a tool chain that was simple and that did Markdown to HTML conversion in a way that I liked. I'm sure there is something out there and I simply didn't look hard enough.

But what I found was a very different understanding of โ€˜simplicityโ€™. Take Jekyll for example. It is the site generator used by Github Pages but you can use it yourself, there even is a docker image. I do like docker images. Unfortunatelly the default docker image is over 300 megabyte. Excuse me?! I'm sure Jekyll can do amazing things while converting Markdown to HTML, but 300 MB isโ€ฆ a lot. There is complexity under the hood that no average being will ever grasp.

On the other end of the spectrum we find a hand-crafted docker image of busybox httpd that is smaller than 100 _kilobyte_. Now, that is simple.

I don't mean to bash on Jekyll. It merely represents one end of a very broad spectrum. Other static site generators come in much slimer: Grav for example is below 50 MB and Jekyll's own 'minimal' docker image is around 70 MB. Still not exactly featherweights though.

If I were to replace a database-driven website such as Wordpress with one based on Markdown, then it isn't because I want to get rid of the database. I understand databases, I know how to handle them, how to do backups. If I were to do this, it would be to get rid of complexity. Exchanging one complex tool with another one isn't doing anything.

Of course, this is me. If you do not understand databases and instead are a master with Node.js, your perspective might well be a very different one.

## Links

- [8-bit graphics mastery](https://www.youtube.com/watch?v=aMcJ1Jvtef0)
- [my simple todo appeal](https://github.com/MrOnak/cli_todo)
- [Jekyll static site generator](https://github.com/jekyll/jekyll)
- [micro httpd docker image](https://lipanski.com/posts/smallest-docker-image-static-website)

---

# Musings about simplicity

2023-01-15

In summer last year I did realize how very complex and _off_ my life had become. My password manager listed several _hundred_ entries. I used to have over a dozen gmail accounts. Multiple redundant accounts for services I rarely used. People linked on social media that I couldn't remember how I met them and why we were linked.

I spent hours daily mindlessly looking at Instagram posts and websites, deleting countless emails selling this or informing me about that, on one site or another. For what?

What I didn't spend time on anymore were real people or any real-life activity for that matter. The COVID-19 pandemic certainly didn't help, but I was never very social.

Yet, there was and still is that dream of turning my, our, life around. Reconnect with reality and other human beings. We want to simplify our lives, focus more on people and things that matter. Develop skills. Move to a smaller place, out of the city and into a more rural setup. Buy less, make more. Be less dependent on the internet and big tech. Walk the road toward being more eco-friendly. Reduce our amount of waste, electricity- and water consumption. 

Some tiny steps have been made since then. I realized that I need to clean up my digital life first, to make mental room for any change. I've spend decades creating this current state. It will take some time to untangle, reduce, simplify, identify and keep only those parts that are worth keeping.

So probably, on the outside not much has changed yet. But I haveโ€ฆ



Regarding non-virtual / digital things: I've gotten rid off an aquarium that I had gotten during the onset of COVID. I've started to learn how to use the Soroban for calculus and I plan to build my own. I had tried to grow some herbs, chilis and paprikas on the balcony. That was largely unsuccessful, I need to learn how to work with the seasons better and be more conscious to cook with ingredients in mind that are currently available.

I've stopped spending money on my Eurorack synthesizer and largely stopped reading music gear websites, or viewing / watching / following music influencers. I don't need more music gear, time to get off that seductive drip system.

I've largely stopped buying cheap. I value well-crafted, durable things more.

I did start to learn aquarell painting and did enjoy it. Recently I have stopped again. This is something to pick up once more in 2023

I did read one book (โ€œEarth abidesโ€ by George R. Steward) last year. Book as in paper.

We build a small but nice vinyl collection of actually good music. Unsubscribed Spotify and Amazon Music in return.

My wife has filled one leather bound book with all contact information of all relevant people. She also wrote a whole bunch of christmas cards and stocked up on letter paper.

I've started to invest our money more and hopefully smarter.

My mindset has begun to change from wanting the latest shiney gadget, toward viewing simplicity as superior. This is the way forward. But the road is rough.
 
## Links

- [Inspiring article on living off-the-grid - in Manhattan](https://arstechnica.com/science/2023/01/i-disconnected-from-the-electric-grid-for-8-months-in-manhattan/)
- [/r/selfhosting](https://www.reddit.com/r/selfhosting)
- [my github. tools I wrote](https://github.com/MrOnak/)
- [madness markdown server (HTTP)](https://github.com/MrOnak/madness)
- [Japanese abacus, the Soroban](https://en.wikipedia.org/wiki/Soroban)

---