diff options
-rw-r--r-- | Makefile | 17 | ||||
-rw-r--r-- | _layouts.gemini/default.html | 1 | ||||
-rw-r--r-- | _layouts.gemini/home.html | 16 | ||||
-rw-r--r-- | _layouts.gemini/page.html | 9 | ||||
-rw-r--r-- | _layouts.gemini/post.html | 19 | ||||
-rw-r--r-- | _layouts.gemini/postlist.html | 63 | ||||
-rw-r--r-- | _posts/2009-02-07-techtalk-einen-gameboy-auf-dem-pc.md | 18 | ||||
-rw-r--r-- | _posts/2024-08-02-use-a-second-signal-account-kinda.md | 7 | ||||
-rw-r--r-- | _posts/2025-02-02-dn42-put-it-in-a-box-linux-network-namespace.md | 15 | ||||
-rw-r--r-- | _posts/2025-05-25-cpu-usage-problems-again.md | 16 | ||||
-rw-r--r-- | _posts/2025-05-29-furdew-valley.md | 24 | ||||
-rw-r--r-- | _posts/2025-06-16-oops-dn42-stops-working.md | 73 | ||||
-rw-r--r-- | _posts/2025-06-22-blog-now-on-gemini-with-dn42.md | 39 | ||||
-rw-r--r-- | feed.gmi | 22 | ||||
-rw-r--r-- | projects.md | 2 |
15 files changed, 329 insertions, 12 deletions
@@ -21,3 +21,20 @@ watch: clean ipfs: clean JEKYLL_ENV=ipfs bundle exec jekyll build cd _site && cp all.html index.html && rm google* && sed -i -e 's|="/|="|g' *.html && tar cvf ../ipfs.tar $$(grep -L redirect *.html) assets index.html + +gemini: clean + mv _layouts _layouts.bak + mv _layouts.gemini _layouts + sed -i.bak -e '/import/ d' assets/main.scss + sed -i.bak -e '/seo/ d' _includes/head.html + cp _config.yml _config.yml.bak + awk '/pagination/ {replace=1;} /enabled/ && replace==1 {replace=0; print " enabled: false"; next;} {print;}' _config.yml > x + sed -i -e '/theme/ d' x + mv x _config.yml + JEKYLL_ENV=gemini bundle3.1 exec jekyll build + mv _config.yml.bak _config.yml + mv assets/main.scss.bak assets/main.scss + mv _includes/head.html.bak _includes/head.html + mv _layouts _layouts.gemini + mv _layouts.bak _layouts + rm -rf _site/category diff --git a/_layouts.gemini/default.html b/_layouts.gemini/default.html new file mode 100644 index 0000000..cddd070 --- /dev/null +++ b/_layouts.gemini/default.html @@ -0,0 +1 @@ +{{ content }} diff --git a/_layouts.gemini/home.html b/_layouts.gemini/home.html new file mode 100644 index 0000000..4e877fb --- /dev/null +++ b/_layouts.gemini/home.html @@ -0,0 +1,16 @@ +--- +layout: default +--- + +{{ content }} + + {%- if site.posts.size > 0 -%} + {%- for post in site.posts -%} + {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%} + <span class="post-meta">{{ post.date | date: date_format }} + {%- if post.lang == 'de' %} (DE){%- endif -%} + <a class="post-link" href="{{ post.url | relative_url }}"> + {{ post.title | escape }} + </a> + {%- endfor -%} + {%- endif -%} diff --git a/_layouts.gemini/page.html b/_layouts.gemini/page.html new file mode 100644 index 0000000..dda953c --- /dev/null +++ b/_layouts.gemini/page.html @@ -0,0 +1,9 @@ +--- +layout: default +--- + <h1 class="post-title">{{ page.title | escape }}</h1> + + <div class="post-content"> + {{ content }} + </div> + diff --git a/_layouts.gemini/post.html b/_layouts.gemini/post.html new file mode 100644 index 0000000..d3a93ae --- /dev/null +++ b/_layouts.gemini/post.html @@ -0,0 +1,19 @@ +--- +layout: default +--- + <h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1> + <p class="post-meta"> + <p> + {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%} + {%- assign date_format = "%A, %e. %B %Y, %k:%M" -%} + Published: {{ page.date | date: date_format }} + + {%- if page.last_modified_at -%} + , Updated: {{ page.last_modified_at | date: date_format }} + {%- endif -%} + </p> + + </p> + <div class="post-content e-content" itemprop="articleBody"> + {{ content }} + </div> diff --git a/_layouts.gemini/postlist.html b/_layouts.gemini/postlist.html new file mode 100644 index 0000000..7be4784 --- /dev/null +++ b/_layouts.gemini/postlist.html @@ -0,0 +1,63 @@ +--- +layout: default +--- + +<p> + This Gemini site has been converted without all-to-much effort from + my Jekyll blog, which uses Markdown as input. + As the conversion process Markdown > HTML > Markdown > Gemini is lossy, + the result looks somewhat unsatisfactory. + I haven't found a good conversion process that saves me the effort of + manually rewriting everything. If you know something, please let me know. +</p> + +<p>Navigation</p> + + {% assign spag = site.pages | sort: "order" %} + {% for my_page in spag %} + {% if my_page.title and my_page.content and my_page.url != "/index.html" and my_page.in_navbar %} +<a href="{{ my_page.url | relative_url }}">{{ my_page.title | escape }}</a> + {% endif %} + {% endfor %} +<a href="/feed.gmi">Feed link</a> + + {%- if page.title -%} + <h1 class="page-heading">{{ page.title }}</h1> + {%- endif -%} + + {%- if site.posts.size > 0 -%} + + {% assign paginator = site %} + + {%- for post in paginator.posts -%} + {%- assign showsep = false -%} + {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%} + {%- if post.lang == 'de' %} (DE) {%- endif -%} + <div lang="{{ post.lang | default: site.lang | default: "en" }}"> + <h2> + {{ post.title | escape }} + </h2> + <span class="post-meta">Published: {{ post.date | date: date_format }}</span> +<p> + {%- if forloop.first and paginator.page == 1 or paginator == site -%} + {{ post.content }} + {%- assign showsep = true -%} + {%- elsif site.show_excerpts -%} + {{ post.excerpt }} + {%- assign showsep = true -%} + {%- elsif post.description -%} + {{ post.description }} + {%- assign showsep = true -%} + {%- endif -%} +</p> + <a class="post-link" href="{{ post.url | relative_url }}">Link to full post</a> + + </div> + {%- if showsep -%} + <hr class="postsep" /> + {%- endif -%} + {%- endfor -%} + + {%- endif -%} + +</div> diff --git a/_posts/2009-02-07-techtalk-einen-gameboy-auf-dem-pc.md b/_posts/2009-02-07-techtalk-einen-gameboy-auf-dem-pc.md index 2c556d6..f02d62a 100644 --- a/_posts/2009-02-07-techtalk-einen-gameboy-auf-dem-pc.md +++ b/_posts/2009-02-07-techtalk-einen-gameboy-auf-dem-pc.md @@ -103,19 +103,13 @@ UPDATE (30.4.2009): ### Emulatoren -- <a href="https://de.wikipedia.org/wiki/Emulator">Emulator</a> auf -Wikipedia -- <a href="https://emulator-zone.com/">Emulator Zone</a> Eine -Übersicht über Spielkonsolenemulatoren. -- _VisualBoyAdvance (toter Link entfernt)_ -Homepage des Emulators "VisualBoyAdvance" +- <a href="https://de.wikipedia.org/wiki/Emulator">Emulator</a> auf Wikipedia +- <a href="https://emulator-zone.com/">Emulator Zone</a> Eine Übersicht über Spielkonsolenemulatoren. +- _VisualBoyAdvance (toter Link entfernt)_ Homepage des Emulators "VisualBoyAdvance" - [SourceForge-Projektseite vom Emulator](https://sourceforge.net/projects/vba/) ### Spiele -- <a href="https://de.wikipedia.org/wiki/ROM_%28Spielmodul%29">ROM</a> -auf Wikipedia -- _PDRoms / Gameboy (toter Link entfernt)_ -Legale ROMs für den GameBoy -- _PDRoms / GameBoy Advance (toter Link entfernt)_ -Legale ROMs für den GameBoy Advance +- <a href="https://de.wikipedia.org/wiki/ROM_%28Spielmodul%29">ROM</a> auf Wikipedia +- _PDRoms / Gameboy (toter Link entfernt)_ Legale ROMs für den GameBoy +- _PDRoms / GameBoy Advance (toter Link entfernt)_ Legale ROMs für den GameBoy Advance diff --git a/_posts/2024-08-02-use-a-second-signal-account-kinda.md b/_posts/2024-08-02-use-a-second-signal-account-kinda.md index 90b7687..a9753ba 100644 --- a/_posts/2024-08-02-use-a-second-signal-account-kinda.md +++ b/_posts/2024-08-02-use-a-second-signal-account-kinda.md @@ -2,6 +2,7 @@ layout: post title: Use a second Signal account (kinda) date: 2024-08-02 18:48 +0200 +last_modified_at: 2025-05-29 16:50 +0200 lang: en categories: ["tech"] description: "How to use a second Signal account on your Smartphone" @@ -52,3 +53,9 @@ already, so not a huge disadvantage). But hey, maybe this is still useful for some people. +**Update 2025-05-29** + +Actually, you can also use multiple accounts on the Desktop client. +Since it's just an Electron app (?), you only need a second Launcher +with the executable and arguments being +`/opt/Signal/signal-desktop --user-data-dir=<whatever you want> %U`. diff --git a/_posts/2025-02-02-dn42-put-it-in-a-box-linux-network-namespace.md b/_posts/2025-02-02-dn42-put-it-in-a-box-linux-network-namespace.md index 0be4238..3a43f1a 100644 --- a/_posts/2025-02-02-dn42-put-it-in-a-box-linux-network-namespace.md +++ b/_posts/2025-02-02-dn42-put-it-in-a-box-linux-network-namespace.md @@ -2,6 +2,7 @@ layout: post title: 'DN42: Put it in a box (Linux network namespace)' date: 2025-02-02 17:10 +0100 +last_modified_at: 2025-06-18 19:12 +0200 lang: "en" categories: "tech" description: "I explain how I put my Autonomous System in a network namespace." @@ -59,6 +60,8 @@ Inside the namespace run: (from within a Wireguard net) - Nginx, which serves my DN42 website +**Update 2025-06-18**: nginx now runs inside the namespace as well. + It took me a while and some internet searches to come up with the firewall rules. On my VPS itself I use ufw, for the network namespace, I *could probably* make this work as well, but I decided to use "iptables", or rather, the wrapper @@ -89,6 +92,18 @@ With an additional forward rule, everything is happy again: -A FORWARD -s fcee::1/128 -d fd00::/8 -j ACCEPT ``` +**Update 2025-06-18**: I modified this several times since then. +Since I also need to take care of actual routing/forwarding within DN42, +I now ended up with + +``` +-A FORWARD -s fd00::/8 -d fd00::/8 -j ACCEPT +-A FORWARD -i eth0 -d fd00::/8 -j ACCEPT +-A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +``` + +i.e. I don't rely on the source address being fcee::1 anymore. + Also, I also feel pretty clever for making sure I can access DN42 from my clearnet: diff --git a/_posts/2025-05-25-cpu-usage-problems-again.md b/_posts/2025-05-25-cpu-usage-problems-again.md new file mode 100644 index 0000000..beb905a --- /dev/null +++ b/_posts/2025-05-25-cpu-usage-problems-again.md @@ -0,0 +1,16 @@ +--- +layout: post +title: CPU usage problems on my VPS again +date: 2025-05-25 19:29 +0200 +lang: en +categories: tech +--- + +<a href="{% post_url 2025-02-02-dn42-put-it-in-a-box-linux-network-namespace +%}">As reported previously</a>, I had problems with the CPU usage on my VPS +again, even after namespace isolation. This time, it was dnsmasq causing the +loadavg to rise. "This is a problem for future me to solve properly", is the +motto. For the time being, I simply added a service restart when I detect a high +loadavg. Works well enough. I'll keep monitoring it to see if this occurs more +than once a week or so. + diff --git a/_posts/2025-05-29-furdew-valley.md b/_posts/2025-05-29-furdew-valley.md new file mode 100644 index 0000000..cbdf420 --- /dev/null +++ b/_posts/2025-05-29-furdew-valley.md @@ -0,0 +1,24 @@ +--- +layout: post +title: Furdew Valley +date: 2025-05-29 15:21 +0200 +lang: en +categories: gaming +--- + +[In my last blog post]({% post_url 2025-03-18-games-i-play_ed %}) about gaming, +I think I already mentioned I played Stardew Valley. Back then, on an Android +tablet. Due to [Pan on Mastodon](https://woof.tech/@Pan_H_Shiroi@toot.cat) +streaming that game recently, I picked it up again. + +I found it can even be modded! The mod in question is +[Animals and Myths Pack](https://www.moddrop.com/stardew-valley/mods/1119098-fs-shs-animals-and-myths-pack). + +{% image + img="https://pics.uvokchee.de/upload/2025/05/29/20250529132445-6dbbe14d.jpg" + alt="Screenshot of modded Stardew Valley, showing the player character with anthro legs + and a fox tail" +%} + +That adds to the fun. I might even get a mod that adds NPC lines. The build-in +ones can get monotonous after some time. diff --git a/_posts/2025-06-16-oops-dn42-stops-working.md b/_posts/2025-06-16-oops-dn42-stops-working.md new file mode 100644 index 0000000..26d4ed7 --- /dev/null +++ b/_posts/2025-06-16-oops-dn42-stops-working.md @@ -0,0 +1,73 @@ +--- +layout: post +title: Oops, DN42 stopped working +date: 2025-06-16 20:39 +0200 +last_modified_at: 2025-06-17 18:12 +0200 +lang: en +categories: tech +--- + +As you might know, I participate in [DN42]({% link dn42.md %}). +I have a somewhat peculiar setup, in +which some VPS run the routing daemons, and my home router simply has a VPN +connection to them and statically routes everything `fd00::/8` to them. The router +runs OpenWRT, and has dnsmasq setup to resolve DN42 domains via the DN42 anycast +servers. I set this up *months ago*, it worked, I was happy, and didn't need it +since. + +Cue last weekend. "Suddenly" the resolution didn't work anymore. It simply timed +out. So I connected to my VPS (which is running DN42 +[in a namespace]({%post_url 2025-02-02-dn42-put-it-in-a-box-linux-network-namespace %})) +and took a look at tcpdump. Inside the namespace, I saw the strange lines + +``` +18:49:05.296629 eth0 In IP6 fd7a:115c:a1e0::xxx > fd42:d42:d42:53::1.53: 42631+ [1au] AAAA? wiki.dn42. (50) +18:49:05.296679 kioubit Out IP6 fd3e:bc05:2d6::80.50255 > fd42:d42:d42:53::1.53: 42631+ [1au] AAAA? wiki.dn42. (50) +18:49:05.302946 tinc_dn42 In IP6 fd42:d42:d42:53::1.53 > fd3e:bc05:2d6::80.50255: 42631 1/0/1 AAAA fd42:d42:d42:80::1 (66) +18:49:05.302990 kioubit Out IP6 fd3e:bc05:2d6::80 > fd42:d42:d42:53::1: ICMP6, destination unreachable, unreachable route fd3e:bc05:2d6::80, length 122 +``` + +And all the time I was thinking… "huh??? Why is `fd3e:bc05:2d6::80` unreachable??? +It is **clearly** in the `ip -6 a` output!!!". I looked through all the +iptables statistics and couldn't find the culprit. + +A join in the DN42 IRC and some back and forth later, someone suggested +"Hey, what's with the `fd7a:…` address? Is there a route for *that*?". + +And of course, no, it wasn't! I was so focused on the ICMP6 message that I +didn't notice the incoming line. As you can read in my other article linked +above, I perform NAT. Of course in that case it probably wouldn't make sense for the +ICMP6 message to tell someone that there's no route for the original IP (before NAT). + +**So, but… where does the `fd7a:…` address come from?**<br/> +The answer is [Tailscale]({% post_url 2024-12-08-trying-out-tailscale %}). +Unfortunately, they decided to use the `fd00::/8` IP range, which collides with DN42. +I didn't do any DN42 stuff since installing it, so I didn't notice that.<br/> +**But… why is that address used at all for the DNS request?**<br/> +Weeeeell… I found out as well. It comes from OpenWRT. I simply set up +a static route there, and Linux does its best to determine the source address for the +DNS request. And it seems the Tailscale one was a closer match than +the address from my own DN42 prefix.<br/> +**So, how to fix that?**<br/> +[It's not as easy as you think!](https://github.com/openwrt/openwrt/issues/13720). +Merely using the "source" option in the config file would work for IPv4, but +for IPv6 it has a different meaning!<br/> +**But why does it say "no route to host" instead of using a default route?**<br/> +Because I configured bird to insert an "unreachable" route for the `fd::/8` prefix +to avoid leaking traffic. +``` +# ip -6 route show fd00::/8 table dn42 +unreachable fd00::/8 dev lo proto bird src fd3e:bc05:2d6::1 metric 500 pref medium +``` + +At this point, it's Monday evening. Unnerved, I threw my hands in the air and +simply put a line of +``` +ip -6 route replace fd00::/8 ... src <my-openwrt-dn42-address> +``` +in `/etc/rc.local` and called it a day. My setup +works again, and I learned something again. Don't just look at the last line, +look at the whole picture. A lesson I actually already learned in the +ubuntuusers forums when asking for help compiling a package and only posted the +last few make output lines, which of course didn't contain the actual +compilation error… diff --git a/_posts/2025-06-22-blog-now-on-gemini-with-dn42.md b/_posts/2025-06-22-blog-now-on-gemini-with-dn42.md new file mode 100644 index 0000000..fa46a58 --- /dev/null +++ b/_posts/2025-06-22-blog-now-on-gemini-with-dn42.md @@ -0,0 +1,39 @@ +--- +layout: post +title: Blog now on Gemini - with DN42 +date: 2025-06-22 17:42 +0200 +--- + +The Gemini protocol is a minimal protocol to serve content, and is +the "spiritual successor" to the Gopher protocol. +(Do not confuse with Google's AI Gemini. I hate naming collissions), + +It took some tinkering, especially because Gemini's markup language +("Gemtext") +is deliberately +minimal, and Jekyll can't output/convert Markdown to Gemini, so I had to +take "the ugly route" to convert the "finished" Jekyll HTML page to Gemtext +via the below-mentioned tool, which basically does +HTML > Markdown > Gemtext. +I can't directly use the raw Markdown files of my blog, since I use +Liquid tags. + +Anyway, my blog is now accessible in "Geminispace", alas, only within DN42, +because I'm too lazy right now to do it properly. (With the DN42 namespace +isolation and all). And also, it's a really "nerdy" protocol, with I don't +know how many users. + +`gemini://uvok.dn42/` + +Addendum: What I really like is the "feed" specification, which basically consists +of separate lines of <br/> `=> $link $date $heading`, <br/> and browsers like +Lagrange can subscribe +to these (like RSS feeds, but the format is much simpler!). + +- [Gemini Protocol on Wikipedia](https://en.wikipedia.org/wiki/Gemini_(protocol)) +- [Gopher Protocol on Wikipedia](https://en.wikipedia.org/wiki/Gopher_(protocol)) +- [Gemini Protocol homepage](https://geminiprotocol.net/) +- [Gemini "Quickstart"](https://geminiquickst.art/) +- [Gemtext intro](https://gemini.flounder.online/docs/gemtext.gmi) +- [Html2Gemini](https://github.com/Aarontheissueguy/Html2GeminiPy) +- [Lagrange browser](https://git.skyjake.fi/gemini/lagrange) diff --git a/feed.gmi b/feed.gmi new file mode 100644 index 0000000..ac3e185 --- /dev/null +++ b/feed.gmi @@ -0,0 +1,22 @@ +--- +--- + {% assign title = site.title | default: site.name %} + + {% if title %} +# {{ title | smartify | xml_escape }} + {% endif %} + + {% if site.description %} +## {{ site.description | xml_escape }} + {% endif %} + + {% unless site.show_drafts %} + {% assign posts = site.posts | where_exp: "post", "post.draft != true" %} + {% endunless %} + {% assign posts = posts | sort: "date" | reverse %} + {% for post in posts %} + {% assign post_title = post.title | smartify | strip_html | normalize_whitespace | xml_escape %} + +=> {{ post.url }} {{ post.date | date: "%Y-%m-%d" }} {{ post_title }} + {% endfor %} + diff --git a/projects.md b/projects.md index b3d47f7..c8350fb 100644 --- a/projects.md +++ b/projects.md @@ -23,6 +23,8 @@ Some of my projects and sites: - [Git server](https://git.uvok.de/) using [gitolite](https://gitolite.com/gitolite/index.html) [1] and [cgit](https://git.zx2c4.com/cgit/) +- My blog is now also on Gemini, although only accessible via DN42. + gemini://uvok.dn42 [1] Can really recommend this if you *don't* want a full-blown Git hosting with "UI" / CI etc. - just the bare-bones git repository hosting. |