March 2024

The tragedy of a typo

We have a website, exofeeds with our members’ RSS feeds merged into one giant megafeed, and it’s awesome… except it doesn’t work. The megafeed hadn’t been updated since the end of September, which is suspiciously around the same time as our migration to a new SSD. Turns out that migration broke the hard link between the output of the feed merger script and the feed file being served by nginx. @ersei made the script output directly to the folder served by nginx, so we’ll never run into this hard link problem ever again.

That was January. But something was still off. The feed was now eternally stuck at January, never changing again. This time, after countless minutes of debugging, @ersei finally found the culprit: The WorkingDirectory of the systemd service for the feed merger script was wrong! And once that was fixed… exofeeds was still broken!

What else could we blame? The script works, the systemd service works… what about the systemd timer? So systemd has a handy command systemd-analyze calendar for checking cron strings, and it told us that the timer’s string *-*-* *:*/30:00 was invalid! There’s a typo! It should actually be *-*-* *:00/30:00 or even shorter, *:0/30. And finally, finally, exofeeds is back, and this time it actually works!

Floats are weird

Floating-point arithmetic is weird, but why? Why does using smaller numbers results in even more inaccurate results? In this post, @a goes a little bit deeper into explaining why this happens and what you can do to get more accurate results without sacrificing performance.

Using PulseAudio as a key-value database (yes, seriously)

When you are holding data, everything looks like a database. @a introduces PulseAudioDB, a lost relative to MangoDB.

Ersei server updates

In this post @ersei tells us about their new server (an actual rack-mounted one!) and their long journey through BIOS problems and broken networks.

Programmatic Caddy

Caddy is an awesome web server written in Go (exozyme uses nginx though, since some of the services we host have official nginx configuration files but no Caddyfiles). But did you know that you can also embed Caddy into another Go program? @iacore wrote a blog post about this, including example code. It’s actually very simple and only around 30 lines of code.

Weblate is back!

Weblate is a web-based translation tool that integrates with Git. We have a Weblate instance, but it’s been down lately since exozyme now serves websites from /srv/http, not /srv/http/pages. @dragongoose and @a fixed this in the Weblate docker-compose.yml, so our instance is back up now! @dragongoose will also be updating Weblate to the latest version soon, so stay tuned.

No more explore page chaos

The exozyme explore page used to be a chaotic jumble of hosted services, projects, and personal websites. @nvpie, @a, @iacore, and @codedotjs redesigned the page to be sorted into categories and formatted with an HTML table, so it should be easier on your eyes and brain now. Since some of our members have personal websites hosted on other servers, the personal websites section now lists those as well, so go check them out!

Monthly puzzle: Origami

Let’s say you have a square piece of paper (so yes, you should obtain a square piece of paper right now). It’s pretty easy to fold the paper in half: bring one side of the square to the opposite side and make a crease down the middle of the paper. It’s also easy to fold the paper into fourths: fold the side over so that it lines up with the crease you just made in the middle. You can repeat this process to divide a square into any power of two. But what about folding the paper into thirds? Obviously, you aren’t allowed to use a ruler, but you can and should use your brain!

Here’s your next task. Squares are great and all, but triangles are cool too. Try folding an equilateral triangle starting from a square piece of paper. In fact, origami is more powerful than traditional compass and straightedge constructions, and you can fold any regular n-gon out of a square piece of paper, but let’s just keep it simple for now and fold a triangle.

And finally, if you managed to survive those previous tasks, try folding a 3-4-5 right triangle. Good luck! The solutions will be published in next month’s issue.

Discuss

If you want to discuss the puzzle or any of the other things in this issue, join our Matrix space and chat with our community.