<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux &amp; Hardware on vo.rs</title><link>https://vo.rs/categories/linux--hardware/</link><description>Recent content in Linux &amp; Hardware on vo.rs</description><generator>Hugo</generator><language>en</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Wed, 01 Jul 2026 10:00:00 +0000</lastBuildDate><atom:link href="https://vo.rs/categories/linux--hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>Go, the good, bad and ugly</title><link>https://vo.rs/story/go-the-good-bad-and-ugly/</link><pubDate>Wed, 06 May 2026 09:00:00 +0000</pubDate><guid>https://vo.rs/story/go-the-good-bad-and-ugly/</guid><description>&lt;p&gt;The first time I shipped a Go service it was a single 12MB binary copied onto a bare VM with &lt;code&gt;scp&lt;/code&gt;, and it just ran. No runtime to install, no virtualenv to source, no version of some interpreter that was subtly wrong on the target box. After years of fighting that exact class of problem in other languages, the experience was almost suspicious. That is the thing about Go: it solves real, boring, expensive problems, and it does so by refusing to be clever. The same refusal that makes deployment trivial is the one that has you typing &lt;code&gt;if err != nil&lt;/code&gt; for the four-hundredth time and quietly resenting it. Simplicity is Go&amp;rsquo;s defining virtue and its defining limitation, frequently in the very same line of code. Here is the good, the bad, and the ugly, from someone who keeps reaching for it anyway.&lt;/p&gt;</description></item><item><title>3D Printing Functional Parts: Hinges, Brackets, and Things That Actually Get Used</title><link>https://vo.rs/story/3d-printing-functional-parts-hinges-brackets-and-things-that-actually-get-used/</link><pubDate>Fri, 24 Apr 2026 16:00:00 +0000</pubDate><guid>https://vo.rs/story/3d-printing-functional-parts-hinges-brackets-and-things-that-actually-get-used/</guid><description>&lt;p&gt;Everyone&amp;rsquo;s first month with a 3D printer produces a graveyard of Benchys, articulated dragons, and desk trinkets that go straight in a drawer. The printer earns its keep when you stop printing toys and start printing &lt;em&gt;parts&lt;/em&gt; — the bracket that holds a sensor exactly where you need it, the hinge for a custom enclosure, the spacer that turns &amp;ldquo;almost fits&amp;rdquo; into &amp;ldquo;fits.&amp;rdquo; Functional printing is a different discipline from decorative printing, and most of the difference is in understanding that the part has a job to do and the physics of FDM are working against you.&lt;/p&gt;</description></item><item><title>Systemd Without Fear: Writing Your First Service Unit</title><link>https://vo.rs/story/systemd-without-fear-writing-your-first-service-unit/</link><pubDate>Sat, 18 Apr 2026 09:00:00 +0000</pubDate><guid>https://vo.rs/story/systemd-without-fear-writing-your-first-service-unit/</guid><description>&lt;p&gt;You have written a small program. It runs beautifully in your terminal. Then you close the terminal, or the box reboots, or the process quietly dies at 3am, and your service is simply gone. I have lost more small self-hosted tools to a closed SSH session than I care to admit — a webhook receiver here, a scraper there, all launched from a shell that later closed and took the process with it. There is a tool already installed on virtually every modern Linux machine that solves all of this, and yet plenty of otherwise-competent people treat it like forbidden magic. That tool is systemd, and writing your first service unit is far less frightening than its reputation suggests.&lt;/p&gt;</description></item><item><title>TypeScript, the good, bad and ugly</title><link>https://vo.rs/story/typescript-the-good-bad-and-ugly/</link><pubDate>Tue, 14 Apr 2026 15:00:00 +0000</pubDate><guid>https://vo.rs/story/typescript-the-good-bad-and-ugly/</guid><description>&lt;p&gt;JavaScript is famous for being the language that lets you do anything, including all the things you absolutely should not. If you&amp;rsquo;ve read my take on &lt;a href="https://vo.rs/story/javascript-the-good-bad-and-ugly/"&gt;JavaScript, the good, bad and ugly&lt;/a&gt;, you&amp;rsquo;ll know I have a complicated relationship with it: a genuinely useful language wrapped around a core of decisions that make no sense until you learn the history. TypeScript is JavaScript that has finally sat down and read the manual: same language, same runtime, but with a type system bolted on top that catches your mistakes before your users do. It has gone from a curiosity to the default way large teams write JavaScript, and for good reason. Continuing our series on programming languages, here is TypeScript in three acts.&lt;/p&gt;</description></item><item><title>Rust, the good, bad and ugly</title><link>https://vo.rs/story/rust-the-good-bad-and-ugly/</link><pubDate>Fri, 20 Mar 2026 12:30:00 +0000</pubDate><guid>https://vo.rs/story/rust-the-good-bad-and-ugly/</guid><description>&lt;p&gt;Rust is a systems programming language that has spent the better part of a decade topping developer surveys for being the most loved and, in roughly the same breath, the most intimidating. It has led the &amp;ldquo;most admired language&amp;rdquo; spot in Stack Overflow&amp;rsquo;s developer survey for years running, which is a strange badge for a language people also describe as the hardest they&amp;rsquo;ve ever picked up. It promises the performance of C and C++ with none of the dreaded segfaults, buffer overflows, or use-after-free bugs, and it delivers on that promise through a famously strict compiler. Whether that strictness feels like a guardian angel or a bureaucratic nightmare depends entirely on the day. Let us walk through the good, the bad, and the ugly.&lt;/p&gt;</description></item><item><title>Bash, the good, bad and ugly</title><link>https://vo.rs/story/bash-the-good-bad-and-ugly/</link><pubDate>Fri, 06 Mar 2026 14:00:00 +0000</pubDate><guid>https://vo.rs/story/bash-the-good-bad-and-ugly/</guid><description>&lt;p&gt;Bash is the language nobody chooses and everybody uses. It is the duct tape and baling wire holding the internet together: the install scripts, the CI pipelines, the cron jobs, the &amp;ldquo;quick&amp;rdquo; one-liner that has been running in production for nine years. You do not set out to write Bash; you reach for it because it is already there, on every server you will ever touch, and before you know it you have a 400-line script with feelings. In keeping with our series on programming languages — we have given &lt;a href="https://vo.rs/story/python-the-good-bad-and-ugly/"&gt;Python&lt;/a&gt; and &lt;a href="https://vo.rs/story/go-the-good-bad-and-ugly/"&gt;Go&lt;/a&gt; the same three-act treatment — here is Bash in the dock.&lt;/p&gt;</description></item><item><title>Self-Hosting with Home Assistant: How to Achieve 99.99 % Uptime on a Raspberry Pi Cluster</title><link>https://vo.rs/story/self-hosting-with-home-assistant-how-to-achieve-99-99-uptime-on-a-raspberry-pi-cluster/</link><pubDate>Sat, 15 Mar 2025 09:45:00 +0000</pubDate><guid>https://vo.rs/story/self-hosting-with-home-assistant-how-to-achieve-99-99-uptime-on-a-raspberry-pi-cluster/</guid><description>&lt;p&gt;Four nines of uptime — 99.99 % — sounds like marketing until you convert it into hours. Over a full year it allows roughly 52 minutes of downtime; over a month, about four and a half minutes. That is the budget you are spending every time an SD card corrupts, an update hangs, or the single Raspberry Pi running your lights and door locks needs a reboot. A single-node Home Assistant install cannot hit that target, because it has one of everything. A small cluster can get close, and the techniques it uses are borrowed almost directly from how data centres have kept services alive for the past two decades.&lt;/p&gt;</description></item><item><title>Git Internals: What Happens When You Type git commit</title><link>https://vo.rs/story/git-internals-what-happens-when-you-type-git-commit/</link><pubDate>Tue, 18 Jun 2024 09:00:00 +0000</pubDate><guid>https://vo.rs/story/git-internals-what-happens-when-you-type-git-commit/</guid><description>&lt;p&gt;A few years ago I &lt;code&gt;git reset --hard&lt;/code&gt;-ed away an afternoon&amp;rsquo;s work, panicked for about ninety seconds, then recovered every byte of it in two commands. The difference between those two states — losing the work and getting it back — wasn&amp;rsquo;t luck. It was knowing that the commit I&amp;rsquo;d &amp;ldquo;destroyed&amp;rdquo; was still sitting in the object store, unreferenced but very much alive, with the reflog holding a pointer to it. That single fact has saved me more times than any backup.&lt;/p&gt;</description></item><item><title>Python Type Hints: Writing Python Like You Mean It</title><link>https://vo.rs/story/python-type-hints-writing-python-like-you-mean-it/</link><pubDate>Tue, 12 Sep 2023 09:00:00 +0000</pubDate><guid>https://vo.rs/story/python-type-hints-writing-python-like-you-mean-it/</guid><description>&lt;p&gt;Python&amp;rsquo;s great selling point is that you can write a function in ten seconds without telling the interpreter anything about what goes in or comes out. Its great curse is that six months later you are staring at that same function trying to remember whether &lt;code&gt;data&lt;/code&gt; is a list, a dict, or a generator that has already been consumed. Type hints are Python&amp;rsquo;s answer to its own success: a way of writing down what you meant, so that your tools, your colleagues, and your future self can hold you to it. I have watched them turn a genuinely scary refactor of a forty-file service into an afternoon of following red underlines, and that experience converted me for good.&lt;/p&gt;</description></item><item><title>Python the good, bad and ugly</title><link>https://vo.rs/story/python-the-good-bad-and-ugly/</link><pubDate>Thu, 22 Dec 2022 17:21:20 +0000</pubDate><guid>https://vo.rs/story/python-the-good-bad-and-ugly/</guid><description>&lt;p&gt;I have written Python for money, for fun, and at three in the morning to glue two systems together that were never meant to speak. It is the language I reach for first for almost anything that is not performance-critical or a browser, and it is also the language that has bitten me in the most avoidable ways. Loving a tool and being clear-eyed about its sharp edges are not in tension — they are the same thing. So here is my honest ledger: five things Python gets genuinely right, five that hold it back, and five that are just plain ugly and always will be.&lt;/p&gt;</description></item><item><title>Ruby the good, bad and ugly</title><link>https://vo.rs/story/ruby-the-good-bad-and-ugly/</link><pubDate>Thu, 22 Dec 2022 17:15:14 +0000</pubDate><guid>https://vo.rs/story/ruby-the-good-bad-and-ugly/</guid><description>&lt;p&gt;The first time Ruby genuinely surprised me, I was reading someone else&amp;rsquo;s code and understood it on the first pass without running it. That sounds trivial until you&amp;rsquo;ve spent a week deciphering a clever one-liner in another language. Ruby reads like a slightly terse version of what you&amp;rsquo;d say out loud — &lt;code&gt;3.times { puts &amp;quot;hi&amp;quot; }&lt;/code&gt;, &lt;code&gt;[1, 2, 3].select(&amp;amp;:even?)&lt;/code&gt; — and that legibility is not an accident. Yukihiro &amp;ldquo;Matz&amp;rdquo; Matsumoto started designing the language in 1993 and released it publicly in 1995 with an explicit, almost stubborn goal: optimise for the happiness of the programmer, not the convenience of the compiler. Nearly every strength and every wart in Ruby traces back to that one decision.&lt;/p&gt;</description></item><item><title>PHP the good, bad and ugly</title><link>https://vo.rs/story/php-the-good-bad-and-ugly/</link><pubDate>Thu, 22 Dec 2022 17:09:56 +0000</pubDate><guid>https://vo.rs/story/php-the-good-bad-and-ugly/</guid><description>&lt;p&gt;Roughly three-quarters of the websites whose server-side language is known are running PHP. That single statistic is the whole argument about PHP in miniature: it is simultaneously the most successful web language ever shipped and the one it is most fashionable to sneer at. I have written PHP in anger since the days when &lt;code&gt;mysql_query()&lt;/code&gt; was how you talked to a database and register_globals was quietly turning every form field into a security hole. I have also written it last month, on a modern PHP 8.4 codebase that was genuinely pleasant. Both experiences are real, and reconciling them is the point of this post.&lt;/p&gt;</description></item><item><title>What You Need to Know About Quantum Computing</title><link>https://vo.rs/story/what-you-need-to-know-about-quantum-computing/</link><pubDate>Wed, 27 Oct 2021 05:33:34 +0000</pubDate><guid>https://vo.rs/story/what-you-need-to-know-about-quantum-computing/</guid><description>&lt;p&gt;I spent a decent chunk of the last year trying to separate what quantum computing actually is from what the press releases claim it is, and the gap turned out to be enormous. Every few months a headline announces that quantum computers will shatter all encryption, cure disease, or break the laws of economics by next Tuesday. Almost none of it survives contact with how the machines really work. So here is the version I wish someone had handed me at the start: what a quantum computer genuinely does, why the physics is so strange, where the real breakthroughs have been, and which of the promises you can safely ignore for now.&lt;/p&gt;</description></item><item><title>Unity3D on Arch Linux</title><link>https://vo.rs/story/unity3d-on-arch-linux/</link><pubDate>Sat, 16 Feb 2019 17:45:00 +0000</pubDate><guid>https://vo.rs/story/unity3d-on-arch-linux/</guid><description>&lt;p&gt;The first time I tried to install Unity on Arch Linux, the build failed at ninety per cent because &lt;code&gt;/tmp&lt;/code&gt; filled up. Not because the machine was short of disk — it had plenty — but because &lt;code&gt;/tmp&lt;/code&gt; was mounted as &lt;code&gt;tmpfs&lt;/code&gt;, which lives in RAM, and Unity&amp;rsquo;s installer is a multi-gigabyte download that wanted to unpack there. That single gotcha is the whole reason this post exists. Unity runs perfectly well on Arch, but the failure modes are unusual enough that the official instructions never quite cover the case you actually hit, and the AUR package changes shape every couple of years. Here is how it works today, why each step matters, and what to do when it breaks.&lt;/p&gt;</description></item></channel></rss>