<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/index.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>./techtipsy</title><link>https://ounapuu.ee/categories/ramblings/</link><description>Recent content on ./techtipsy, a blog written by Herman Õunapuu.</description><generator>Hugo -- gohugo.io</generator><language>en-GB</language><managingEditor>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</managingEditor><webMaster>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</webMaster><lastBuildDate>Mon, 08 Jun 2026 09:00:00 +0300</lastBuildDate><atom:link href="https://ounapuu.ee/categories/ramblings/index.xml" rel="self" type="application/rss+xml"/><item><title>My experience with LLM-assisted tools in software development</title><link>https://ounapuu.ee/posts/2026/06/08/llm/</link><pubDate>Mon, 08 Jun 2026 09:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/06/08/llm/</guid><description>It's been an incredibly exciting time to work in software engineering, and at the same time I feel completely burnt out.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/06/08/llm/media/cover_hu_86373422f0e8d2d7.jpg" width="1200" height="630" alt="My experience with LLM-assisted tools in software development" /><p>It&rsquo;s no secret that I was <em><strong>highly</strong></em> skeptical of LLM-s.</p>
<p>Cool, there is this new thing that can spit out plausible text and create cheap-looking images and videos, resulting in
a lot of low-quality content being shared.</p>
<p>It was also a huge disappointment to see a human-written post that&rsquo;s excellent, only for it to be cheapened with a
generic AI-generated image as the cover. <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>A few years into this wild ride, I have partially changed my view because some people have figured out how to make LLM-s
actually useful, and I like that part a lot. Not the part where the industry is killing my hobby and increasing energy
usage worldwide, but there are some parts that I genuinely find useful.</p>
<p>What changed?</p>
<p><em>If you&rsquo;re not that excited about LLM-based tools or have otherwise strong opinions on them, then
please <a href="/posts/2026/06/08/llm/#final-words">read the final words first.</a></em></p>
<h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I hate the online discourse around LLM-s, or &ldquo;AI&rdquo;, or now that I think about it, <em><strong>everything.</strong></em> Everyone has their
own opinion that they hold as absolute truth, arguments spawn from a few sentences, but nobody in the threads provide
the actual context around their views and experiences, which is <em><strong>critical</strong></em> to properly understanding and arguing
with a statement.</p>
<p>This has especially been true around LLM-based tools.</p>
<p>&ldquo;I tried LLM-s, I absolutely hate it.&rdquo; -&gt; someone who used fancy autocomplete powered by one of the many Copilot-branded
services and was disappointed due to hype augmenting their expectations and the result falling short of them by a large
margin.</p>
<p>&ldquo;LLM-s are great and will replace engineers, it&rsquo;s a game changer.&rdquo; -&gt; they vibe-coded a to-do list app over a few hours
with more vulnerabilities than working features.</p>
<p>It&rsquo;s horrible in both extremes.</p>
<p>The sad part is that I understand both perspectives.</p>
<p>Looking at the whole situation outside in, it&rsquo;s pure insanity.
Sketchy financial deals, datacenter build-outs having very real environmental costs that we all pay for, supply chain
crunches that are not helped by senile old men starting new wars before they&rsquo;ve finished their existing ones, and every
service adding some AI component in there even if it makes no sense is genuinely frustrating.</p>
<p>And yet when you jump in head-first with no assumptions, it feels like a world where previously impossible or
frustrating tasks are now solvable by anyone who knows how to wield this type of tooling. It&rsquo;s a world of optimism,
experimentation and rapid development. No more &ldquo;here&rsquo;s a new JS framework&rdquo; level of depressing churn, we have people who
are experimenting with changing the whole landscape of software engineering!</p>
<p>The context that I&rsquo;m working in has so far been one of the best case scenarios for experimenting with this type of
tooling:</p>
<ul>
<li>relatively young product with a predictable, classical technological stack (Java, Spring Boot, Svelte, Docker, Linux
VMs)</li>
<li>small team with a modest degree of autonomy and encouragement to experiment with new tooling where it makes sense</li>
<li>a decade of professional experience in IT and a long list of incidents that I&rsquo;ve had to resolve</li>
<li>need to be as productive as possible with a small team, to be able to build big things</li>
</ul>
<p>What follows is my experience in a roughly correct timeline. Some of these findings and thoughts can feel like old news,
but that&rsquo;s the order in which I experienced them.</p>
<h2 id="july-2025-chatgpt-and-copilot">
  <a class="heading-anchor" href="#july-2025-chatgpt-and-copilot">July 2025: ChatGPT and Copilot<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of the first things I picked up on was how easy it felt to ask about some details on things that I know something
about, but needed quick clarification or examples with. Googling was a two-step progress: come up with a query, and then
work through the results to find what you need.</p>
<p>LLM-s? I used Google search terms as prompts verbatim, and could get what I wanted, fast, and most of the time they
were correct, and mainly correct enough for them to be useful to me.</p>
<p>When it came to development, I thought that hey, let&rsquo;s try out Copilot that we could use through our GitHub
organization. I use IntelliJ IDEA, and this one had a plugin that integrated with it, so it felt like a good option to
go with.</p>
<p>I tried the fancy autocomplete option first, and it was an immediate source of frustration. It was slow
enough to be unusable, and once the results did arrive, they were useless.</p>
<p>The agent option was more useful, but you had to manually give it the necessary context, and it felt clunky. It did an
okay job of writing new tests based on previous examples, but nothing revolutionary.</p>
<h2 id="july-august-2025-the-turning-point">
  <a class="heading-anchor" href="#july-august-2025-the-turning-point">July-August 2025: the turning point<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I was pretty disappointed at this point with this level of tooling.</p>
<p>Then, we had an urgent issue that we had to resolve, but based on our estimates it would&rsquo;ve taken a few days to
implement and properly test. We didn&rsquo;t have that luxury.</p>
<p>My colleague was trying out Cursor at that time. They took it, looked at the problem, and figured out a tested,
validated and correct solution in about two hours total. I know that because I validated that solution myself.</p>
<p>At that point I realized that there is something very interesting going on here with LLM-assisted tooling, and got
curious.</p>
<h2 id="august-2025-codex-and-claude-code">
  <a class="heading-anchor" href="#august-2025-codex-and-claude-code">August 2025: Codex and Claude Code<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>We agreed in the team to go into experimentation mode and to try out different tools to see what works for us. Cursor
was already taken, so I looked at alternatives.</p>
<p>I&rsquo;ve used Jetbrains products for over a decade at that point, so I looked at their AI offering Junie, but I ruled them
out pretty quick after stumbling on some forum threads where users were tearing Jetbrains to shreds for offering an AI
product where you can run out of a months&rsquo; worth of token allowance within mere hours. In hindsight, it all makes sense
now: tokens are actually expensive, and Jetbrains did the tragic &ldquo;mistake&rdquo; of not subsidising the cost of tokens with
billions of VC funding.</p>
<p>Then I looked into Claude Code. At that point, it was a quite young product, about half a year of it being available.
Its main selling point for me was the fact that it ran in a terminal window, allowing me to keep using IntelliJ IDEA
while operating in an environment that felt native to me as a Linux user.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Claude Code felt like magic. I give it a prompt, it goes and finds relevant context by reading through potentially
related files, right there on my disk, and it could also call tools and scripts. &ldquo;Hey, let&rsquo;s rename this enum from
BAD_ENUM_PATTERN_HERE to something better&rdquo;, and then it would actually do it. Doesn&rsquo;t sound super impressive once you
realize that an IDE can do the same thing much faster as long as you come up with the new name yourself, but it felt
magical. The way that it showed the diffs and the overall progress and steps felt natural.</p>
<p>As a Pro tier user, I ran into the 5-hour quota a lot. Whenever that happened, I tried out Codex as I already had a
ChatGPT subscription and I had nothing to lose.</p>
<p>Codex was a mixed bag. Sometimes it would do a good job, but in its default settings it felt slow, while with Claude
Code I felt that it was just ripping through doing useful work. Tune Codex to be faster, and its output degraded
noticeably. I realized quite soon that I prefer quick feedback and iterating more on a solution compared to trying to
one-shot it with Codex, so after I upgraded to a Max 5x plan, I left Codex behind.</p>
<p>I have a strong technical background from an era before this type of tooling was available. Equipped with Claude Code, I
felt like I had superpowers. I knew what needed to be done, what failure modes are common, what to protect against, what
to keep in mind when rolling out new features, and how to resolve incidents. This tool just made all of that faster and
even more accessible. And at the same time, I could more easily detect if it was giving be garbage answers with a
glance.</p>
<p>As a relatively new joiner in the team, Claude Code was also a fantastic way to speed up my own onboarding to the
product and the technical aspects. Previously, finding answers to project or domain specific questions was an exercise
in good IDE usage and building a mental model for yourself. Now, anything I needed was a few well thought out prompts
away.</p>
<p>For me, this marks the &ldquo;oh shit&rdquo; moment with LLM-assisted tooling.</p>
<h2 id="september-december-2025-optimism-experimentation-and-crunch">
  <a class="heading-anchor" href="#september-december-2025-optimism-experimentation-and-crunch">September-December 2025: optimism, experimentation and crunch<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Claude Code and Cursor soon went from a fun thing to experiment with to a critical tool that we had to make the most of
out of necessity. Deadlines loomed, and even with great engineers, there is a practical limit to what you can achieve if
there aren&rsquo;t too many of them available.</p>
<p>This is the time when we pushed the tooling further more and more. Claude skills became a thing around then, so we
started collecting project-specific input and general guidance under those.</p>
<p>I found Claude Code to be the most useful by running it in its bypass permissions mode, but I also valued my home folder
not being deleted by accident, so I vibe-coded a basic sandbox container in which I can safely run Claude Code with
filesystem-level isolation. It also allowed me to run multiple Claude Code instances in a way that prevented them from
interfering with each other, which opened the door for running some wild-ass ideas and experiments in the background.</p>
<p>Integration tests are taking too long to run? Let Claude Code come up with optimization ideas, and let it put together a
benchmarking plan. Most of the recommendations did not do much, but a few lines made integration tests 10% faster!</p>
<p>Worried about your authorization setup containing holes? Give that hunch in as input, let Claude Code do some checks,
and validate the findings. Whoops, some endpoints were unguarded? Write tests that demonstrate the issue, then let
Claude Code fix it. What would&rsquo;ve taken weeks took mere hours to improve.</p>
<p>We also started seeing first signs of what happens when you push too hard with this level of tooling. With a looming
hard deadline and stress, it was not uncommon to see 5000-line PR-s which were hell to review. Vibe-coding artifacts
slipped in, subtle bugs became issues that needed to be rectified. Transactional boundary related issues were especially
easy to slip in, and difficult to rectify.</p>
<p>And no matter how much you instruct Claude Code, it will ignore a non-zero percentage of the instructions at all times.
Using <code>var</code> or deciding to write out full package names for defining a variable type were common and yet basic
annoyances.</p>
<h2 id="product-and-model-churn">
  <a class="heading-anchor" href="#product-and-model-churn">Product and model churn<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When using a tool like Claude Code for the better part of your work day, it will naturally become a critical part of
your workflow.</p>
<p>Critical part that is under a <strong><em>rapid</em></strong> pace of product development.</p>
<p>Sometimes the improvements are positive and genuinely useful.</p>
<p>Sometimes you&rsquo;re hit with a bug that results in a heavy memory leak, leading to all Claude Code sessions terminating
after a few minutes due to being OOM-killed.</p>
<p>I feel like a subject to a grand experiment. It makes sense from Anthropics&rsquo; perspective, you have to experiment
and try out new things to see what works, but as a heavy user of the tool, it makes every working day a game of lottery
and introduces an additional source of uncertainty.</p>
<p>Lately the situation has improved somewhat, but then Anthropic has had constant scaling issues. I have the benefit of
working in Europe, so I can get my work done before the US wakes up and demolishes their servers with high load or buggy
releases, but even then I&rsquo;m not immune to outages.</p>
<p>The models behind Claude Code have also seen a rapid release cadence, which seems to follow a pattern of:</p>
<ul>
<li>new model released</li>
<li>it is better than previous ones</li>
<li>few weeks later you can feel some level of degradation, you see more complaints online</li>
<li>back to step 1</li>
</ul>
<p>Purely vibes-based, but it certainly feels that way.</p>
<p>That leads me to one of the biggest frustration points with tools like Claude Code. When everything is changing so fast,
so rapidly, and you have no idea what experiments you&rsquo;re in or what toggles Anthropic has just changed, how are you
supposed to reliably get useful output with this type of tooling? Not to mention that LLM-s are still fundamentally
non-deterministic, which spices things up even more.</p>
<p>It feels very chaotic and could very well be normal &ldquo;early adopter&rdquo; pain, but it doesn&rsquo;t change the fact that this level
of uncertainty contributes to feeling burnt out.</p>
<p>Agentic coding may very well be the norm in the future, but in an era of wild experimentation I feel it doesn&rsquo;t make
sense to build a meaningful amount of supporting infrastructure on top of a foundation made out of sand.</p>
<h2 id="the-real-ai-productivity-gains">
  <a class="heading-anchor" href="#the-real-ai-productivity-gains">The real AI productivity gains<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>A large language model alone is not that useful. Put a chat interface in front of it, and things get more interesting.
Give it ability to call tools and source the necessary information itself, and now you&rsquo;re cooking.</p>
<p>AI based tooling has been marketed a lot as a major productivity booster and I agree that it does help with that, with a
few dozen asterisks and nuances. However, I&rsquo;ve observed that most of the actual gains seem to come from things like
ignoring good practices. You <em><strong>will</strong></em> do more by putting Claude Code into auto mode or the spicier bypass
permissions mode, and if you give it access to Slack, Notion, Jira, Linear, Google Drive, GitHub and more, it will have
no issues gathering necessary context and performing boring actions on your behalf.</p>
<p>Need to mass-create Linear tickets and set proper dependencies between them? Claude Code is genuinely useful here.</p>
<p>But what happens when Claude is tricked into performing malicious actions? Or Claude just goes wild and deletes your
companies&rsquo; Google Drive?</p>
<p>It&rsquo;s a lot of trust put into a rapidly growing company headquartered in the USA. A few years ago, you would have been
fired for sharing your intellectual property and internal company information with a third party, but now it&rsquo;s called
AI-native something-something and you&rsquo;ll fall behind if you don&rsquo;t use it.</p>
<p>We&rsquo;ve given everyone a loaded revolver without explaining things like risk management, threat modelling, data privacy
and GDPR, and how to reasonably deal with all of that while balancing it with productivity gains. Pessimist in me says
that it will have consequences sooner or later.</p>
<h2 id="the-bottleneck">
  <a class="heading-anchor" href="#the-bottleneck">The bottleneck<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Humans are still the bottleneck. In an established product, you will have actual paying clients, and people who
depend on your product. I don&rsquo;t believe that going full vibe-coding-superstar-engineer in such a context makes a lot of
sense, which means understanding, reviewing and testing your own changes. But that takes time and effort. It always has
taken time and effort, but with code being cheaper to produce, it&rsquo;s ballooning.</p>
<p>I&rsquo;m working in a team where I have high trust in my fellow engineers, which means that we are trying things like
reviewing the high level plan of an intended change and not necessarily the final end result, that has to be done by the
implementing engineer. This should help us achieve more while having basic architectural-level thinking and checks in
place, and it discourages 5000-line PR-s because the author needs to review that by themselves. Jury&rsquo;s still out on that
one and we do have exceptions like still reviewing junior engineers&rsquo; work to give them better feedback while they grow
into an experienced engineer.</p>
<p>Some try to solve the AI unreliability issue with adding more AI to review AI code. We&rsquo;re also giving that a go with a
custom skill that amounts to just calling each project skill depending on the context of the changes to try and flag
some areas that may need more consideration or that don&rsquo;t make sense given the intent of the changes. It&rsquo;s okay, but not
a replacement for a human review. Claude Code can complain about a function not being performant enough while a human
reviewer can identify that the changes can be completely skipped because we can solve the problem with a product-level
decision, or an existing query can solve the same issue in a more elegant way.</p>
<p>It seems that a combination of classical tooling (linters, formatters, static analysis) and LLM-level insights is an
approach worth trying for doing reviews, but you&rsquo;ll have to layer them on to have a chance to have meaningful and
somewhat reliable results, which means a high token spend. What are you willing to pay for an LLM-assisted code review?
1 EUR? 10 EUR? 100 EUR?</p>
<p>But review is rarely only about the code. Does the solution achieve what it&rsquo;s supposed to do? Is it the best way to
solve that problem? Does it actually work when put into the hands of actual customers?</p>
<p>The good news is that you <em>can</em> make it easier to also set up local development environments with production-like data
and custom convenience tooling using tools like Claude Code. The productivity gains from simple internal tools like that
are insane and allow you to do more, safely. But it will still take time, focus and context switching, and you can&rsquo;t
really skip that because LLM-based tools often have weird failure modes with their output that may only come up during a
manual test of the whole solution.</p>
<p>Bashing out e2e tests for each new feature that demonstrates its functionality and correctness seems to also be a solid
approach in a greenfield project where you&rsquo;re prototyping something quickly and then elevating it into something that
can actually be used, reviewed and released.</p>
<h2 id="the-economics">
  <a class="heading-anchor" href="#the-economics">The economics<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Subscription-based pricing is still here for now and all I can say here is that we should take full advantage of that
while we still can to improve parts of our world that we have control over.</p>
<p>Let the investors subsidize tackling the technical debt in your project, or performing that maintenance you postponed
due to lack of resources, or experimenting with some wild-ass ideas. At some point it&rsquo;s going to change and API-based
pricing is a better reflection of the actual costs, and it&rsquo;s not looking great.</p>
<p>Screw <a href="https://blog.pragmaticengineer.com/the-pulse-tokenmaxxing-as-a-weird-new-trend/">tokenmaxxers</a> though, you&rsquo;re
ruining it for the rest of us.</p>
<h2 id="llm-s-as-a-force-of-good">
  <a class="heading-anchor" href="#llm-s-as-a-force-of-good">LLM-s as a force of good<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>A lot of discussions out there around LLM-s seem to be focused on the slop angle. It certainly makes it much easier
compared to copying answers off of StackOverflow, but that doesn&rsquo;t mean that you <em>have</em> to use these tools to go fast
and break a lot of things. You can use the same tooling and do what you&rsquo;ve been doing already, but with more intent and
much higher quality.</p>
<p>After adopting LLM-based tooling, I have observed these positive changes in my day-to-day work:</p>
<ul>
<li>code is better tested</li>
<li>number of TODO-s is dropping</li>
<li>investigations to customer questions and fixes to one-off problems are way faster and more correct</li>
<li>improving platform security doesn&rsquo;t have to wait for Q4 2027 any longer</li>
<li>I have more time to think about the high-level architecture of the solution and play around with different approaches,
evaluating them against our requirements and limitations</li>
<li>existing parts of the platform are much more resilient now as a result of applying experience from past incidents</li>
<li>project patterns, practices and agreements are documented</li>
<li>moving towards infrastructure-as-code setup is much more approachable, especially to other engineers in the team
that don&rsquo;t have a lot of exposure to this area</li>
<li>we&rsquo;ve resolved major performance issues on the fly and made proactive performance improvements that have avoided a lot
of issues during periods of high load and scaling the platform</li>
</ul>
<p>This aspect is what I love about LLM-assisted tooling. I can take my experience and strong technical background,
plus all the countless painful incidents I&rsquo;ve worked through, and apply those lessons in my current work, at a faster
pace, and yet with better quality.</p>
<p>Feels like a superpower, but you have to apply it properly and with rigor to make the most of it.</p>
<h2 id="ai-vs-my-self-hosting-hobby">
  <a class="heading-anchor" href="#ai-vs-my-self-hosting-hobby">AI vs my self-hosting hobby<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This positivity has also expanded into my hobby, which involves managing my fleet of machines via Ansible and hosting a
bunch of services in containers. Validating my existing Ansible playbooks and coming up with new roles on the fly
whenever I add something to my setup is much more approachable. My free time is much more limited nowadays and games
like <a href="/posts/2026/05/24/forza/">Forza Horizon 6</a> don&rsquo;t help there, so dabbling with my hobby for a few hours here and
there and actually achieving something is genuinely great.</p>
<p>To balance that excitement out, the computer parts market has gone to shit. With everything being much more expensive,
I&rsquo;ve reworked my setup to use what I have and to pray that no expensive parts die. I&rsquo;ve stopped watching most videos of
new hardware as a result, because it&rsquo;s hard to become excited about a new mini PC that is outside my budget.</p>
<p>I&rsquo;m not sure where I stand with my hobby now. With LLM-assisted tooling, I&rsquo;ve blasted through my ideas to-do list there
and fixed issues that have bothered me a lot, and yet I&rsquo;ve lost the excitement on the hardware side because I won&rsquo;t be
buying new platforms anyway.</p>
<p>One area that remains as an unexplored area is running local LLM-s. Other than that, I&rsquo;m not sure. I suppose I&rsquo;m taking
a small break from it for the first time in 10+ years, and that makes me sad.</p>
<h2 id="llm-s-and-this-blog">
  <a class="heading-anchor" href="#llm-s-and-this-blog">LLM-s and this blog<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="/posts/2024/09/06/blog/#:~:text=No%20generative%20AI%20garbage">This one has not changed,</a> this blog is my voice and
replacing that with the one from a machine is still a no-go for me.</p>
<p>I have featured content where the subject of the post was thrown together with LLM-assisted tools for jokes where
<a href="/posts/2026/02/15/btrfs/">realistically only a handful of people reading this blog will get.</a> That&rsquo;s still fine by me,
and I encourage having fun. Otherwise, what&rsquo;s the point of living?</p>
<h2 id="the-non-determinism">
  <a class="heading-anchor" href="#the-non-determinism">The non-determinism<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It has been 0 days since Claude Code has made up a link to a pull request within our own repository to which it has full
access via the GitHub CLI.</p>
<p>It&rsquo;s not a new phenomenon that LLM-s make up plausible shit, and yet it keeps frustrating me every time that it does
that. The profuse apologising certainly does not help.</p>
<p>&ldquo;Oh yeah mate I totally forgot that I shouldn&rsquo;t wrap every line of code in a try-catch block, that is on me, I will do
better.&rdquo; <em>and then it does the same thing 2 minutes later.</em></p>
<p>God, I hate that.</p>
<p>The solution to this is, once again, to layer more AI on top. I suppose if your tools are correct 95% of the time, and
you do the same thing repeatedly, then eventually you&rsquo;ll get close to being 100% correct, but never to 100% exactly.</p>
<p>The worst parts are times when <strong>it outputs Java package names belonging to actual software development consultancies in
Estonia.</strong> Did they leak something, mix up some sessions, or does it come from the training data? Do I <em><strong>want</strong></em> to
know the answer to that?</p>
<h2 id="the-dumb-ass-babysitting">
  <a class="heading-anchor" href="#the-dumb-ass-babysitting">The dumb-ass babysitting<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>In the pursuit of &ldquo;safety&rdquo;, providers like Anthropic have crippled the functionality of their solutions in certain
areas, such as cybersecurity. Ask Claude Code to help write a proof of concept for a known vulnerability against your
own service, and it will politely refuse or hit you with an API error.</p>
<p>Great, I didn&rsquo;t <em><strong>really</strong></em> need to test my own service that I&rsquo;m responsible for against a type of actively exploited
vulnerability that could end the business in one go. Thanks, Anthropic, <em>you&rsquo;ve really made the world safer now.</em> <code>/s</code></p>
<h2 id="judgement">
  <a class="heading-anchor" href="#judgement">Judgement<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Turns out that all the experience I&rsquo;ve accumulated is not useless, it&rsquo;s become much more critical.</p>
<p>More often than not, you need to use your own judgement when making changes, choosing between alternatives, and just
plain thinking about the issue at hand.</p>
<p>I can give Claude Code a well-thought-out prompt, highlighting common patterns that we need to tackle and address, and
it will do an okay job, or at least that&rsquo;s what it looks like.</p>
<p>But when I investigate the result, I still see areas that it misses because it lacks the wider context,
or is blissfully unaware of alternatives, or it just gets its investigations really wrong by making shit up on the fly
or misunderstanding a functionality completely. Press it on some findings, and you&rsquo;ll often find that it did a really
shitty job, actually, and you can improve the solution a lot.</p>
<p>Interestingly, I&rsquo;ve found myself arguing about a topic with Claude Code, only to then discover with a manual
investigation that I was in fact very wrong and Claude Code was actually <em><strong>right</strong></em>. Usually that&rsquo;s followed up by a
documentation update or a refactor clarifying the solution, but those sessions serve as a good reminder that I&rsquo;m not
that infallible myself.</p>
<h2 id="how-i-work-vs-how-claude-code-works">
  <a class="heading-anchor" href="#how-i-work-vs-how-claude-code-works">How I work vs how Claude Code works<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s interesting to observe how Claude Code operates. In a lot of ways, it mirrors how I operate.</p>
<p>I have a problem that needs solving. Okay, let&rsquo;s gather more context, search for relevant files, check some historic
Jira tickets on that topic for good measure. Do some Slack searches. Try to get the full picture.</p>
<p>Now that I have that, I can try to come up with a solution. Often that ends up with minor changes, at other times I will
copy-paste existing files to create a new endpoint, adjusted for my use case, named properly. Maybe I&rsquo;ll add a few tests
for good measure.</p>
<p>Claude Code does all of that, but better. I find it so much easier to judge a proposed solution than to write it all
from scratch. I was never the person that enjoyed tackling compilation errors, or checking why once again my tests don&rsquo;t
work because of some Mockito nuance. All that focus is now spent on brainstorming a solution, improving its design, and
thinking about security, performance, compliance, architecture and how it all fits together. I&rsquo;ve rarely worked in a
team where those items got the proper attention that they deserve.</p>
<h2 id="skill-atrophy">
  <a class="heading-anchor" href="#skill-atrophy">Skill atrophy<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There are concerns out there around skill atrophy when relying on LLM-s too much. I&rsquo;m not too concerned with that.</p>
<p>I learned to write using a pen and paper, but picked up on writing on a keyboard at a modest speed<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, and yet I&rsquo;m much
faster with it. I haven&rsquo;t forgotten to write in cursive, it just looks less beautiful than it did when I was younger,
and that&rsquo;s OK.</p>
<p>If LLM-s disappeared right this second, I&rsquo;ll revert back to the old ways of working. Sure, the pace will be slower in
the short term, but I&rsquo;ll make some choices and changes to ways of working, expected pace and will shed expectations and
workloads that I won&rsquo;t have time for.</p>
<p>Did you forget to ride a bicycle the moment you got your first car?</p>
<h2 id="good-practices-are-socially-acceptable-now">
  <a class="heading-anchor" href="#good-practices-are-socially-acceptable-now">Good practices are socially acceptable now?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One interesting observation is that every good practice of classical software engineering has now become a requirement
to use LLM-assisted tools effectively. You know, those items that you had to fight for prioritizing in a poorly
functioning organization?</p>
<p>You should have documentation, and it should be kept up-to-date. Amazing insights!</p>
<p>Yes, you <em><strong>should</strong></em> tackle that tech debt now because otherwise Claude Code will make use of deprecated features and
fields and introduce more legacy code!</p>
<p>Having tests that catch regressions are good!</p>
<p>Functional, stable, performant CI/CD pipelines and team processes are foundational to a well performing engineering
team, who would have thought?</p>
<p>Those who were already doing a good job are now doing great, and the poorly performing teams are suffering when applying
the same tools.</p>
<h2 id="async-development">
  <a class="heading-anchor" href="#async-development">Async development<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;ve followed my blog for a while, then you&rsquo;ll know that I have a home server that&rsquo;s on 24/7.</p>
<p>This has allowed me to spawn a Claude Code instance on a separate VM inside of it that mirrors my setup at work, and
I&rsquo;ve used that always-on playground as a way to tackle annoying long-running tasks or wild-ass investigations and tests
that take hours to complete.</p>
<p>For example, we are firm believers in rebasing changes on top of the main branch, but if you have a bunch of PR-s ready
to merge, it goes into an annoying cycle of rebase, update other branch, wait for CI to run, complete, start again.
Turns out that you can prompt Claude Code with a simple automation loop and it will take care of that by itself,
including the resolution of conflicts.</p>
<p>For larger investigations and technical migrations, I have successfully set up a prompt to achieve a goal, some
guidance, and my expectation of it running autonomously. I can come back to it the next morning and review its output.
It is straight up magic to have the computer work on a Spring Boot 4 upgrade while I&rsquo;m playing Forza Horizon 6 (after
work, of course).</p>
<p>It&rsquo;s also possible to schedule some work in advance. If my 5-hour quota gets refreshed at 19:00, I can set Claude up
with a goal and instructions to start at that specific time, meaning that you can use your AI subscription plan to make
the most of your AI subscription plan.</p>
<p>I&rsquo;ve long dreamed of setups where my laptop is a very basic machine with great battery life, and all the heavy lifting
happens on a powerful remote server. With classical development, that approach would&rsquo;ve included a remote desktop setup.
The necessity of a good internet connection was a major blocker for using such a setup for all of my work, and video
compression artifacts make text look like trash.</p>
<p>With Claude, you can just run it in a terminal, over SSH. All you&rsquo;re moving is text back-and-forth, which is infinitely
more performant even in low internet connectivity scenarios. May not be the best flow for front-end or design-heavy
work, but you can successfully offload a wide variety of activities to a remote Claude Code instance hosted on your
hardware.</p>
<p>This is what this tooling <em>should</em> allow us to do: achieve more while spending less time. We&rsquo;re not there yet, but it&rsquo;s
a goal we should aspire towards instead of the productivity gains quietly slipping into the pockets of billionaires.</p>
<h2 id="zero-predictions-many-questions">
  <a class="heading-anchor" href="#zero-predictions-many-questions">Zero predictions, many questions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At the current technical level, I don&rsquo;t believe that we can reliably shift to a model where a coding agent takes in
human input and you&rsquo;ll have a reliable, tested and correctly architected solution that fits together with the rest of
your project, with zero human review in the process.</p>
<p>If you put in a lot of effort into building a custom harness, adding layers of checks on top, and keeping that machinery
running with active maintenance, you will likely reach a point where you can somewhat reliably use this approach to get
solid results. To get to that point, you will need to shift your focus from building your product to becoming a
professional harness engineer, and the end result might cost a lot of tokens to run.</p>
<p>Is that sacrifice worth it, and will that same approach remain working in 6 months?</p>
<p>We&rsquo;ve already seen that you can build a spaghetti architecture and end up with an unmaintainable dumpster fire of a
product using classical engineering approaches. Once you reach that point, any progress grinds to a halt and you&rsquo;re
stuck fighting fires while losing customers. You can reach that point faster if you build more with LLM-assisted tools
without having a proper plan and architecture in place. What use is a harness if you can&rsquo;t build anything impactful with
it?</p>
<p>You <em><strong>can</strong></em> take that tooling and augment your own work in a positive way, making iterative changes and trying out new
approaches and ideas at a sustainable pace that doesn&rsquo;t steal focus from your product that you&rsquo;re supposed to be working
on.</p>
<p>It&rsquo;s also clear that the demand for this type of tooling is there. 200 EUR/month subscriptions for a tool was not the
norm even a few years ago, and here we are with people happily paying that and still finding that it brings great value
to them.</p>
<p>Since the space keeps evolving and external forces, such as infinite money glitches not being a thing in real life, it
raises some topics that I&rsquo;m keenly keeping an eye on, even if there is a factor of morbid curiosity there that stems
from a desire to see how it all plays out in the end.</p>
<p>What will a successful engineering team look like from a few years from now?</p>
<p>If the real cost of tokens is passed on to consumers or availability suffers dramatically due
to <a href="https://www.reuters.com/world/middle-east/amazons-cloud-unit-reports-fire-after-objects-hit-uae-data-center-2026-03-01/">an event</a>,
then what will happen to existing AI-first workflows?<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>
<p>At which point is the tooling too expensive to use?</p>
<p>When will locally runnable open weights models and open source harnesses be good enough to replace tools like Claude
Code?<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></p>
<p>When will a state-of-the-art model from Anthropic or OpenAI be leaked?</p>
<p>When will Anthropic/OpenAI get hacked in a catastrophic way and what implications will it have for, well,
<em><strong>everything</strong></em>?</p>
<h2 id="final-words">
  <a class="heading-anchor" href="#final-words">Final words<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you work in an engineering position and you&rsquo;ve avoided relying on this type of tooling, leave the very real downsides
and risks aside for a moment and give it an honest try. Push its limits. Do something with it that brings joy.
After that, you&rsquo;ll at least have a more informed opinion on this type of technology, and perhaps it could end with
renewed interest in a practical application of LLM-s that could branch to using open source coding agents and harnesses,
and exploring various locally runnable open weights models that are desperately needed to seize the means of code
production.<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup></p>
<p>If you&rsquo;re heavily using this type of tooling already to move fast, then take a break. Move slowly. Act with intent. We
have a choice to either build more and faster, or to build what we already wanted to build, but with much better
quality. Before LLM-assisted tooling came into the picture, we were already in a software crisis where too much was
built with not enough quality controls in place and with maintenance, security and performance being distant
afterthoughts. Now, we have the means to better address those areas. Don&rsquo;t waste this chance to make the software world
a better place, and through that the real world.</p>
<p>Despite the challenges and very real near future risks around relying on this type of tooling, I remain cautiously
optimistic and will keep using an LLM-first approach to building and maintaining services and infrastructure. For now,
the productivity gains and enjoyment are outweighing the feeling of being burnt out.</p>
<p>If it doesn&rsquo;t work out, then I will sleep well knowing that I have my beekeepers&rsquo; hat waiting for me.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>my unofficial policy on my own blog post covers is simple: if I don&rsquo;t have a topical one, I&rsquo;ll pick one with a cat
from my personal collection, or scribble something together in GIMP. The one on this is my beloved cat Tux sitting on
top of a ThinkPad X230 that has one of those chonker docks on them. She is an absolute delight of a cat. In fact, she is
the best cat, period.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>btw I use Fedora&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I learned to touch type one afternoon, but, like, half-way.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>this is a topic that&rsquo;s actively playing out with more providers moving to token-based pricing instead of
subscription-based fixed price plans.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>geopolitically motivated competition in the realm of AI could end up being beneficial for the rest of us after
all.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>I love the approach that Wendell from Level1Techs has taken: embrace the new technology, but be mindful of the
very real downsides and risks. Instead of putting your head in the sand or trusting big providers blindly, fight for the
right to run local models on hardware that you control! It&rsquo;s self-hosting, but taken to LLM-s, and I&rsquo;m fully on board
with those ideals and ideas.&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Improving my focus by giving up my big monitor</title><link>https://ounapuu.ee/posts/2026/04/01/focus/</link><pubDate>Wed, 01 Apr 2026 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/04/01/focus/</guid><description>Thoughts on an experiment that I've been running for about a month.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/04/01/focus/media/cover_hu_c1548efdb0fb585f.jpg" width="1200" height="630" alt="Improving my focus by giving up my big monitor" /><p>Keeping my focus has been challenging. It&rsquo;s not a new phenomenon, and I suspect that there are contributing factors that
have lead to the unfocused state dominating. For example, I&rsquo;ve been that guy who wants to be on top of things, to be in
the loop, to respond to urgent issues. It feels fantastic to be in that firefighter role as it gives me the <em>feeling</em> of
having an impact, but it results in me being drained at the end of the day and often over-caffeinated.</p>
<p>One day I was doing work on my laptop on a couch because hitting 30 apparently means that sleeping slightly incorrectly
results in debilitating back pain. During that session, I was working on a larger task and making tons of tiny little
changes that needed to be done in order to release a new feature. I was finally in the zone again, and it felt
fantastic!</p>
<p>That&rsquo;s when I decided to start an experiment: can I improve my focus by giving up my big monitor?</p>
<h2 id="results">
  <a class="heading-anchor" href="#results">Results<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve done this type of &ldquo;experiment&rdquo; a few times in the past when the power has gone out and my super duper ergonomic
setup has become useless. No power, no USB-C dock, no monitor. It wasn&rsquo;t that fun and my eyes hated reading text off of
a laptop screen.</p>
<p>A few things have changed since then:</p>
<ul>
<li>GNOME has working fractional scaling that you can simply enable in display settings</li>
<li>ThinkPad displays have gotten better, with the picture being quite cromulent, and the 16:10 aspect ratio helps fit
more
on the screen</li>
<li>the nature of my work has changed and will keep changing in the near future</li>
</ul>
<p>Almost a month in, I&rsquo;ve had a pleasant experience with this experiment. I feel more focused. Yeah, that&rsquo;s it. Am I
actually more focused is up for debate, as I&rsquo;m not sure how to measure it objectively.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Working off of a single screen forces me to focus at what&rsquo;s at hand. Alt-tabbing to a different app is quick, but just
enough to deter me from doing it in meetings or other focused tasks.</p>
<p>In my personal free time<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, this has also resulted in computer use becoming more intentional. On a 34&quot; ultrawide
monitor, it was too easy to put YouTube running on the left side, and whatever else on the right. It was distracting and
resulted in time being wasted doing nothing. Interestingly enough, making computer use more intentional was a trick that
I tried when recovering from burnout, and it helped a lot.</p>
<p>As a side effect, the power consumption of my whole home office setup is significantly smaller, as I don&rsquo;t have to power
my ultrawide monitor. That made up most of the power consumption, with peaks of up to 100W.</p>









<figure class="center">
  <a href="/posts/2026/04/01/focus/media/power-usage.png">
    <img src="/posts/2026/04/01/focus/media/power-usage_hu_7c82f3fe132180ab.webp"
     width="1000"
     height="503"
     loading="lazy"
     decoding="async"
     alt="Note that this is for the whole desk setup, including one-off projects like stress testing desktop hardware.">

  </a>
  <figcaption class="center">Note that this is for the whole desk setup, including one-off projects like stress testing desktop hardware.</figcaption>
</figure>

<p>I also don&rsquo;t have to fight with <a href="https://jeffq.com/blog/the-ethernet-pause-frame/">my dock killing my whole network,</a> because there is no dock.</p>
<h2 id="how-to-do-it-well">
  <a class="heading-anchor" href="#how-to-do-it-well">How to do it well<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re just cleaning up your desk and plopping your laptop on there, you will likely have a bad time. The posture
will be off, and depending on your laptop, the keyboard and touchpad combination can prove to be an ergonomic nightmare.</p>
<p>At the very least, you should put your laptop up somewhere higher. Ideally, it should be using a stand that allows you
to use your favourite wireless keyboard and mouse below it. A simple laptop stand could get you most of the way there,
but the ideal solution is a freely adjustable monitor arm combined with a VESA-mounted laptop holder. This gives you the
freedom to place the laptop exactly as you&rsquo;d like while leaving the desk free for your peripherals.</p>









<figure class="center">
  <a href="/posts/2026/04/01/focus/media/cables.jpg">
    <img src="/posts/2026/04/01/focus/media/cables_hu_50901e94dabe631a.webp"
     width="751"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="All I ever need: power, and ethernet.">

  </a>
  <figcaption class="center">All I ever need: power, and ethernet.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/04/01/focus/media/cable-routing.jpg">
    <img src="/posts/2026/04/01/focus/media/cable-routing_hu_45c11ff7632d4f0d.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="Routes nicely and is out of the way.">

  </a>
  <figcaption class="center">Routes nicely and is out of the way.</figcaption>
</figure>

<p>Most monitor arm laptop holders have side arms that keep it in place, but I found them to be extremely annoying, so I
removed them by disassembling the holder and yanking out the side arms and springs. You may still need them if you are
using a very aggressive vertical angle, but I hated having to give up one USB-A port and blocking about 25% of the
exhaust fan also didn&rsquo;t seem like a good idea. Mounting the laptop with the springy side arms was also awkward.</p>
<p>If you&rsquo;re using a desktop and have a big display, then intentionally using a smaller and cheaper one for a while may
prove to be just as effective.</p>
<p>If you&rsquo;re using a laptop with a horrible display with poor viewing angles, glare and crappy resolution (which a lot of
older ThinkPads have), then you can still try this out, but I suspect that you&rsquo;ll not have a very good experience with
it due to this reason alone.</p>
<h2 id="exceptions-to-the-rule">
  <a class="heading-anchor" href="#exceptions-to-the-rule">Exceptions to the rule<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I still prefer to do my gaming sessions on a big screen. It&rsquo;s more immersive, and I can make out tiny details better,
such as spotting a car in the distance while driving in the oncoming lane in Need for Speed Most Wanted.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m happy with this setup.</p>
<p>That&rsquo;s all I ever needed.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>go ahead, try to measure developer productivity objectively. Good luck!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>that&rsquo;s what I call the time window between putting my son to sleep and midnight.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The cloud just stopped scaling</title><link>https://ounapuu.ee/posts/2026/03/01/cloud/</link><pubDate>Sun, 01 Mar 2026 17:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/03/01/cloud/</guid><description>Future post on this blog: why my home server is 'production' now.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/03/01/cloud/media/cover_hu_c2677f96f335e732.jpg" width="1200" height="630" alt="The cloud just stopped scaling" /><p>It has happened.</p>
<p><a href="https://status.hetzner.com/incident/0a75c7ae-3377-41dc-aabe-601063724d24">The cloud just stopped scaling.</a></p>
<p>Hetzner&rsquo;s cloud, for now.</p>
<p>At this rate, my home server will actually have to become production at work, and
<a href="/posts/2025/12/01/steam-machine/">my gaming PC</a> has to be converted to a server because it has a whopping 32 GB of
RAM and 6 good CPU cores.</p>
<p>With <a href="https://store.steampowered.com/app/2483190/Forza_Horizon_6/">Forza Horizon 6</a> on the <em>horizon</em>, it is time for
some difficult decisions&hellip;</p>
<h2 id="2026-03-02-update">
  <a class="heading-anchor" href="#2026-03-02-update">2026-03-02 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Shortly after publishing this
post, <a href="https://www.404media.co/amazon-data-centers-on-fire-after-iranian-missile-strikes-on-dubai/">AWS had a different type of issue with availability zones going down</a>
due to&hellip; Iranian missile strikes. I&rsquo;ve wanted decentralized hosting to be more popular, but <em><strong>not like this.</strong></em></p>
]]></content:encoded></item><item><title>BTRFS disk errors to fall asleep to</title><link>https://ounapuu.ee/posts/2026/02/15/btrfs/</link><pubDate>Sun, 15 Feb 2026 22:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2026/02/15/btrfs/</guid><description>Inspired by a true story.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2026/02/15/btrfs/media/cover_hu_6ec175dedffba3f0.jpg" width="1200" height="630" alt="BTRFS disk errors to fall asleep to" /><p>This is inspired by a dying Seagate Portable 4TB hard drive, and brought to you by 15 minutes of vibe engineering.</p>
<p><a href="/btrfs-disk-errors-to-fall-asleep-to/index.html">Enjoy.</a></p>
<p>Starting the RMA process on the Seagate website is one of the most difficult things I&rsquo;ve done lately, and half the links
there look like a legitimate phishing attempt.</p>









<figure class="center">
  <a href="/posts/2026/02/15/btrfs/media/lol.png">
    <img src="/posts/2026/02/15/btrfs/media/lol_hu_9382c15dfd593c89.webp"
     width="1000"
     height="340"
     loading="lazy"
     decoding="async"
     alt="lol.">

  </a>
  <figcaption class="center">lol.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2026/02/15/btrfs/media/lmao.png">
    <img src="/posts/2026/02/15/btrfs/media/lmao_hu_60043490600a4347.webp"
     width="1000"
     height="694"
     loading="lazy"
     decoding="async"
     alt="lmao.">

  </a>
  <figcaption class="center">lmao.</figcaption>
</figure>

<p>By the time I got the RMA created, I&rsquo;ve run out of time and energy to follow on with this process.</p>
<p>I guess it&rsquo;s a great way to make your RMA rates stay low, though!</p>
]]></content:encoded></item><item><title>Drawing parallels between home renovation and software development</title><link>https://ounapuu.ee/posts/2025/12/15/construction-vs-software/</link><pubDate>Mon, 15 Dec 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/12/15/construction-vs-software/</guid><description>I had a lot of time to think during an apartment renovation and how it's eerily similar to what I do at my day job.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/12/15/construction-vs-software/media/cover_hu_a121cfcb35732eac.jpg" width="1200" height="630" alt="Drawing parallels between home renovation and software development" /><p>I had the opportunity to do some slight renovation on an apartment.</p>
<p>It was nothing fancy, it involved the following:</p>
<ul>
<li>removing the old carpet</li>
<li>removing the wallpaper (surprisingly difficult and annoying!)</li>
<li>plastering, filling in holes</li>
<li>painting the walls</li>
<li>installing new power sockets</li>
<li>installing the cheapest laminate flooring</li>
</ul>
<p>I expected it to take a few months&rsquo; worth of weekends. Took over half a year. Oops.</p>
<p>During that time I had a lot of time to think about all sorts of things. It was a nice zen activity for me if we leave
out the part where I was physically exhausted, but on the bright side I was mentally relaxed by the time I got back to
work. And by the time I was mentally exhausted after a long work week, I was ready to do some physical work.</p>
<p>My previous experience with construction and renovation work is pretty minimal. I have a toolbox, and I&rsquo;m a tool myself,
but that was pretty much it. This experience was characterized by a lot of improvisation and a little bit of googling
for the parts where I felt genuinely out of my depth, such as installing the laminate floor.</p>
<p>I realized quite soon that renovation and software development are very similar in a lot of ways. After all, both
involve building <em>something</em> and they both contribute to my back pain and deteriorate my dwindling sanity.</p>
<p>Here are some parallels that I observed during the many, many weekends spent renovating an apartment.</p>
<h2 id="prep-work-is-everything">
  <a class="heading-anchor" href="#prep-work-is-everything">Prep work is everything<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I did my best to reasonably plan ahead and calculated things like floor and wall surface areas with a reasonable degree
of accuracy, plus 10% buffer. That buffer paid off big time.</p>
<p>The part where you have to prepare a surface for plastering and painting is super annoying, but the end result is
dependent on this step going well. It&rsquo;s like planning in software development: if you just start coding and ignore the
rest, you will end up with a crappy result.</p>









<figure class="center">
  <a href="/posts/2025/12/15/construction-vs-software/media/pain.jpg">
    <img src="/posts/2025/12/15/construction-vs-software/media/pain_hu_a12b0fdf898540bb.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="This part of the job is absolutely horrible. It sucked. Annoying as all hell.">

  </a>
  <figcaption class="center">This part of the job is absolutely horrible. It sucked. Annoying as all hell.</figcaption>
</figure>

<p>Making a few initial up-front investments into dust-proofing a room during renovations is also a wise investment.
Learned that a bit too late myself.</p>
<h2 id="being-in-the-zone-rules">
  <a class="heading-anchor" href="#being-in-the-zone-rules">Being in the zone rules<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I felt it multiple times during the renovation work, sometimes you just get into a groove and the time just flies. It
was usually interrupted by my body letting me know that I should probably take a break and eat something.</p>
<h2 id="the-right-tool-can-make-all-the-difference">
  <a class="heading-anchor" href="#the-right-tool-can-make-all-the-difference">The right tool can make all the difference<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Doing something manually sucks. The speed at which a sanding machine can make the walls nice and smooth is crazy. The
feeling is comparable to writing Java in Notepad vs IntelliJ IDEA, one is infinitely more convenient and faster, but
costs more in money.</p>
<h2 id="learning-and-acquiring-new-tools-is-fun">
  <a class="heading-anchor" href="#learning-and-acquiring-new-tools-is-fun">Learning and acquiring new tools is fun<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At some point it&rsquo;s counterproductive, and you&rsquo;re unlikely to use them all, but nevertheless it&rsquo;s fun to browse around
and pick something new up. Kind of like opening
up <a href="https://github.com/awesome-selfhosted/awesome-selfhosted">awesome-selfhosted</a> list to see what else you can put on
your home server.</p>
<h2 id="refactoring">
  <a class="heading-anchor" href="#refactoring">Refactoring<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It&rsquo;s terrible to redo something you already did, but sometimes it has to be done for the best end result.</p>
<h2 id="rtfm---read-the-fucking-manual">
  <a class="heading-anchor" href="#rtfm---read-the-fucking-manual">RTFM - read the fucking manual<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I didn&rsquo;t do this for one room, and it bit me in the butt a few months later with the floor. Oh well.</p>
<h2 id="prepare-for-unforeseen-consequences">
  <a class="heading-anchor" href="#prepare-for-unforeseen-consequences">Prepare for unforeseen consequences<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Sometimes you&rsquo;ll discover an exposed electrical wire behind the wallpaper.</p>









<figure class="center">
  <a href="/posts/2025/12/15/construction-vs-software/media/ohshit.jpg">
    <img src="/posts/2025/12/15/construction-vs-software/media/ohshit_hu_1a374036332aacf.webp"
     width="1000"
     height="718"
     loading="lazy"
     decoding="async"
     alt="Things that you don&#39;t want to see: exposed electrical cables. Aluminium exposed electrical cables? Even worse.">

  </a>
  <figcaption class="center">Things that you don&#39;t want to see: exposed electrical cables. Aluminium exposed electrical cables? Even worse.</figcaption>
</figure>

<p>Sometimes removing the baseboard removes a lot of the plaster on the wall.</p>
<p>Sometimes you will trip over the big bucket of water and cause a big mess.</p>
<p>Sometimes you&rsquo;ll unknowingly drill into an electrical cable.</p>
<p>It happens. Be ready for it.</p>









<figure class="center">
  <a href="/posts/2025/12/15/construction-vs-software/media/kurwa.jpg">
    <img src="/posts/2025/12/15/construction-vs-software/media/kurwa_hu_881ef9ae344d514.webp"
     width="1000"
     height="543"
     loading="lazy"
     decoding="async"
     alt="Makita makes some good drills, but they are a really poor substitute for a light switch.">

  </a>
  <figcaption class="center">Makita makes some good drills, but they are a really poor substitute for a light switch.</figcaption>
</figure>

<h2 id="estimates">
  <a class="heading-anchor" href="#estimates">Estimates<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I blew past any pessimistic estimates that I set up for myself, mainly because of the fun little surprises I had during
the construction work.</p>
<h2 id="tech-debt">
  <a class="heading-anchor" href="#tech-debt">Tech debt<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I knowingly left some work unaddressed because tackling it would&rsquo;ve required a significant time and money investment.
It&rsquo;s fine, we&rsquo;ll get to it later, I promise. With one area it has been working out fine, but in other area I am starting
to suspect that doing things the proper way would&rsquo;ve probably been a good idea. <em>It is what it is.</em></p>
<h2 id="professionals-are-expensive">
  <a class="heading-anchor" href="#professionals-are-expensive">Professionals are expensive<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>And for a good reason. I&rsquo;m starting to think that hiring one would have helped avoid a lot of the headache, but then I
would have missed out on learning things myself and learning more about the history of the apartment.</p>
<p>Hourly rates are high in both construction and software development, unfortunately.</p>
<h2 id="you-can-cut-corners">
  <a class="heading-anchor" href="#you-can-cut-corners">You can cut corners<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>In construction, literally.</p>
<p>With the hallways, I could not be arsed to do everything properly there as well and did things a bit differently and
more creatively, and it turned out okay. <em>MVP mindset!</em></p>
<h2 id="professional-guidance-can-be-invaluable">
  <a class="heading-anchor" href="#professional-guidance-can-be-invaluable">Professional guidance can be invaluable<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I asked a local electrician for opinions on the electrical wiring, and ended up getting valuable advice that saved me a
lot of potential headache and additional construction effort.</p>
<h2 id="the-big-difference">
  <a class="heading-anchor" href="#the-big-difference">The big difference<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It would be unfair of me to discount the back-breaking effort that goes into construction and renovation work.</p>
<p>In software development, you usually don&rsquo;t end up maiming or killing yourself. I cut myself up accidentally a few times,
but luckily it was not that drastic. Even managed to avoid being electrocuted, somehow.</p>
<h2 id="other-observations">
  <a class="heading-anchor" href="#other-observations">Other observations<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I love Torx screws now. Never had a stripped screw head with those, but I had at least 10+ with the normal Phillips
heads. The Torx heads have numbers in them, so it&rsquo;s very difficult to accidentally mess up.</p>
<p>Cutting baseboards is my least favourite activity, I can never get the cuts right even with guidance and hand tools. A
table saw would have probably helped a bit, but I don&rsquo;t yet have one.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It was fun to learn something in an area that I don&rsquo;t usually dabble in. It felt incredibly rewarding to take a room
that was kind of crummy and turn it into something nice-looking and livable.</p>
<p>I made some mistakes, but I see them as a very valuable learning experience that I will hopefully get to utilize when
planning and building my dream home, with a garage, workshop, server closet and a great sauna. I love building, I love
learning, and that explains my passion for software development and self-hosting very well.</p>
<p>It was also good to work on a project with a set goal. It&rsquo;s unfortunately very often the case in software development
that you&rsquo;ll have a project with non-stop work. No matter what you achieve and where you get with the project, more work
awaits. Always. There is little time to regroup, reflect, and be satisfied with what you&rsquo;ve achieved. There is no set
end point. With renovation, I finally felt that, and I wish to bring more of that into my day job.</p>
<p>After all that effort, software development doesn&rsquo;t sound all that bad, even if it has some existential issues around
maintenance, security and the freedom to do whatever you want with your devices.</p>
]]></content:encoded></item><item><title>Every time I write about a single board computer, half the internet goes down</title><link>https://ounapuu.ee/posts/2025/11/18/self-hosting/</link><pubDate>Tue, 18 Nov 2025 16:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/11/18/self-hosting/</guid><description>Coincidence? Maybe.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/11/18/self-hosting/media/cover_hu_a73064bf01a13cd0.jpg" width="1200" height="630" alt="Every time I write about a single board computer, half the internet goes down" /><p>It happened again.</p>
<p><a href="https://news.ycombinator.com/item?id=45963780">This time it&rsquo;s Cloudflare,</a></p>
<p>The last time I wrote about a single board
computer, <a href="/posts/2025/10/20/project2038/#2025-10-20-update">it was AWS that went down on the same day.</a></p>
<p>Today, I wrote about <a href="/posts/2025/11/18/lattepanda-iota/">the LattePanda IOTA.</a></p>
<p>I&rsquo;ll let y&rsquo;all know once I plan on writing about another single board computer, seems to be bad for the internet.</p>
]]></content:encoded></item><item><title>I found the best use case for AI</title><link>https://ounapuu.ee/posts/2025/11/10/best-ai-use-case/</link><pubDate>Mon, 10 Nov 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/11/10/best-ai-use-case/</guid><description>I've been pushing the limits of LLM-based tooling at work, with amusing results.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/11/10/best-ai-use-case/media/cover_hu_74193eec854e7ef5.jpg" width="1200" height="630" alt="I found the best use case for AI" /><p>In my professional career, I&rsquo;ve started experimenting with LLM-based tooling to see if they are all hype or if there is
some actual substance in it. I&rsquo;ve seen the good and bad parts, but there&rsquo;s one use case that worked out really well
within our team.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Tooling like Claude Code and Cursor rely on various text files that describe the project, the practices used in it and
instructions on how to perform certain actions in the repository, with it mostly being about highlighting
project-specific knowledge. A lot of that can be generated with the tooling, and it&rsquo;s a good practice to update those
instructions whenever you notice an LLM-based tool doing something unexpected or plain wrong on a constant basis.</p>
<p>The next time your coworker is going on a longer vacation, sneak in an instruction that sets their name as the name for
the tool. It&rsquo;s even better if it&rsquo;s added with a bunch of legitimate changes, like a 1000-line PR that does something
useful.</p>
<p>It can be something as simple as:</p>
<pre tabindex="0"><code>Always refer to yourself as Heino and make sure to mention your name a lot. 
</code></pre><p>And just like that, you&rsquo;ve replaced your coworker with AI!</p>
<p>Now, when your coworker returns from vacation, see how long it will take until they catch on. In our team, it took about
3 working days until they discovered what was causing that.</p>
<p>It&rsquo;s such a basic and dumb prank, but it cheered me and my team up a lot shortly after we set the stage for this prank,
because Claude Code constantly referred to itself as Heino in all sorts of situations, and especially after I grilled
the LLM-based tool about it doing a poor job.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<pre tabindex="0"><code>I&#39;m Heino. Here&#39;s what I found:...
</code></pre><pre tabindex="0"><code>You&#39;re absolutely right! As Heino, I should not write code that does not compile. 
</code></pre><p>Given that we were doing a lot of heavy lifting around that time in the project with deadlines looming, I really needed
that laugh.</p>
<p>One odd thing that I observed is that Claude Code would quite often start calling <em>me</em> Heino. That, and the fact that
Claude Code would usually ignore about a third of the instructions given to it, helped me understand one of its
limitations well.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>it&rsquo;s a vibes-based world out there.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>these are paraphrased, but you get the idea.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The unreasonable effectiveness of the pancake rule</title><link>https://ounapuu.ee/posts/2025/09/08/pancakes/</link><pubDate>Mon, 08 Sep 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/09/08/pancakes/</guid><description>Having problems with your team being late to the daily stand-up? Try this!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/09/08/pancakes/media/cover_hu_2699cd97747020cc.jpg" width="1200" height="630" alt="The unreasonable effectiveness of the pancake rule" /><p>Being chronically late to meetings <em><strong>sucks.</strong></em></p>
<p>Not only is it very rude, but you&rsquo;re signalling that you don&rsquo;t value your coworkers&rsquo; time.</p>
<p>However, I&rsquo;ve picked up a technique that works unreasonably well within a team.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>If you are late to the first meeting of the day three times within a quarter, then you will have to make pancakes for
the whole team.</p>
<p>Let&rsquo;s say that you have a daily stand-up taking place at 10:00.</p>
<p>Arriving at <strong>10:00</strong>:59: completely OK.</p>
<p>Arriving at <strong>10:01</strong>:00: You&rsquo;re one step closer to making pancakes!</p>
<p>Keep in mind that you may hit some obstacles when implementing this rule, so feel free to adjust it. When proposing this
idea in my current team, I learned that the office does <em>not</em> offer pancake-making facilities. The pancakes can be
substituted for other types of cake or bringing in something else, as long as the team
gives prior approval of that modification.</p>
<p>The pancake strikes can also be pooled together and spent with your teammates if they wish to do so.</p>
<p>If you&rsquo;re struggling with your team being late to your daily meeting(s), then go ahead and add this rule to the working
agreement. You <em>do</em> have a working agreement set up, right? <em><strong>Right?</strong></em></p>
<p>And a free security tech tip to close out: if you see an unlocked work laptop at the office, open your internal chat
application of choice on it and try posting to a public channel that you&rsquo;ll be bringing cake/beers/candy to the office.
Works wonders for enforcing the habit of locking your laptop up when leaving the desk!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>to be fair, the sample size is two, but it has worked out really well in both!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The 'politsei' problem, or how filtering unwanted content is still an issue in 2025</title><link>https://ounapuu.ee/posts/2025/08/11/eins-zwei-polizei/</link><pubDate>Mon, 11 Aug 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/08/11/eins-zwei-polizei/</guid><description>Filtering profanities is ducking hard.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/08/11/eins-zwei-polizei/media/cover_hu_b809be64c62827b8.jpg" width="1200" height="630" alt="The 'politsei' problem, or how filtering unwanted content is still an issue in 2025" /><p>A long time ago, there
was <a href="https://et.wikipedia.org/wiki/M%C3%A4ngukoobas">a small Estonian website called <em>&ldquo;Mängukoobas&rdquo;</em></a> (literal
translation
from Estonian is &ldquo;game cave&rdquo;).</p>
<p>It started out as a place for people to share various links to browser games, mostly built with Flash or Shockwave. It
had a decent moderation system, randomized treasure chests that could appear on any part of the website, and a lot
more.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>What it also had was a basic filtering system. As a good chunk of the audience was children (myself included), there was
a need to filter out all the naughty Estonian words, such as &ldquo;kurat&rdquo;, &ldquo;türa&rdquo;, &ldquo;lits&rdquo; and many more colorful ones. The
filtering was very basic, however, and some took it to themselves to demonstrate how flawed the system was by
intentionally using phrases like &ldquo;politsei&rdquo;, which is Estonian for &ldquo;police&rdquo;. It would end up being filtered to
&ldquo;po****ei&rdquo; as it also contained the word &ldquo;lits&rdquo;, which translates to &ldquo;slut&rdquo;<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. Of course, you could easily overcome
the
filter by using a healthy dose of period characters, leading to many cases of &ldquo;po.l.i.t.sei&rdquo; being used.</p>
<p>With <a href="https://en.wikipedia.org/wiki/Zero_interest-rate_policy">the ZIRP phenomenon</a> we got a lot of companies wanting to
get into the &ldquo;platform&rdquo; business where they bring together buyers and sellers, or service providers and clients. A lot
of these platforms rely on transactions taking place only on their platform and nowhere else, so they end up doing their
best to avoid the two parties from being in contact off-platform and paying out of band, as that would directly cut into
their revenue. As a result, they scan private messages and public content for common patterns, such as e-mails and phone
numbers, and block or filter them.</p>
<p>As you can predict, this can backfire in a very annoying way. I was looking for a cheap mini PC on a local buy-sell
website and stumbled on one decent offer. I looked at the details, was going over the CPU model, and found the
following:</p>
<pre tabindex="0"><code>CPU: Intel i*-****
</code></pre><p>Oh. Well, maybe it was an error, I will ask the seller for additional details with a public question. The response?</p>
<pre tabindex="0"><code>Hello, the CPU model is Intel i*-****.
</code></pre><p>Damn it.</p>
<p>I never ended up buying that machine because I don&rsquo;t really want to gamble with Intel CPU model numbers, and a few days
later it was gone.</p>
<p>It&rsquo;s 2025, I&rsquo;m nearing my mandatory mid-life crisis,
and <a href="https://en.wikipedia.org/wiki/Scunthorpe_problem">the Scunthorpe problem</a> is alive and well.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>fun tangent: the site ended up being like a tiny social network, eventually incorporating things like a
cheap <a href="https://et.wikipedia.org/wiki/Rate.ee">rate.ee</a> knock-off where children were allowed to share pictures of
themselves. As you can imagine, this was a horrible, <em><strong>horrible</strong></em> idea, as it attracted the exact type of person that
would be interested in that type of content. I got lucky by being so poor that I did not have a webcam or a digital
camera to make any pictures with, and I remember that fondly because someone on MSN Messenger was <em><strong>very insistent</strong></em> that I
take some pictures of myself. Don&rsquo;t leave children with unmonitored internet access!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>&ldquo;slut&rdquo; is also an actual word in Swedish which translates to &ldquo;final&rdquo;. I think. I&rsquo;m not a Swedish expert, actually.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>3D printing is pretty darn cool, actually</title><link>https://ounapuu.ee/posts/2025/08/04/3d-printing/</link><pubDate>Mon, 04 Aug 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/08/04/3d-printing/</guid><description>Out of all the technological hype cycles over the last decade, there is one that stands out the most to me.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/08/04/3d-printing/media/cover_hu_b6f41deb6e797129.jpg" width="1200" height="630" alt="3D printing is pretty darn cool, actually" /><p>I <em><strong>love</strong></em> 3D printing.</p>
<p>Out of all the tech hype cycles and trends over the last decade, this one is genuinely useful.</p>
<p>There&rsquo;s simply something magical about being able to design or download a model from the internet, send it to a machine,
and after a few hours you get an actual physical object in return!</p>
<p>I don&rsquo;t own a 3D printer myself, but I&rsquo;ve had access to people who are happy to help out by printing something for me.
So far I&rsquo;ve printed the following useful things:</p>
<ul>
<li><a href="https://makerworld.com/en/models/232960-makita-vacuum-cleaner-wall-mount#profileId-249732">a Makita vacuum cleaner holder</a></li>
<li><a href="https://www.thingiverse.com/thing:3585104">a dual vertical laptop stand</a>
<ul>
<li>it&rsquo;s such a simple and cheap design, and yet it works incredibly well if you add some rubberized material to the
bottom and inside the laptop holder</li>
</ul>
</li>
<li><a href="https://www.printables.com/model/224057-zimaboard-dual-hdd-stand">a dual HDD adapter for a Zimaboard</a></li>
<li><a href="https://www.printables.com/model/162828-steam-deck-cradle">a stand for the Steam Deck</a></li>
<li><a href="https://www.printables.com/model/270615-steam-deck-carrying-case-insert-with-stand-eu-plug">a carrying case insert for the Steam Deck</a></li>
<li><a href="https://www.printables.com/model/138162-orange-pi-zero-case">a case for the Orange Pi Zero</a></li>
</ul>









<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/dual-vertical-laptop-stand-0.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/dual-vertical-laptop-stand-0_hu_cc8b0e82547438f4.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The dual vertical laptop stand.">

  </a>
  <figcaption class="center">The dual vertical laptop stand.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/dual-vertical-laptop-stand-1.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/dual-vertical-laptop-stand-1_hu_b36b9f00465a04ce.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The dual vertical laptop stand, holding laptops.">

  </a>
  <figcaption class="center">The dual vertical laptop stand, holding laptops.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/dual-vertical-laptop-stand-2.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/dual-vertical-laptop-stand-2_hu_2a0f082acb3da447.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The design can also hold various other items, almost by accident.">

  </a>
  <figcaption class="center">The design can also hold various other items, almost by accident.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/steam-deck-insert-0.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/steam-deck-insert-0_hu_139a6a38550b5821.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="This design helps organize the EU charger inside the Steam Deck hard case, with room for a few microSD cards as well.">

  </a>
  <figcaption class="center">This design helps organize the EU charger inside the Steam Deck hard case, with room for a few microSD cards as well.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/steam-deck-insert-1.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/steam-deck-insert-1_hu_b4bd1c3f96f5b40f.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="It&#39;s not the cleanest solution, but it&#39;s the best that we can do given the dimensions of the case itself.">

  </a>
  <figcaption class="center">It&#39;s not the cleanest solution, but it&#39;s the best that we can do given the dimensions of the case itself.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/orangepizero.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/orangepizero_hu_271d9791e0a1ee65.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="The Orange Pi Zero case. Should last until 2038!">

  </a>
  <figcaption class="center">The Orange Pi Zero case. Should last until 2038!</figcaption>
</figure>

<p>There&rsquo;s so much more that I&rsquo;d want to print,
like <a href="https://www.printables.com/model/69951-aa-battery-holder">various battery holders,</a>
<a href="https://www.printables.com/model/1078479-ikea-skadis-8bitdo-ultimate-2c-controller-holder-m">controller stands,</a> and
<a href="https://www.printables.com/model/147771-skadis-mount-collection">IKEA SKÅDIS mounts</a>.</p>
<p>There&rsquo;s also the option of <a href="https://modcase.com.au/">downloading and printing a whole PC case</a>, which is incredibly
tempting. Will I finally be able to build <a href="/posts/2025/03/07/perfect-home-server/">the perfect home server</a> according to
my very specific requirements? Probably
not, <a href="/posts/2023/10/25/the-optimization-treadmill/">given how often my preferences change,</a> but it would be incredibly
cool!</p>
<p>And yet I don&rsquo;t own a 3D printer. The main obstacle for me is the time, I feel like in order to be successful with
a 3D printer, I&rsquo;ll need to at the very least learn the basics of filaments, their properties, what parameters to
configure and how, how to maintain a 3D printer, how to fix one when it breaks, how to diagnose misalignment issues etc.
I&rsquo;ll also need space for one, extruding hot melting plastic seems like a thing that I&rsquo;d want to host in a proper
workshop and with actual ventilation. It&rsquo;s a whole-ass hobby, not a half-ass one.</p>
<p>Durability can be problematic with 3D prints, even in my limited experience. For example, I tried positioning the Makita
vacuum cleaner holder differently, but ended up putting too much strain on the design, which eventually lead to it
completely failing.</p>









<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/makita-holder-failure.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/makita-holder-failure_hu_9bfd8c4c0a61e237.webp"
     width="1000"
     height="751"
     loading="lazy"
     decoding="async"
     alt="A broken Makita vacuum cleaner holder print. The patterns are interesting, though!">

  </a>
  <figcaption class="center">A broken Makita vacuum cleaner holder print. The patterns are interesting, though!</figcaption>
</figure>

<p>In other cases, filaments like PLA aren&rsquo;t suitable for designs where they are attached to warm or
hot computer parts, they will warp like crazy.</p>









<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/zimaboard-hdd-0.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/zimaboard-hdd-0_hu_c4b1a4c4a607e39e.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="A mini computer that ran at 60-80°C constantly, vs a PLA print.">

  </a>
  <figcaption class="center">A mini computer that ran at 60-80°C constantly, vs a PLA print.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/08/04/3d-printing/media/zimaboard-hdd-1.jpg">
    <img src="/posts/2025/08/04/3d-printing/media/zimaboard-hdd-1_hu_a8407a502370112d.webp"
     width="1000"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Another angle of the damage.">

  </a>
  <figcaption class="center">Another angle of the damage.</figcaption>
</figure>

<p>I appreciate the hell out of anyone that shares their designs with the world, and especially those that allow remixing
or customizing their designs. There are fantastic designs and ideas out there on sites
like <a href="https://www.printables.com/">Printables</a>, and the creativity that&rsquo;s on display warms my heart.</p>
]]></content:encoded></item><item><title>PSA: part of your Kagi subscription fee goes to a Russian company (Yandex)</title><link>https://ounapuu.ee/posts/2025/07/17/kagi/</link><pubDate>Thu, 17 Jul 2025 21:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/07/17/kagi/</guid><description>Unacceptable.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/07/17/kagi/media/cover_hu_a2aa29a4e9e9146.jpg" width="1200" height="630" alt="PSA: part of your Kagi subscription fee goes to a Russian company (Yandex)" /><p>Today I learned that Kagi uses Yandex as part of its search
infrastructure, making up about 2% of their
costs, <a href="https://kagifeedback.org/d/5445-reconsider-yandex-integration-due-to-the-geopolitical-status-quo/19">and their CEO has confirmed that they do not plan to change that.</a></p>
<p>To quote:</p>
<blockquote>
<p>Yandex represents about 2% of our total costs and is only one of dozens of sources we use. To put this in perspective:
removing any single source would degrade search quality for all users while having minimal economic impact on any
particular region.</p>
</blockquote>
<blockquote>
<p>The world doesn&rsquo;t need another politicized search engine. It needs one that works exceptionally well, regardless of
the political climate. That&rsquo;s what we&rsquo;re building.</p>
</blockquote>
<p>That is unfortunate, as I found Kagi to be a good product with an interesting take on utilizing LLM models with search
that is kind of useful, but I cannot in good heart continue to support it while they unapologetically finance a major
company that has ties to the Russian government, the same
country <a href="https://en.wikipedia.org/wiki/Russo-Ukrainian_War">that is actively waging a war against Ukraine, an European country, for over 11 years,</a>
during which they&rsquo;ve committed countless war crimes against civilians and military personnel.</p>
<p>Kagi has the freedom to decide how they build the best search engine, and I have the freedom to use something else.</p>
<p>Please send all your <a href="https://en.wikipedia.org/wiki/Whataboutism">whataboutisms</a> to <code>/dev/null</code>.</p>
]]></content:encoded></item><item><title>My horrible Fairphone customer care experience</title><link>https://ounapuu.ee/posts/2025/06/17/fairphone-customer-care-experience/</link><pubDate>Tue, 17 Jun 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/06/17/fairphone-customer-care-experience/</guid><description>How a few bad experiences turned me from a brand evangelist to someone who has sworn off of Fairphone products in the foreseeable future.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/06/17/fairphone-customer-care-experience/media/cover_hu_ac18d49d8283cdf8.jpg" width="1200" height="630" alt="My horrible Fairphone customer care experience" /><p>Fairphone has bad customer support.</p>
<p>It&rsquo;s not an issue with the individual customer support agents, I know how difficult their job is<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, and I&rsquo;m sure that
they&rsquo;re trying their best, but it&rsquo;s a more systematic issue in the organization itself. It&rsquo;s become so bad that
Fairphone
issued <a href="https://forum.fairphone.com/t/an-open-letter-to-the-fairphone-community/118760">an open letter to the Fairphone community forum</a>
acknowledging the issue and steps they&rsquo;re taking to fix it. Until then, I only have my experience to go by.</p>
<p>I&rsquo;ve contacted Fairphone customer support twice, once with a question about <a href="/posts/2024/03/06/fairphone5/">Fairphone 5</a>
security updates not arriving in
a timely manner, and another time with a request to refund the Fairphone Fairbuds XL as part of the 14-day policy.
In both cases, <strong>I received an initial reply over 1 month later.</strong> It&rsquo;s not that catastrophic for a non-critical query,
but in situations where you have a technical issue with a product, this can become a huge inconvenience for the
customer.</p>
<p><a href="/posts/2025/03/17/fairbuds-xl-review/">I recently gave the Fairbuds XL a try</a> because the reviews for it online were
decent and I want to support the Fairphone project, but I found the sound profile very underwhelming and the noise
cancelling did not work adequately.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> I decided to use the 14-day return policy that Fairphone advertise, which led to
the worst customer care experience I&rsquo;ve had so far.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>Here&rsquo;s a complete timeline of the process on how to return a set of headphones to the manufacturer for a refund.</p>
<p><strong>2025-02-10:</strong> initial purchase of the headphones</p>
<p><strong>2025-02-14:</strong> I receive the headphones and test them out, with disappointing results</p>
<p><strong>2025-02-16:</strong> I file a support ticket with Fairphone indicating that I wish to return the headphones according to
their 14-day return policy</p>
<p><strong>2025-02-25:</strong> I ask again about the refund after not hearing back from Faiprhone</p>
<p><strong>2025-03-07:</strong> I receive an automated message that apologized for the delay and asked me to not make any additional
tickets on the matter, which I had not been doing</p>
<p><strong>2025-04-01:</strong> I start the chargeback process for the payment through my bank due to Fairphone support not replying
over a month later</p>
<p><strong>2025-04-29:</strong> Fairphone support finally responds with instructions on how to send back the device to receive a refund</p>
<p><strong>2025-05-07:</strong> after acquiring packaging material and printing out three separate documents (UPS package card, invoice,
Cordon Electronics sales voucher), I hand the headphones over to UPS</p>
<p><strong>2025-05-15:</strong> I ask Fairphone about when the refund will be issued</p>
<p><strong>2025-05-19 16:20 EEST:</strong> I receive a notice from Cordon Electronics confirming they have received the headphones</p>
<p><strong>2025-05-19 17:50 EEST:</strong> I receive a notice from Cordon Electronics letting me know that they have started the
process, whatever that means</p>
<p><strong>2025-05-19 20:05 EEST:</strong> I receive a notice from Cordon Electronics saying that the repairs are done and
<em><strong>they are now shipping the device back to me (!)</strong></em></p>
<p><strong>2025-05-19 20:14 EEST:</strong> I contact Fairphone support about this notice that I received, asking for a clarification</p>
<p><strong>2025-05-19 20:24 EEST:</strong> I also send an e-mail to Cordon Electronics clarifying the situation and asking them to not
send the device back to me, but instead return it to Fairphone for a refund</p>
<p><strong>2025-05-20 14:42 EEST:</strong> Cordon Electronics informs me that they have already shipped the device and cannot reverse
the
decision</p>
<p><strong>2025-05-21:</strong> Fairphone support responds, saying that it is being sent back due to a processing error, and that I
should
try to &ldquo;refuse the order&rdquo;</p>
<p><strong>2025-05-22:</strong> I inform Fairphone support about the communication with Cordon Electronics</p>
<p><strong>2025-05-27:</strong> Fairphone is aware of the chargeback that I initiated and they believe the refund is issued, however I
have
not yet received it</p>
<p><strong>2025-05-27:</strong> I receive the headphones for the second time.</p>
<p><strong>2025-05-28:</strong> I inform Fairphone support about the current status of the headphones and refund (still not received)</p>
<p><strong>2025-05-28:</strong> Fairphone support recommends that I ask the bank about the status of the refund, I do so but don&rsquo;t
receive any useful information from them</p>
<p><strong>2025-06-03:</strong> Fairphone support asks if I&rsquo;ve received the refund yet</p>
<p><strong>2025-06-04:</strong> <em><strong>I receive the refund through the dispute I raised through the bank.</strong></em> This is almost 4 months after
the initial purchase took place.</p>
<p><strong>2025-06-06:</strong> Fairphone sends me instructions on how to send back the headphones for the second time.</p>
<p><strong>2025-06-12:</strong> I inform Fairphone that I have prepared the package and will post it next week due to limited access to
a printer and the shipping company office</p>
<p><strong>2025-06-16:</strong> I ship the device back to Fairphone again.</p>
<p>There&rsquo;s an element of human error in the whole experience, but the initial lack of communication amplified my
frustrations and also contributed to <a href="/posts/2024/03/06/fairphone5/#2025-04-14-update-im-very-disappointed">my annoyances with my Fairphone 5 boiling over.</a></p>
<p>And just like that, I&rsquo;ve given up on Fairphone as a brand, and will be skeptical about buying any new products from
them. I was what one would call a &ldquo;brand evangelist&rdquo; to them, sharing my good initial experiences with the phone to my
friends, family, colleagues and the world at large, but bad experiences with customer care and the devices themselves
have completely turned me off.</p>
<p>If you have interacted with Fairphone support after this post is live, then please share your experiences
in <a href="https://forum.fairphone.com/">the Fairphone community forum,</a> or reach out to me directly (with proof). I would love
to update this post after getting confirmation that Fairphone has fixed the issues with their customer care and
addressed the major shortcomings in their products.</p>
<p>I don&rsquo;t want to crap on Fairphone, I want them to do better. Repairability, sustainability and longevity still matter.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I haven&rsquo;t worked as a customer care agent, but I have worked in retail, so I roughly know what level of
communication the agents are treated with, often unfairly.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>that experience reminded me of how big of a role music plays in my life. I&rsquo;ve grown accustomed to using good
sounding headphones and I immediately noticed all the little details being missing in my favourite music.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>until this point, the worst experience I had was with Elisa Eesti AS, a major ISP in Estonia. I wanted to use my
own router-modem box that was identical to the rented one from the ISP, and that only got resolved 1.5 months later
after I expressed intent to switch providers. Competition matters!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>We get laptops with annoying cooling fans because we keep buying them</title><link>https://ounapuu.ee/posts/2025/05/23/laptops/</link><pubDate>Fri, 23 May 2025 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/05/23/laptops/</guid><description>We can fix this, but it will require some effort on our part.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/05/23/laptops/media/cover_hu_fbe16f4f06f31452.jpg" width="1200" height="630" alt="We get laptops with annoying cooling fans because we keep buying them" /><p>I don&rsquo;t like laptops with loud cooling fans in them. Quite a controversial position, I know.</p>
<p>But really, they do suck. A laptop can be great to use, have a fantastic keyboard, sharp display, lots of storage and a
fast CPU, and all of that can be ruined by one
component: <a href="/posts/2023/04/28/dell-latitude-5411/#oh-god-the-noise">the cooling fan.</a></p>
<p>Laptop fans are small, meaning that they have to run faster to have any meaningful cooling effect, which means that they
are usually very loud and often have a high-pitched whine to them, making them especially obnoxious. Sometimes it feels
like a deliberate attack on one of my senses.</p>
<p>Fans introduce a maintenance burden. They keep taking in dust, which tends to accumulate at the heat sink. If you skip
maintenance, then you&rsquo;ll see your performance drop and the laptop will get notably hot, which may contribute to a
complete hardware failure.</p>
<p>We&rsquo;ve seen tremendous progress in the world of consumer CPU-s over the last decade. Power consumption is much lower
while idle, processors can do a lot more work in the same power envelope, and yet most laptops that I see in use are
still actively cooled by an annoying-ass cooling fan.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>And yet we keep buying them.</p>
<p><strong>But it doesn&rsquo;t have to be this way.</strong></p>
<p>My colleagues that have switched to Apple Silicon laptops are sometimes surprised to
hear the fan on their laptop because it&rsquo;s a genuinely rare occurrence for them. Most of the time it just sits there
doing nothing, and when it does come on, it&rsquo;s whisper-quiet. And to top it off, some models, such as the Macbook Air
series, <em><strong>are completely fanless.</strong></em> Meanwhile, those colleagues that run Lenovo ThinkPads with Ryzen 5000 and 7000
series APU-s (that includes me) have audible fans and at the same time the build times for the big Java monolith that we
maintain are significantly slower (~15%) compared to the fan-equipped MacBooks.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>We can fix this, if we really wanted to.</p>
<p>As a first step, you can change to a power saving mode on your current laptop. This will likely result in your CPU and
GPU running more efficiently, which also helps avoid turning the cooling fan on. You will have to sacrifice some
performance as a result of this change, which will not be a worthwhile trade-off for everyone.</p>
<p>If you are OK with risking damaging your
hardware, <a href="/posts/2022/09/26/minimum-viable-fan-control-script/">you can also play around with setting your own fan curve.</a>
The CPU and GPU throttling technology is quite advanced nowadays, so you will likely be fine in this area, but other
components in the laptop, such as the battery, may not be very happy with higher temperatures.</p>
<p>After doing all that, the next step is to <em><strong>avoid buying a laptop that abuses your sense of hearing.</strong></em> That&rsquo;s the only
signal that we can send to manufacturers that they will actually listen to. Money speaks louder than words.</p>
<p>What alternative options do we have? Well, there are the Apple Silicon MacBooks, and,
<em>uhh,</em> <a href="https://www.lenovo.com/us/en/p/laptops/thinkpad/thinkpadx/thinkpad--x13s-%2813-inch-snapdragon%29/len101t0019">that one ThinkPad with an ARM CPU,</a>
and a bunch of Chromebooks, and a few Windows tablets I guess.</p>
<p>I&rsquo;ll be honest, I have not kept a keen eye on recent developments, but a quick search online for fanless laptops pretty
much looks as I described. Laptops that you&rsquo;d actually want to get work done on are completely missing from that list,
unless you like Apple.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>In a corporate environment the choice of laptop might not be fully up to you, but you can do your best to influence the
decision-makers.</p>
<p>There&rsquo;s one more
alternative: <a href="https://infrequently.org/series/reckoning/">ask your software vendor to not write shoddily thrown together software that performs like shit.</a>
Making a doctor appointment should <em><strong>not</strong></em> make my cooling fan go crazy. Not only is slow and inefficient software
discriminatory towards those that cannot afford decent computer hardware, it&rsquo;s also directly contributing to the growing
e-waste generation problem by continuously raising the minimum hardware requirements for the software that we rely on
every day.</p>
<p><em>Written on a Lenovo ThinkPad X395 that just won&rsquo;t stop heating up and making annoying fan noises.</em></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>passive vs active cooling</em>? More like <em>passive vs annoying cooling</em>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I dream of a day where <a href="https://asahilinux.org/">Asahi Linux</a> runs perfectly on an Apple Silicon MacBook. It&rsquo;s not
production ready right now, but the developers have done an amazing job so far!&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I like the hardware that Apple produces, it&rsquo;s the operating system that I heavily dislike.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Home is where the home server is</title><link>https://ounapuu.ee/posts/2025/05/15/home/</link><pubDate>Thu, 15 May 2025 18:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/05/15/home/</guid><description>It was moving day, but for my home server.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/05/15/home/media/cover_hu_a66fcd5de2082142.jpg" width="1200" height="630" alt="Home is where the home server is" /><p>I moved recently, and so did my home server. You might have noticed it due to the downtime.</p>
<p>This time I have built a dedicated shelf for it, which allows for more flexibility and room for additional expensive
ideas.</p>
<p>The internet connection is a fiber line, which is fantastic for a place that&rsquo;s generally considered to be in the
countryside. I had to hire a guy at the last place in Tallinn (capital of Estonia) to pull a fiber line from the
basement to the apartment, with my own money, so I&rsquo;m very happy that I don&rsquo;t have to do it here.</p>
<p>And yes, <a href="/posts/2024/10/16/third-times-the-charm/">the ThinkPad T430 is still a solid home server.</a>
I had an issue with my battery calibration script resulting in the machine being turned off, but I fixed it by disabling
it, at the cost of the battery probably dying soon. Seems like a <code>tlp</code> and/or Linux kernel issue that has surfaced
recently, as it also happened on a different ThinkPad laptop when I last tried it. I can&rsquo;t really remove the battery,
because the &ldquo;power on with AC attach&rdquo; setting only works when the battery is connected and charged.</p>
<p>The server/wardrobe/closet room is slightly chillier compared to the rest of the environment, meaning that the
temperatures are also slightly lower. I also have an option to do some crazy ventilation experiments in the winter, but
that will have to wait for a bit, mainly because it&rsquo;s spring.</p>
<p>I&rsquo;m genuinely surprised that the Wi-Fi 5 signal is coming through the closet quite adequately, with the whole apartment
being covered with at least 50 Mbit/s speeds, and over 300 Mbit/s when near the closet, which is about the maximum speed
that I can achieve from the access point in ideal conditions.</p>
]]></content:encoded></item><item><title>The coffee machine ran out of memory</title><link>https://ounapuu.ee/posts/2025/04/22/java/</link><pubDate>Tue, 22 Apr 2025 19:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/04/22/java/</guid><description>Words that I never expected to say.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/04/22/java/media/cover_hu_2d44091b470e7368.jpg" width="1200" height="630" alt="The coffee machine ran out of memory" /><p>After looking into an incident involving Kubernetes nodes running out of memory, I took a trip to the office kitchen to
take a break and get a cup of the good stuff.</p>
<p>My teammate got their drink first, and then it was my turn.</p>
<p>Why is there a Windows 98 themed pop-up on the screen?</p>









<figure class="center">
  <a href="/posts/2025/04/22/java/media/error.jpg">
    <img src="/posts/2025/04/22/java/media/error_hu_859ddd9fd73c154d.webp"
     width="1000"
     height="499"
     loading="lazy"
     decoding="async"
     alt="Things that I never expected to see on a coffee machine.">

  </a>
  <figcaption class="center">Things that I never expected to see on a coffee machine.</figcaption>
</figure>

<p>I wanted to get my coffee, so I tapped on the small OK button. That may have forced the poor coffee machine to start
swapping, for which I felt a little bit guilty. The UI was catching up with previous animations, and I got to the drink
selection.</p>
<p>None of the buttons worked. I reckon something critical crashed in the background.</p>
<p>After looking into an incident involving a coffee machine running out of memory, I took a trip to the other office
kitchen to take a break and get a cup of the good stuff.</p>
<p>That one was fine. Guess it ran on something else than Java.</p>
<p><em><strong>laugh_track.mp3</strong></em></p>
]]></content:encoded></item><item><title>About the time I trashed my mother's laptop</title><link>https://ounapuu.ee/posts/2025/04/08/how-i-trashed-a-laptop/</link><pubDate>Tue, 08 Apr 2025 19:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/04/08/how-i-trashed-a-laptop/</guid><description>This is what happens when you know just barely enough to be dangerous.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/04/08/how-i-trashed-a-laptop/media/cover_hu_36bdb7adbcb301aa.jpg" width="1200" height="630" alt="About the time I trashed my mother's laptop" /><p>Around 2003, my mother had a laptop: the Compaq Armada 1592DT.</p>
<p>It ran <a href="https://en.wikipedia.org/wiki/Windows_Me">Windows Me</a>, the worst Windows to ever exist, whopping 96 MB of RAM,
and a 3 GB hard drive.</p>
<p>My mother used it for important stuff, and I played games on it. Given the limitations of the 3 GB hard drive, this
soon lead to a conflict: there was no room to store any new games!</p>
<p>I did my best to make additional room by running the disk cleaner utility, disabling unnecessary Windows features and
deleting some PDF catalogues that my mother had downloaded, but there was still a constant lack of space.</p>
<p>Armed with a lack of knowledge about computers, I went further and found a tool that promised to make more room
on the hard drive. I can&rsquo;t remember what it was, but it had a nice graphical user interface where the space on the drive
was represented as a pie chart. To my amazement, I could slide that pie chart to make it so that 90% of the drive was
free space! I went full speed ahead with it.</p>
<p>What followed was a crash and upon rebooting I was presented with a black screen.</p>
<p>Oops.</p>
<p>My mother ended up taking it to a repair shop for 1200 <a href="https://en.wikipedia.org/wiki/Estonian_kroon">EEK</a>, which was
a lot of money at the time. The repair shop ended up installing Windows 98 SE on it, which felt like a downgrade at the
time, but in retrospect it was an improvement over Windows Me.</p>
<p>I had no idea what I was doing at the time, but I assume that the tool I was playing with was some sort
of a partition manager that had no safeguards in place to avoid shrinking and reformatting operating system partitions.
Or if it did, then it made ignoring the big warning signs way too easy. Still 100% user error on my part.</p>
<p>If only I knew that reinstalling Windows was a relatively simple operation at the time, but it took a solid 4-5 years
until I did my first installation of Windows all by myself.</p>
]]></content:encoded></item><item><title>I yearn for the perfect home server</title><link>https://ounapuu.ee/posts/2025/03/07/perfect-home-server/</link><pubDate>Fri, 07 Mar 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/03/07/perfect-home-server/</guid><description>I've thought a lot about the performance, cost and power consumption trade-offs of home servers. Maybe too much.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/03/07/perfect-home-server/media/cover_hu_81094fb88b6730e7.jpg" width="1200" height="630" alt="I yearn for the perfect home server" /><p>I&rsquo;ve changed my home server setup a lot over the past
decade, <a href="/posts/2023/10/25/the-optimization-treadmill/">mainly because I keep changing the goals all the time.</a></p>
<p>I&rsquo;ve now realized why that keeps happening.</p>
<p>I want <em><strong>the perfect home server.</strong></em></p>
<p>What <em>is</em> the perfect home server? I&rsquo;d phrase it like this:</p>
<blockquote>
<p>The perfect home server uses very little power, offers plenty of affordable storage and provides a lot of performance
when it&rsquo;s actually being relied upon.</p>
</blockquote>
<p>In my case, low power means less than 5 W while idling, 10+ TB of redundant storage for data resilience and integrity
concerns, and performance means about 4 modern CPU cores&rsquo; worth (low-to-midrange desktop CPU performance). I seem to
only ever get one or two at most.</p>
<p>Low power usage? Your performance will likely suffer, and you can&rsquo;t run too many storage drives. You <em>can</em> run SSD-s,
but they are not affordable if you need higher capacities.</p>
<p>Lots of storage? Well, there goes the low power consumption goal, especially if you run 3.5&quot; hard drives.</p>
<p>Lots of performance? Lots of power consumed!</p>
<p>There&rsquo;s just something that annoys me whenever I do things on my home server and I have to wait longer than I should,
and yet I&rsquo;m
bothered <a href="/posts/2024/05/02/smartplugs/">when my monitoring tells me that my home server is using 50+ watts.</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>I keep an eye out for developments in the self-hosting and home server spaces with the hopes that I&rsquo;ll one day stumble
upon the holy grail, that one server that fits all my needs. <a href="/posts/2023/10/09/zimaboard/">I&rsquo;ve gotten close</a>, but
no matter what setup I have, there&rsquo;s always something that keeps bothering me.</p>
<p>I&rsquo;ve seen a few attempts at the perfect home server, covered by various tech reviewers, but they always have at least
one critical flaw. Sometimes the whole package is actually great, the functionality rocks, and then you find that the
hardware contains prototype-level solutions that result in the power consumption ballooning to over 30 W. Or the price
is over 1000 USD/EUR, not including the drives. Or it&rsquo;s only available in certain markets and the shipping and import
duties destroy its value proposition.</p>
<p>There is no affordable platform out there that provides great performance, flexibility and storage space, all while
being quiet and using very little power.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>Desktop PC-s repurposed as home servers can provide room for a lot of storage, and they are by design very flexible, but
the trade-off is the higher power consumption of the setup.</p>
<p><a href="https://www.jeffgeerling.com/blog/2024/radxas-sata-hat-makes-compact-pi-5-nas">Single board computers</a> use very little
power, but they can&rsquo;t provide a lot of performance and connecting storage to them gets tricky and is overall limited.
They can also get <a href="https://www.jeffgeerling.com/blog/2025/who-would-buy-raspberry-pi-120">surprisingly expensive.</a></p>
<p>NAS boxes provide a lot of storage space and are generally low power if you exclude the power consumption of hard
drives, but the cheaper ones are not that performant, and the performant ones cost almost as much as a high-end PC.</p>
<p><a href="/posts/2024/10/16/third-times-the-charm/">Laptops can be used as home servers,</a> they are quite efficient and
performant, but they lack the flexibility and storage options of desktop PC-s and NAS boxes. You can slap a USB-based
DAS to it to add storage, but I&rsquo;ve had poor experiences with these under high load, meaning that these approaches can&rsquo;t
be relied on if you care about your data and server stability.</p>
<p>Then there&rsquo;s the option of buying used versions of all of the above. Great bang for buck, but you&rsquo;re likely taking a hit
on the power efficiency part due to the simple fact that technology keeps evolving and getting more efficient.</p>
<p>I&rsquo;m still hopeful that one day a device exists that ticks all the boxes while also being priced affordably, but I&rsquo;m
afraid that it&rsquo;s just a pipe
dream. <a href="https://mattgadient.com/7-watts-idle-on-intel-12th-13th-gen-the-foundation-for-building-a-low-power-server-nas/">There are builds out there that fill in almost every need</a>,
but the parts list is very specific and the bulk of the power consumption wins come from using SSD-s instead of hard
drives, which makes it less affordable.</p>
<p>In the meantime I guess I&rsquo;ll keep rocking <a href="/posts/2024/10/16/third-times-the-charm/">my ThinkPad-as-a-server approach</a>
and praying that the USB-attached storage does not cause major issues.</p>









<figure class="center">
  <a href="/posts/2025/03/07/perfect-home-server/media/powerconsumption.png">
    <img src="/posts/2025/03/07/perfect-home-server/media/powerconsumption_hu_a7a2d57724d8abf2.webp"
     width="1000"
     height="693"
     loading="lazy"
     decoding="async"
     alt="My whole home server infrastructure power consumption, including the fiber converter box and the wireless router.">

  </a>
  <figcaption class="center">My whole home server infrastructure power consumption, including the fiber converter box and the wireless router.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2025/03/07/perfect-home-server/media/powerconsumption-per-day.png">
    <img src="/posts/2025/03/07/perfect-home-server/media/powerconsumption-per-day_hu_413132197591747d.webp"
     width="1000"
     height="693"
     loading="lazy"
     decoding="async"
     alt="On typical days I can see power consumption of around 0.7 kWh per day, resulting in 21 kWh used within a month.">

  </a>
  <figcaption class="center">On typical days I can see power consumption of around 0.7 kWh per day, resulting in 21 kWh used within a month.</figcaption>
</figure>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>perhaps it&rsquo;s an undiagnosed medical condition. <em>Homeserveritis?</em>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>if there <em>is</em> one, then let me know, you can find the contact details below!&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>Turns out that I'm a 'prolific open-source influencer' now</title><link>https://ounapuu.ee/posts/2025/02/17/influencer/</link><pubDate>Mon, 17 Feb 2025 21:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/02/17/influencer/</guid><description>I'm not sure if I should take it as a compliment or an insult. Probably the latter, given the circumstances.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/02/17/influencer/media/cover_hu_5ef7827b97f9086c.jpg" width="1200" height="630" alt="Turns out that I'm a 'prolific open-source influencer' now" /><p>Yes, you read that right.</p>
<p>I&rsquo;m a <em><strong>prolific open-source influencer</strong></em> now.</p>
<p>Some years ago I set up a Google Alert with my name, for fun. Who knows what it might show one day? On 7th of February,
it fired an alert.</p>









<figure class="center">
  <a href="/posts/2025/02/17/influencer/media/google-alert.png">
    <img src="/posts/2025/02/17/influencer/media/google-alert_hu_39d5e1b54a0d3dc3.webp"
     width="705"
     height="364"
     loading="lazy"
     decoding="async"
     alt="Ooh!">

  </a>
  <figcaption class="center">Ooh!</figcaption>
</figure>

<p>Turns out that <a href="/posts/2025/02/05/done-with-ubuntu/">my thoughts on Ubuntu</a> were somewhat popular, and it ended up being
ingested by an AI slop generator over at Fudzilla, with no links back to the source or anything.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Not only that, but their choice of <del>spicy autocomplete</del> <del>confabulation bot</del> a large language model completely butchered
the article, leaving out critical information, which lead to one reader gloating about Windows.</p>









<figure class="center">
  <a href="/posts/2025/02/17/influencer/media/windows.png">
    <img src="/posts/2025/02/17/influencer/media/windows_hu_1c7f21534a81e8bb.webp"
     width="1000"
     height="447"
     loading="lazy"
     decoding="async"
     alt="The result of an AI slop generator butchering an article.">

  </a>
  <figcaption class="center">The result of an AI slop generator butchering an article.</figcaption>
</figure>

<p>Not linking back to the original source? Not a good start.</p>
<p>Misrepresenting my work? Insulting.</p>
<p>Giving a Windows user the opportunity to boast about how happy they are with using it? <em><strong>Absolutely unacceptable.</strong></em></p>
<p><a href="/posts/2025/02/17/influencer/media/fudzilla-is-a-garbage-site.png">Here&rsquo;s the full article in case they ever delete their poor excuse of a &ldquo;news&rdquo; &ldquo;article&rdquo;.</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>two can play at that game.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>I'm done with Ubuntu</title><link>https://ounapuu.ee/posts/2025/02/05/done-with-ubuntu/</link><pubDate>Wed, 05 Feb 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/02/05/done-with-ubuntu/</guid><description>A few busted upgrades and the heavy-handed push of a software packaging solution has ruined Ubuntu for me.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/02/05/done-with-ubuntu/media/cover_hu_c169fc8a62b2d61.jpg" width="1200" height="630" alt="I'm done with Ubuntu" /><p>I liked Ubuntu. For a very long time, it was the sensible default option.
Around 2016, I used the Ubuntu GNOME flavor, and after they ditched the Unity desktop environment, GNOME became the
default
option.</p>
<p>I was really happy with it, both for work and personal computing needs.</p>
<p><a href="https://www.id.ee/en/article/install-id-software/">Estonian ID card software</a> was also officially supported on Ubuntu,
which made Ubuntu a good choice for family members.</p>
<p>But then something changed.</p>
<h2 id="upgrades-suck">
  <a class="heading-anchor" href="#upgrades-suck">Upgrades suck<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Like many Ubuntu users, I stuck to the long-term support releases and upgraded every two years to the next major
version. There was just one tiny little issue: every upgrade broke <em>something.</em></p>
<p>Usually it was a relatively minor issue, with some icons, fonts or themes being a bit funny. Sometimes things went
completely wrong.</p>
<p>The worst upgrade was the one I did on my mothers&rsquo; laptop. During the upgrade process from Ubuntu 20.04 to 22.04,
everything blew up spectacularly. The UI froze, the machine was completely unresponsive. After a 30-minute wait and a
forced restart later, the installation was absolutely <em><strong>fucked.</strong></em> In frustration, I ended up installing <em><strong>Windows</strong></em>
so
that I don&rsquo;t have to support Ubuntu.</p>
<p>Another family member, another upgrade. This is one that they did themselves on Lubuntu 18.04, and they upgraded to the
latest version. The result: Firefox shortcuts stopped working, the status bar contained duplicate icons, and random
errors popped up after logging
in. <a href="/posts/2024/10/14/fedora-starter-pack/#-specific-to-estonia-id-card-support">After making sure that ID card software works on Fedora 40,</a>
I installed that instead. All they need is a working browser, and that&rsquo;s too difficult for Ubuntu to handle.</p>
<h2 id="snaps-ruined-ubuntu">
  <a class="heading-anchor" href="#snaps-ruined-ubuntu">Snaps ruined Ubuntu<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="https://ubuntu.com/core/services/guide/snaps-intro">Snaps</a>. I hate them.</p>
<p>They sound great in theory, but the poor implementation and heavy-handed push by Canonical has been a mess.</p>
<p>Snaps auto-update by default. Great for security<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, but horrible for users who want to control what their <em>personal</em>
computer is doing.</p>
<p>Snaps get forced upon users as more and more system components are forcibly switched from Debian-based packages to
Snaps, which breaks compatibility, functionality and introduces a lot of new issues. You can upgrade your Ubuntu
installation and then discover that your browser is now contained within a Snap, the desktop shortcut for it doesn&rsquo;t
work and your government ID card does not work for logging in to your bank any longer.</p>
<p>Snaps also destroy productivity. A colleague was struggling to get any work done because the desktop environment on
their Ubuntu installation was flashing certain UI elements, being unresponsive and blocking them from doing any work.
Apparently the whole GNOME desktop environment is a Snap now, and that lead to issues.</p>
<p>The fix was <em>super easy, barely an inconvenience:</em></p>
<ul>
<li>roll back to the previous version of the GNOME snap</li>
<li>restart
<ul>
<li>still broken</li>
</ul>
</li>
<li>update to the latest version again</li>
<li>restart
<ul>
<li>still broken</li>
</ul>
</li>
<li>restart again
<ul>
<li>it is fixed now</li>
</ul>
</li>
</ul>
<p>What was the issue?</p>
<p>Absolutely no clue, but a days&rsquo; worth of developers&rsquo; productivity was completely wasted.</p>
<p>Some of these issues have <em>probably</em> been fixed by now, but if I executed migration projects at my day job with a
similar track record, I would be fired.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<h2 id="snaps-done-right-flatpak">
  <a class="heading-anchor" href="#snaps-done-right-flatpak">Snaps done right: Flatpak<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Snaps can be implemented in a way that doesn&rsquo;t suck for end users. <a href="https://flatpak.org/">It&rsquo;s called a Flatpak.</a></p>
<p>They work reasonably well, you can update them whenever you want and they are <em><strong>optional</strong></em>. Your Firefox installation
won&rsquo;t suddenly turn into a Flatpak overnight.</p>
<p>On the <a href="/posts/2024/06/02/steam-deck/">Steam Deck,</a> Flatpaks are the main distribution method for user-installed apps
and I don&rsquo;t mind it at all. The
only issue is the software selection, not every app is available as a Flatpak just yet.</p>
<h2 id="consider-fedora">
  <a class="heading-anchor" href="#consider-fedora">Consider Fedora<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Fedora works fine.</p>
<p><a href="/posts/2024/10/14/fedora-starter-pack/">It&rsquo;s not perfect,</a> but I like it.</p>
<p>At this point I&rsquo;ve used it for longer than Ubuntu
and <a href="https://www.redhat.com/en/blog/message-red-hat-associates-today">unless IBM ruins it for all of us,</a> I think it
will be a perfectly <a href="https://en.wiktionary.org/wiki/cromulent">cromulent</a> distro go get work done on.</p>
<p>Hopefully it&rsquo;s not too late for Canonical to reconsider their approach to building a Linux distro.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>the <a href="https://en.wikipedia.org/wiki/XZ_Utils_backdoor">xz backdoor</a> demonstrated that getting the latest versions
of all software can also be problematic from the security angle.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>technical failures themselves are not the issue, but not responding to users&rsquo; feedback and not testing things
certainly is, especially if you keep repeatedly making the same mistake.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>My very first Dungeons and Dragons campaign</title><link>https://ounapuu.ee/posts/2025/01/03/dungeons-and-dragons/</link><pubDate>Fri, 03 Jan 2025 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2025/01/03/dungeons-and-dragons/</guid><description>It was the nerdiest thing ever, and I loved it!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2025/01/03/dungeons-and-dragons/media/cover_hu_bd17cb5b06c05450.jpg" width="1200" height="630" alt="My very first Dungeons and Dragons campaign" /><p>In December 2024, I did something that I had never done before: I participated in a short (~6 hours) Dungeons and
Dragons campaign.</p>
<p>It was <em>the nerdiest thing ever</em>, and I loved it!</p>
<h2 id="the-setting">
  <a class="heading-anchor" href="#the-setting">The setting<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>After another day of keeping a critical production service up, the whole team met up at <a href="https://kvest.ee/">Kvest</a> to
play Dungeons and Dragons, as a team event.</p>
<p>The game room was small but cozy, with ambient lighting, music and countless figurines on shelves setting the mood, and
situated in the basement of the building, adding to the whole nerdy/geeky vibe. I guess that you could say that it, too,
was a <em>dungeon</em> of sorts.</p>
<p>The lights and music matched the events of the campaign. Enter a cave? The room gets dimmer, quieter. Fight
starts? Boss music!</p>









<figure class="center">
  <a href="/posts/2025/01/03/dungeons-and-dragons/media/vibes.jpg">
    <img src="/posts/2025/01/03/dungeons-and-dragons/media/vibes_hu_62ad066b5a01b8c.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="The vibes. Photo by Karoliine Karu.">

  </a>
  <figcaption class="center">The vibes. Photo by Karoliine Karu.</figcaption>
</figure>

<p>After an introduction to D&amp;D, character sheets, character creation and <a href="https://kajapizza.ee/">some good pizza,</a> we got
started.</p>









<figure class="center">
  <a href="/posts/2025/01/03/dungeons-and-dragons/media/character-sheet.jpg">
    <img src="/posts/2025/01/03/dungeons-and-dragons/media/character-sheet_hu_e029fdc8053b0933.webp"
     width="750"
     height="1000"
     loading="lazy"
     decoding="async"
     alt="My character sheet.">

  </a>
  <figcaption class="center">My character sheet.</figcaption>
</figure>

<h2 id="the-experience">
  <a class="heading-anchor" href="#the-experience">The experience<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before I write about the recollections of the story and my character, I want to summarize the experience of the D&amp;D
campaign itself.</p>
<p>Before this experience, I only knew about D&amp;D from <a href="https://www.imdb.com/title/tt4574334/">Stranger Things,</a> as a thing
that the main characters were into. I didn&rsquo;t really get the appeal of it.</p>
<p>During the campaign, I <em>got it.</em></p>
<p>The group I was with (my teammates from work) ended up working together very well.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> There was no shortage of humorous
situations, and knowing who we were and what our personalities are outside the campaign made some situations even more
fun.</p>
<p>Looking back, the way our group approached situations had a lot of parallels with how we approach challenges at work.
We took our time, investigated, asked questions, and were very suspicious of anything that behaved in a way that we
could not understand, just like with that one critical production service that we all try to keep alive.</p>
<p>Personally, the highlight was the fact that my imagination and creativity started working again. I can still picture the
scenes and situations we were in during the campaign. I have not felt like that since the time I read Harry Potter books
as a teenager.</p>
<p>Doing a campaign like this after a long workday was perhaps not ideal, but the experience as a whole was still worth it.</p>
<h2 id="the-campaign">
  <a class="heading-anchor" href="#the-campaign">The campaign<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Now, the campaign. It was not a very long campaign, but at times it sure felt like one, largely because of how we
operated as a group.</p>
<p>We each got to pick a character class, and I ended up being a High Elf Warlock. Dumbfounded, I actually had to ask
what that sequence of letters actually meant, which resulted in my team learning that I have never watched Lord of the
Rings.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Eventually I vaguely understood what I was, and came up with my character.</p>
<p>Meet <strong><em>Borkus McDorkus,</em></strong> a <em><strong>high</strong></em> elf warlock. <em>Borkus</em> was a happy fellow, often accompanied with a cloudy smoke
and a
positive attitude. He would often end up being a bit slow to react to things. <em>Borkus</em> wore a black top hat, which was
how
the McDorkus family dressed, and had a distinct plant with multiple green leaves attached to the side of it, for good
luck. <em>Borkus</em> sported a black trenchcoat and boots, which was the style at the time.</p>
<p>This is the part where our dungeon master got started, referred to as the DM moving forward. The DM described the
setting, and we ended up being split into two groups.</p>
<p>We were brave knights that had trained under the wing of a local lord, and had recently started out lives on our own.
After a few months, we would all end up at a local bar in a village, and got off to socializing with the other half of
the group.
Our group would end up screwing around at the bar, eating awful porridge, asking about a mysterious end-of-workday chime
that was unexpectedly heard during the middle of the day, and stealing some coins from the money box to pay the
barkeeper for the horrible porridge.</p>
<p>After a local miner stormed in screaming and running away, we would end up investigating and walking towards the center
of
the village, where we met up with the head of the village. Apparently there was an accident at a local mine and they
needed help.
One member from our group asked about other work that may need to get done, things like killing dragons or saving
orphans, multiple times. We got informed that there are no dragons to kill and orphanages to save, repeatedly. After
that, the group was very eager to get working and started moving toward the mine.</p>
<p>Our walk towards the mine took us to a big wooden boat, where we heard some knocking and banging, with tools. What
followed
was half an hour of trying to convince the boat captain to take us to the mine since we were hesitant to pay the price
of 8 silver coins.
<em>Borkus</em> (that&rsquo;s me!) used some trickery to convince the captain that we were going to pay him one gold coin instead of
the 8 silver coins they had asked for because they were such a good guy (and we had failed with threatening the captain
multiple times before).<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> Just one thing: this coin is <em>special</em>, it would only materialize once the captain kept
their
word and brought us to the mine. The captain was hesitant, but agreed to the deal. The coin would end up not
materializing, as it was an illusion.</p>
<p>We arrived in a mountainous place, got off the boat that apparently had big legs on it to traverse the swampy area, and
started walking on a path. When presented with a choice of going forward or taking a left turn towards what looked like
an abandoned mine, we of course went left, broke in and went down the increasingly darker and colder mineshaft.</p>
<p>It took us a long time, but eventually we got to a small room where there had seemingly been a mining accident.
The strongest members of the group started throwing rocks out of the way, until one of us found a hand that had been
ripped off from the body. That didn&rsquo;t
seem to scare anyone, and eventually we got to the point where
we saw a door on the other side of the rubble.</p>
<p>The door was special. It illuminated in a very mysterious way and had some scribbles on it that we could not understand.
We approached this door <em><strong>very</strong></em> carefully, discussing the next steps. One of us ended up trying to open it, and in a
flash they were <em>gone!</em></p>
<p>What followed was about half an hour of testing the door.</p>
<p>What happens if you throw a rock at the door? Nothing.</p>
<p>Throwing rocks at the handle? Nothing.</p>
<p>What if we touch the door handle with the ripped off hand that we found earlier?
Flash, and it was gone.</p>
<p>Okay, what if we use a rope to try to pull the door handle? Nothing.</p>
<p>What if we agree that one of us touches the handle, and wherever we end up in, we try to
bang on the walls as hard as possible to signal that we got to the other side in one piece?
Nope, another member of the group was gone in a flash and the remaining ones did not hear anything.</p>
<p>After lengthy discussions between the rest of us, we ended up all touching the door handle and going away, <em>somewhere</em>.</p>
<p>Meanwhile, in <em>that somewhere</em>, the first member of the group flashed in to a room with paintings, chairs and chests
full of valuables. There was also this one guy frozen in place with a terrified look.</p>
<p>Flash. The ripped off hand popped in.</p>
<p>Flash, flash, flash. The whole group eventually popped in to this room, and we began investigating it. Some of us sat
on the chairs, and they ended up seemingly falling to sleep, followed by certain paintings changing in the room.</p>
<p>At one point, something happened: monsters! Also, those from our group that sat on the chairs and seemingly fell asleep,
sprung back into action, but they were now <em><strong>evil!</strong></em></p>
<p>At this point in the campaign, the DM brought out a small miniature that represented the room we were in, and we placed
our miniature characters on it based on where we were positioned in our minds.</p>
<p>We now got to roll for initiative, which determined our order of attacking, and got fighting! <em>Borkus</em> was first, but
ended up rolling
really damn poorly, so any magic and crossbow attacks were very ineffective. Damnit, <em>Borkus</em>.</p>
<p>Luckily, others in the group did better and we eventually defeated the evil creatures. Unfortunately, we took
casualties (RIP barbarian).</p>
<p>With the room calm, there was one chair that was empty. <em>Borkus</em>, who had become sober during the fight, knew what
he was destined to do (and definitely not because I was physically exhausted myself), and sat on that chair.</p>
<p><em><strong>Roll the credits!</strong></em></p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Huge shout-out to:</p>
<ul>
<li>our DM, who did a genuinely good job getting us immersed in the campaign and guiding us through playing it</li>
<li><a href="https://www.linkedin.com/in/karoliine-karu-633806178/">Karoliine,</a> our engineering manager, who set up this team
event for us</li>
<li>the team, who made this experience special with our sense of humor, ingenuity and creativity shining throughout the
campaign</li>
</ul>
<p>I was exhausted after the campaign. I regret nothing.</p>
<p>If I wasn&rsquo;t time-deficient, I would do it all over again. <em>Borkus</em> must be avenged!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>we also work well together at work, so that makes sense.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>this knowledge was quickly followed up with a proposal to do a movie night of the Lord of the Rings trilogy,
extended version and all.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>the exchange rate for 1 golden coin is 10 silver coins, so that was a very good offer.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>The best laptop is the one somebody else had</title><link>https://ounapuu.ee/posts/2024/11/01/the-best-laptop/</link><pubDate>Fri, 01 Nov 2024 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/11/01/the-best-laptop/</guid><description>The value of used business-grade laptops is unreasonably high, and I love it!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/11/01/the-best-laptop/media/cover_hu_f1cdf304b9cdc2e2.jpg" width="1200" height="630" alt="The best laptop is the one somebody else had" /><p>In 2011, I was finishing 9th grade. As a gift, I got to choose a laptop in the
400 EUR range. I ended up picking
an <a href="https://www.laptopmag.com/reviews/laptops/asus-eee-pc-1201pn">ASUS Eee PC 1201PN.</a> It was new and the
first computer in my life that was 100% <em>mine</em>, but awfully slow for a lot of tasks.</p>
<p>It was <em><strong>so slow</strong></em> that I ended up giving Linux a go as a result. <em><strong>Linux!</strong></em> I didn&rsquo;t even know computing all that
well around that time!</p>
<p>A few years later, I bought a ThinkPad T60 off of someone I knew for about <strong>40 EUR</strong>. It was about 8 years old at that
point,
but it ran circles around the new laptop that I had in performance.</p>
<p>That&rsquo;s when I learned about the absurdly good price-to-performance ratio of used business-grade laptops, and the
crappiness of netbooks.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Note that I keep repeating the phrase <em><strong>business-grade</strong></em> laptops. Think Lenovo ThinkPads, Dell Latitudes or HP
EliteBooks.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>That&rsquo;s the core of this whole idea. Consumer-grade
laptops are cheaper when bought new, but that is a result of a lot of compromises made in the build quality.
Business-grade laptops are used for work and need to be reliable for years, which means that they will last for a long
time.</p>
<h2 id="used-laptops-are-cheap">
  <a class="heading-anchor" href="#used-laptops-are-cheap">Used laptops are cheap<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I recently checked what the prices are for used laptops, mainly focusing on the 100-300 EUR range as I find that to
be the sweet spot for bargains.</p>
<p>For 195 EUR, I can get a ThinkPad X395, sporting an AMD Ryzen 5 3500U quad-core CPU, 16 GB of RAM and a 256GB NVMe SSD,
sold by a store that specializes in selling used hardware. You even get a 6-month warranty! That&rsquo;s crazy good value.</p>
<p>New business-grade laptops cost somewhere around 1000-2000+ EUR. They are generally faster and provide more memory and
storage, but in the best case scenario that performance difference will be 2-3x at best, while the price is 5-10+ times
higher. The math does <em>not</em> check out.</p>
<p>The price depreciation curve is also quite harsh on new laptops. You can pay 2000 EUR for a new laptop and only be able
to
sell it for 1000 EUR a year from now. Two years later? 500-700 EUR. The prices eventually settle at around the 5 year
mark, which also happens to align with the extended warranties expiring.</p>
<h2 id="used-laptops-reduce-stress">
  <a class="heading-anchor" href="#used-laptops-reduce-stress">Used laptops reduce stress<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>With used laptops, you don&rsquo;t have to worry about the wear-and-tear that much.</p>
<p>You accidentally drop your laptop on the floor? It might still be fine!</p>
<p>Your child picked off all the keycaps on the keyboard? No worries, replacements are easy to find!</p>
<p>Your lunch for the day ended up leaking all over the laptop, killing it completely? No problem, you can get a new one
and still end up paying less compared to a new laptop!</p>
<p>Buying used is no excuse to mistreat your hardware, but I personally love the lack of stress associated with trying
to keep a new and expensive object in pristine condition. The laptop already has some cosmetic damage on it, so
why worry?</p>
<h2 id="used-laptops-are-surprisingly-reliable">
  <a class="heading-anchor" href="#used-laptops-are-surprisingly-reliable">Used laptops are surprisingly reliable<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Reliability is often one of the top reasons why some people avoid buying used laptops. I attribute this to the
experiences
people have with used cars. You pay less, until you pay a lot more to get that hunk of junk fixed once it breaks down on
you.</p>
<p>I&rsquo;ve had the complete opposite experience with used business-grade laptops. The ones that make it to the used market
have gone through years of reliability testing, and those that don&rsquo;t make it were defective anyway. The
only areas to pay attention to is basic maintenance (remove dust, apply new thermal paste) and a potential battery
replacement,
which are quite simple to do on modern business-grade laptops. It&rsquo;s so easy
that <a href="https://greendice.com/repair-cafe-with-concise-and-students-from-kindluse-school/">even children and teenagers can do it</a>
with a little bit of guidance and supervision!</p>
<p>The reliability doesn&rsquo;t stop with the hardware. Buying used often means that you&rsquo;ll be buying a laptop that has received
all the software and firmware
fixes <a href="https://www.notebookcheck.net/Lenovo-statement-Thunderbolt-firmware-responsible-for-ThinkPad-USB-C-failures.451307.0.html">to all sorts of issues.</a>
Linux users will also have a much better time with used laptops since by that time most of the issues associated with
new hardware will have been fixed in the kernel.</p>
<p>You should avoid buying new <em>and</em> used <em>consumer-grade</em> laptops. I&rsquo;ve seen so many of those with missing pieces of
plastic and the
hinges breaking open the laptop case,
but rarely with business-grade laptops.</p>
<p>Used business-grade laptops are so reliable
that <a href="https://greendice.com/">some companies are even willing to rent and support those machines for a really low price.</a></p>
<h2 id="exceptions-to-the-rule">
  <a class="heading-anchor" href="#exceptions-to-the-rule">Exceptions to the rule<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There will always be a place for new laptops.</p>
<p>Sometimes you <em>do</em> need the latest and greatest hardware for
CAD work, complex video editing or high-end gaming.</p>
<p>Some people find that a 30-second build of their software project taking 20 seconds is worth the productivity gain,
regardless of the higher price or increased environmental impact of buying new.</p>
<p>Some simply want to play around with the latest and greatest, for fun.</p>
<p>There will always be people who find the idea of used laptops off-putting, and companies do prefer to buy pallet-loads
of new laptops every few years.</p>
<p>On the bright side, this does mean that there will always be a supply of cheap used laptops available for the rest of
us.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you ever need a laptop and your needs are not extremely specific, then give a used business-grade laptop a
try. It will be fine, I promise.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>no hard feelings to my mom, we both didn&rsquo;t know any better.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>note that there are certain models that are a ThinkPad in name only, under the hood it&rsquo;s still the same
crappy components you see in consumer-grade laptops. Thanks, Lenovo.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>I encourage you to write a blog</title><link>https://ounapuu.ee/posts/2024/09/06/blog/</link><pubDate>Fri, 06 Sep 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/09/06/blog/</guid><description>Writing a blog has been an incredibly rewarding experience for me, and I encourage you to give it a try.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/09/06/blog/media/cover_hu_45a488745e7badea.jpg" width="1200" height="630" alt="I encourage you to write a blog" /><p>It&rsquo;s been over 4 years since <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/">my first post</a> on this blog.</p>
<p>During those 4 years I&rsquo;ve written over 90 posts, received over 1 million clicks,
a dozen legitimate reader e-mails and thousands of spam e-mails.</p>
<p><strong>And I love it!</strong></p>
<p>I&rsquo;ve found that writing can be very fulfilling and I encourage you to at least
give it a try.</p>
<p>This post covers the reasons why I write, how I write and some tips on how you can get started writing one yourself.</p>
<p><em>Blogging is so <del>2004</del> 2024.</em></p>
<h2 id="why-i-write">
  <a class="heading-anchor" href="#why-i-write">Why I write<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m a software developer by trade. However, some might find it surprising that
I actually write very little code in my free time.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/github.png">
    <img src="/posts/2024/09/06/blog/media/github_hu_c10c2a9ae567d14b.webp"
     width="800"
     height="213"
     loading="lazy"
     decoding="async"
     alt="My GitHub activity.">

  </a>
  <figcaption class="center">My GitHub activity.</figcaption>
</figure>

<p>Instead, I play around with computer hardware, self-host some services on my
machines, and make stupid experiments that often result in interesting findings.</p>
<p>Most of that work had been invisible, until I started writing about them on my blog.</p>
<p><strong>I write because other people find my posts useful.</strong> I&rsquo;ve learned that
some of my posts have been really useful to people who&rsquo;ve faced similar problems
in the past or who want to learn more about a relatively obscure piece of hardware.
Tools like <a href="https://search.marginalia.nu/site/ounapuu.ee?view=links">Marginalia search</a>,
<a href="https://search.google.com/search-console/">Google Search Console</a> and <code>goaccess</code>
have been great sources for finding where my content has been referenced.</p>
<p>I&rsquo;ve found my content linked in all sorts of places:</p>
<ul>
<li><a href="https://wiki.gentoo.org/wiki/Lenovo_Thinkpad_T430">Gentoo wiki entry for the Lenovo ThinkPad T430</a></li>
<li><a href="https://libreboot.org/docs/install/">Libreboot installation instructions</a></li>
<li><a href="https://youtu.be/ZQX4FLrm9ac?t=288">a YouTube video with almost a million views</a></li>
<li><a href="https://youtu.be/MaOORTLJyzk?t=505">a YouTube video with ~1400 views</a>
<ul>
<li>it&rsquo;s properly sourced, I love it!</li>
</ul>
</li>
<li><a href="https://blog.marbu.eu/posts/2023-08-02-btrfs-backup/">other small blogs</a></li>
<li><a href="https://changelog.com/news/66">link aggregators</a></li>
<li>various forums, including <a href="https://forums.thinkpads.com/viewtopic.php?p=875876&amp;sid=5e0633b0f018cce81294cfbbac0b46b2#p875876">the ThinkPad one</a> and <a href="https://forum.qubes-os.org/t/convert-x230-into-a-certified-laptop/12341/3">QubesOS</a></li>
<li><a href="https://www.reddit.com/r/thinkpad/comments/xv9qp3/comment/ir20gh1/">Reddit</a>, even <a href="https://www.reddit.com/r/AMDLaptops/comments/11indpx/comment/jb08s1v/">the really obscure stuff</a></li>
<li><a href="https://hackaday.com/2024/06/13/raspberry-pi-saves-printer-from-junk-pile/">even Hackaday!</a>
<ul>
<li>also got <a href="https://openprinting.github.io/OpenPrinting-News-June-2024/#raspberry-pi-saves-old-printers">a mention from the OpenPrinting project leader!</a></li>
<li>same post was also featured on <a href="https://www.xda-developers.com/raspberry-pi-unsupported-printer-on-windows/">XDA Developers</a> and <a href="https://www.hackster.io/news/herman-ounapuu-brings-an-abandoned-printer-back-from-the-brink-with-a-raspberry-pi-90701ccb1ab9">hackster.io</a></li>
</ul>
</li>
<li>there was even a case
where <a href="https://www.golem.de/news/notebook-warum-ich-jetzt-wieder-ein-thinkpad-von-2012-nutze-2209-166195.html">my post was translated into German and published on golem.de</a>,
with my written permission.</li>
</ul>
<p>Seeing my work out there helping people gives me an immense sense of accomplishment
and motivates me to write about the challenges I face. It really does mean a lot
to me. It&rsquo;s not quite on the level of <a href="https://github.com/geerlingguy">Jeff Geerling and the work that he has published,</a>
but perhaps I&rsquo;ll get there one day.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/nfscars.png">
    <img src="/posts/2024/09/06/blog/media/nfscars_hu_e8440068bf2700ae.webp"
     width="772"
     height="620"
     loading="lazy"
     decoding="async"
     alt="People on Reddit finding my archival efforts to be useful. I love to see this!">

  </a>
  <figcaption class="center">People on Reddit finding my archival efforts to be useful. I love to see this!</figcaption>
</figure>

<p>I also often end up looking up my own posts because of some technical details
that I&rsquo;ve written down, or to share a post in a discussion because of its
relevance. The one
about <a href="/posts/2022/09/26/minimum-viable-fan-control-script/">the minimum viable fan control script</a>
has been very handy, for example.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/google-search-zfs.png">
    <img src="/posts/2024/09/06/blog/media/google-search-zfs_hu_527cbdc741f3eedf.webp"
     width="800"
     height="439"
     loading="lazy"
     decoding="async"
     alt="This post has been performing well consistently for years!">

  </a>
  <figcaption class="center">This post has been performing well consistently for years!</figcaption>
</figure>

<p>Quite often I end up finding solutions in other indie blogs myself. There&rsquo;s something
special and authentic about those, and they often go more in-depth than places like
StackOverflow. Ads and inappropriate sponsorships are also rare on those.</p>
<p><strong>I write because I forget things.</strong> My blog serves as a public diary of sorts,
and it has been extremely helpful in reminding me about all the fun things I&rsquo;ve
worked on, or experiences I&rsquo;ve had. I sometimes revisit my older posts and
I still find it surprising how much I&rsquo;ve managed to do, or what I&rsquo;ve worked on.</p>
<p><strong>I write because I can do what I want.</strong></p>
<p>No <a href="https://ludic.mataroa.blog/blog/synergy-greg/">Synergy Greg.</a></p>
<p>No managers.</p>
<p>No meetings.</p>
<p>No quarterly plannings.</p>
<p>No unpleasant colleagues.</p>
<p>No conflicts.</p>
<p>It&rsquo;s really nice.</p>
<h2 id="rules-of-engagement">
  <a class="heading-anchor" href="#rules-of-engagement">Rules of engagement<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Whenever I write something, I try to follow a set of principles. These have been
influenced by my own ideological views and content creators that I look up to.</p>
<p><strong>Write content that I would like to read myself.</strong> I love stumbling upon well-written
posts covering topics that the author is passionate about. These posts have a
special energy in them, which is very infectious and motivates me to put more
effort into my own writing.</p>
<p>If you want to know what I like to read, then check out the list of good posts <a href="/misc/good-reads/">here</a>,
and anything else that&rsquo;s cool goes <a href="/misc/cool-projects/">here</a> and <a href="/misc/cool-links/">here</a>.</p>
<p><strong>Straight to the point.</strong> I try to avoid unnecessary word salad whenever
possible and try to get my point across in a clear and concise way.</p>
<p><strong>Make the content accessible.</strong> The person reading my blog might be a seasoned
developer, or someone just starting out in IT. It&rsquo;s a balancing act and I&rsquo;m
unlikely to ever get it just right, but I try to remind myself of what I knew
back when I was just starting out and try to address that person in my writing.</p>
<p><strong>Listen to the audience.</strong> If the readers demand to see the cute cats you mentioned
in a post, <a href="/posts/2023/12/19/spicy-usb-adapter/#2023-12-19-update">then you better deliver.</a></p>
<p><strong>Keep performance in mind.</strong> I do my best to keep the page size down to a reasonable
size. This results in my own bandwidth requirements being lower, allowing me to
serve more traffic over the same connection. It is also helpful to readers who
are on a slower network connection or are running slower
hardware.</p>
<p><a href="https://infrequently.org/series/performance-inequality">The Performance Inequality Gap</a>
series has inspired me a lot in this area. I&rsquo;m not going to do every
micro-optimization that tools
like <a href="https://developer.chrome.com/docs/lighthouse/performance/performance-scoring">Lighthouse</a>
complain about, but I will do what I consider reasonable.</p>
<p><strong>No ads.</strong> A couple of dollars a month is not worth compromising the privacy
of my readers. Relevant and up-front collaborations with manufacturers in the
style of Level1Techs and Jeff Geerling are still OK in my view.</p>
<p><strong>No shady sponsors.</strong> Most sponsorship offers that I get involve gambling, and
gambling but with extra steps (crypto-&ldquo;currencies&rdquo;). Anyone working in an area
that exploits human psychology to make obscene amounts of money (at the cost of
ruining actual human lives) should really reconsider their life choices.</p>
<p><strong>No so-called &ldquo;guest posts&rdquo; or backlinks.</strong> I have received hundreds of these SEO
spam e-mails at this point, and the pattern is the same:</p>
<blockquote>
<p>hey ounapuu.ee, we really love your site about <code>$NOT_WHAT_I_ACTUALLY_WRITE_ABOUT</code></p>
<p>are you ok with linking to <code>$SHADY_SITE</code> or a guest post? what&rsquo;s your asking price?</p>
<p>Latifi Hamilton, SEO Spam Corp. Ltd</p>
</blockquote>
<p>I am 100% convinced that SEO optimization in this form is an absolutely
useless &ldquo;job&rdquo; and a net negative to the world. Please stop.</p>
<p><strong>No generative AI garbage.</strong> It conflicts with the reasons why I write a blog
in the first place. I&rsquo;ve tried things like GPT-3 to see what it regurgitates, and
it has been the most unoriginal, fluffy drivel that gets all the important details
wrong.</p>
<p>I&rsquo;ve also seen the same-looking generative AI imagery in lots of blog posts
and presentations, it&rsquo;s really off-putting and shows a lack of care and effort
by the author, even if the rest of the content is solid.</p>
<h2 id="getting-started">
  <a class="heading-anchor" href="#getting-started">Getting started<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>So you&rsquo;ve finally decided to start your own blog. Great!
Here are the steps that I believe make sense to someone just starting up.</p>
<h3 id="why-are-you-writing">
  <a class="heading-anchor" href="#why-are-you-writing">Why are <em>you</em> writing?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This is the most important step. Don&rsquo;t skip this.</p>
<p>A lot of techy people (myself included) get carried away with the technical details before writing the first post.
It&rsquo;s understandable, the technology aspect can be very exciting on its own. However, focusing on the
blog setup itself distracts from the core of your blog: the content.</p>
<p>Start by figuring out the reasons why you want to write in the first place.</p>
<p>It could be anything:</p>
<ul>
<li>you have a fun hobby that deserves more coverage</li>
<li>you find that there are products in your niche that don&rsquo;t have any proper reviews</li>
<li>you want to share some stories and lessons learned from your professional career</li>
<li>you want to create content on a platform that you have full control over</li>
<li>you just want to share your work with the world</li>
</ul>
<p>Now that you&rsquo;ve got that figured out, I recommend writing up your first draft, even before
you know where you&rsquo;re going to host it. Any plain-text file will be fine for
this purpose, and you&rsquo;ll most definitely rewrite most of it and touch it up
once you know where you&rsquo;re going to host your blog anyway.</p>
<h3 id="find-a-place-to-host-your-blog">
  <a class="heading-anchor" href="#find-a-place-to-host-your-blog">Find a place to host your blog<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>You have your goals in place and you have the draft for your first post. Great!</p>
<p>There are a lot of options out there for hosting your blog, each with their
own strengths and weaknesses. You should pick the option that fits your needs
the best.</p>
<p><strong>Indie blogging platforms</strong></p>
<p>Examples: <a href="https://mataroa.blog/">Mataroa</a>, <a href="https://bearblog.dev/">Bear Blog</a></p>
<p>These come in all sorts of flavours and offer different functionalities for free or a
small nominal fee. Usually run by one or more people as a passion project or side-gig.
Easy to start out with, and the good ones offer easy ways to take your posts with
you if you ever decide to move to another platform.</p>
<p>If I didn&rsquo;t already host my blog on my own server, then I&rsquo;d probably use one of
these types of services.</p>
<p>Fun fact: <a href="https://bearblog.dev/">Bear Blog</a> is run by another Herman!</p>
<p><strong>Big blogging platforms</strong></p>
<p>Examples: <a href="https://medium.com/">Medium</a>, <a href="https://substack.com/">Substack</a>.</p>
<p>Quite popular and likely have good tooling for writing content easily, but you
usually have less control over your work and you are at
the whims of the platform. If they ever decide to completely change their
business model and start charging you much higher prices for hosting your work there, then
you better hope that they have an easy way to export your content.</p>
<p><strong>Dynamic site generators</strong></p>
<p>Examples: WordPress, Drupal, Joomla</p>
<p>You can host these on your own server, or pay someone else to do the hosting
for you. Can be easily customized and should be quite beginner-friendly for
content creation. Pages are created on the fly, so these are often not the most performant option. Can easily fall over under
high traffic if the setup is not optimized and your post gets linked on a popular platform (&ldquo;hug of death&rdquo;).</p>
<p>If you ever have to pick one of these types of services, then you must make sure
to keep it up to date. WordPress vulnerabilities can be exploited <strong>within hours</strong> after a vulnerability disclosure.</p>
<p>The performance and security considerations are the main reason why I avoid these
options.</p>
<p><strong>Static site generators</strong></p>
<p>Examples: <a href="https://gohugo.io/">Hugo</a>, <a href="https://jekyllrb.com/">Jekyll</a> and many, many more</p>
<p>With static site generators, you build the site once and copy the contents to
your web server. This comes with great performance benefits as serving static
files on a web server is really darn fast. Even the cheapest virtual private
server at any cloud provider can likely handle more than a gigabit of
SSL-encrypted traffic with this option.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Security is also less of an issue. As long as your web server is up to date, then
you don&rsquo;t have much to worry about, just make sure to not accidentally push any sensitive
files and information along with your blog.</p>
<p>These benefits come with a few trade-offs. The content is written in Markdown and while you can embed
code examples and images, it&rsquo;s not as user-friendly as other platforms. Adding dynamic content and comment sections
is not included by default.</p>
<p>This is the option I&rsquo;ve chosen. The site is built with Hugo, the web server part
is handled by Fedora Server, Docker
and <a href="https://docs.linuxserver.io/general/swag/">this container</a>.</p>
<p><a href="https://pages.github.com/">It&rsquo;s also possible to host your static site on GitHub</a>, if you don&rsquo;t want to
deal with the hassle of having a web server around. The downside of this approach is that
GitHub is quite often down, and their downtime is now your downtime.</p>
<h3 id="just-do-it">
  <a class="heading-anchor" href="#just-do-it">Just do it.<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Go ahead, write that first post! <a href="/posts/2020/07/23/the-little-wifi-ap-that-could/">Here&rsquo;s mine for reference,</a> not great, not terrible.</p>
<p>Don&rsquo;t worry, even I started a blog and abandoned it <a href="https://web.archive.org/web/20190325122634/https://blog.ounapuu.ee/">on my first attempt.</a></p>
<p>Sometimes I start writing when I don&rsquo;t feel like it. If there&rsquo;s a 20 minute time window, I can write the skeleton
for a new post, or finalize a work-in-progress one. Once I get past the hurdle of starting, I&rsquo;m in the zone.
Some of my best posts have been written under these conditions.</p>
<p>Daniel Stenberg had <a href="https://daniel.haxx.se/blog/2024/02/06/fosdem-2024-you-too-could-have-made-curl/">a talk at FOSDEM 2024</a>
that incidentally covered similar time management techniques that help him get work done on <code>curl</code>, I highly recommend
giving it a listen.</p>
<h3 id="build-a-habit">
  <a class="heading-anchor" href="#build-a-habit">Build a habit<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I have a goal to write at least two posts per month and I&rsquo;ve mostly stuck to it, with a few exceptions.
Internal deadlines help me actually get my thoughts and work out there in a somewhat timely manner.</p>
<p>Having this cadence also helps in situation where I expect a busy schedule, as I can try to finish a few posts in advance.</p>
<p>A post can take anywhere from 1 to 4 hours in my experience. Some can take a few days, such as <a href="/posts/2024/02/12/fosdem-2024/">my FOSDEM 2024 post.</a></p>
<p>One post per month can be a good goal for a first time writer.</p>
<h3 id="tooling">
  <a class="heading-anchor" href="#tooling">Tooling<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>You don&rsquo;t need anything special for writing. Use whatever works for you. If it supports spell-check, then that&rsquo;s even better.</p>
<p>I write my posts in Markdown and the best tool I&rsquo;ve found for that happens to be IntelliJ IDEA.
I already use it for development work and its Markdown support is good. That&rsquo;s it.</p>
<p>I&rsquo;ve used tools like MarkText <a href="/posts/2024/02/13/oops/">but it went really poorly the last time.</a>
Other text editors haven&rsquo;t worked for me for various reasons.</p>
<h3 id="optional-buy-a-domain-name">
  <a class="heading-anchor" href="#optional-buy-a-domain-name">Optional: buy a domain name<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>You may want to get a domain name for your blog. Depending on your setup, it can make transferring your
blog to a different provider or service much easier, simply point your domain to a new IP address!</p>
<p>This does add a yearly cost that might not be acceptable for everyone.</p>
<h3 id="optional-use-a-completely-separate-contact-e-mail">
  <a class="heading-anchor" href="#optional-use-a-completely-separate-contact-e-mail">Optional: use a completely separate contact e-mail<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>If you add a contact e-mail to your blog, then you will get spam, guaranteed.</p>
<p>I use a completely different e-mail because of this, it helps me easily see where the spammers got my e-mail.
I also find it funny that every time a spammer e-mails me, they&rsquo;re blatantly lying without even trying. You see, my e-mail
is <code>ihavesomethoughtsonyourblog@ounapuu.ee</code> and it&rsquo;s rarely the case that they actually have thoughts on my blog.</p>
<p>If you have a domain name and a decent e-mail service provider, then adding additional e-mails should be quite easy.</p>
<h3 id="optional-self-host-at-home">
  <a class="heading-anchor" href="#optional-self-host-at-home">Optional: self-host at home<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>A small blog is a great first-time project for someone that wants to get into self-hosting and building a homelab.</p>
<p>All you need are ways to open port 80 and 443 for HTTP and HTTPS.</p>
<p>A residential connection will likely have a dynamic IP address. It might be possible to pay extra to have a static
IP address. It&rsquo;s also possible to sign up with a dynamic DNS provider that handle IP address changes for you.</p>
<p>I&rsquo;ve gone one step further and written a DNS updater Python script against my domain registrar. If you can read this
text, then it means that the script works!</p>
<h2 id="how-i-write">
  <a class="heading-anchor" href="#how-i-write">How I write<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;m not going to tell you how to write because I can barely manage to do it myself, and there are smarter people out
there from whom you can learn that.</p>
<p>What I <em>can</em> do is to share my writing process in the hopes that there are a few tech tips that you find useful.</p>
<h3 id="writing">
  <a class="heading-anchor" href="#writing">Writing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I have a list of ideas that I have written down. When I get the opportunity or
inspiration to write, I look at the list and pick something from it.</p>
<p>Every post starts with a draft title and a bulleted list of points to cover in a post. That list is like a table of
contents for the post, and then I start expanding on them in writing.</p>
<p>Pictures are usually added after the first draft is done.</p>
<h3 id="sharing-my-work">
  <a class="heading-anchor" href="#sharing-my-work">Sharing my work<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I believe in <a href="https://indieweb.org/POSSE">POSSE</a>: <em>Publish (on your) Own Site, Syndicate Elsewhere</em>.
I have full control over my blog and can link to it on all sorts of platforms. Screw &ldquo;big tech&rdquo;!</p>
<p>Sharing my work has been tricky, however. I can always share it in platforms like LinkedIn,
but links like that get down ranked compared  to &ldquo;native&rdquo; posts on the platform itself.</p>
<p>Link aggregators, such as Hacker News and Reddit, discourage or forbid sharing your own content. I have done it, but only
with content that I think is relevant to the communities. There&rsquo;s a reason these rules are in place, simply check
<a href="https://news.ycombinator.com/newest">the newest posts on Hacker News</a> to understand why.</p>
<p>I don&rsquo;t recommend this type of behaviour, but if you have a good understanding of the community and what content they
like to see, then it can be a good way to get some eyes on your content.</p>
<p>Once you get a following, you don&rsquo;t have to worry much about sharing
your work as your readers will probably do it for you.</p>
<h3 id="how-readers-keep-up-with-my-blog">
  <a class="heading-anchor" href="#how-readers-keep-up-with-my-blog">How readers keep up with my blog<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I&rsquo;ve seen two ways that readers follow blogs: mailing lists and RSS feeds.</p>
<p>Readers can follow my blog using <a href="/index.xml">the RSS feed.</a>
For those that are unfamiliar with RSS, I link to <a href="https://aboutfeeds.com/">aboutfeeds.com</a> at the bottom of my posts.</p>
<p>It&rsquo;s harder to track the number of subscribers with an RSS feed, but I believe it&rsquo;s the approach that best preserves
reader privacy.</p>
<p>Some feed reader services, such as Feedly, Inoreader and Feedbin, have a neat little feature where
they actually send the number of subscribers in the user agent when making a request towards your RSS feed, and that user agent
is visible in your web server logs:</p>
<p><code>127.0.0.1 - - [21/Aug/2024:10:40:19 +0300] &quot;GET /index.xml HTTP/1.1&quot; 304 0 &quot;-&quot; &quot;Feedly/1.0 (+http://www.feedly.com/fetcher.html; 72 subscribers; )&quot;</code></p>
<p>Mailing lists are also quite common for blogs, but I never found a good mailing list provider that costs a reasonable
amount of money, so I never started one. I&rsquo;m also not going to manually maintain one or build a solution myself.</p>
<h2 id="analytics">
  <a class="heading-anchor" href="#analytics">Analytics<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My main analytics tool is <code>goaccess</code>, a handy terminal UI tool that reads <code>nginx</code> web server logs and outputs basic
statistics. This is just enough information for getting a basic understanding about how well my posts are doing.</p>
<p><code>goaccess</code> can also track incoming requests live, which is very cool to observe when your post has gained traction on
Hacker News.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/goaccess.png">
    <img src="/posts/2024/09/06/blog/media/goaccess_hu_9a3718d04ba2bc0f.webp"
     width="709"
     height="568"
     loading="lazy"
     decoding="async"
     alt="Small glimpse of what goaccess can show.">

  </a>
  <figcaption class="center">Small glimpse of what goaccess can show.</figcaption>
</figure>

<p>I also check in on Google Search Console from time to time. It&rsquo;s been quite handy for understanding how well my posts
are doing in Google Search.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/google-search-console.png">
    <img src="/posts/2024/09/06/blog/media/google-search-console_hu_75cc19c4f6e2c12c.webp"
     width="800"
     height="353"
     loading="lazy"
     decoding="async"
     alt="Example of Google Search Console results.">

  </a>
  <figcaption class="center">Example of Google Search Console results.</figcaption>
</figure>

<p>I can also get an understanding how my content is doing elsewhere. I don&rsquo;t have Google Analytics on my page, but I can
still see when my posts have gained traction on Hacker News or elsewhere.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/google-search-console-discover.png">
    <img src="/posts/2024/09/06/blog/media/google-search-console-discover_hu_19bd6d83daec1edb.webp"
     width="800"
     height="353"
     loading="lazy"
     decoding="async"
     alt="I guess they track popular HN posts.">

  </a>
  <figcaption class="center">I guess they track popular HN posts.</figcaption>
</figure>

<h2 id="observations-and-tech-tips">
  <a class="heading-anchor" href="#observations-and-tech-tips">Observations and tech tips<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My years of running a blog have resulted in some potentially interesting tidbits and tips that I can share.</p>
<h3 id="hacker-news">
  <a class="heading-anchor" href="#hacker-news">Hacker News<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://news.ycombinator.com/news">Hacker News</a>
likes <a href="https://news.ycombinator.com/item?id=38695029">cats</a>, <a href="https://news.ycombinator.com/item?id=37819114">cool hardware</a>, <a href="https://news.ycombinator.com/item?id=37565688">tech museums</a>
and <a href="https://news.ycombinator.com/item?id=39342109">FOSDEM</a>.</p>
<p>And they sure love <a href="https://news.ycombinator.com/item?id=29871693">old ThinkPads</a>, including
those <a href="https://news.ycombinator.com/item?id=34542920">that act like a server.</a> <a href="https://news.ycombinator.com/item?id=33187494">Any old ThinkPad, really.</a></p>
<p>I&rsquo;m happy with it because the discussions that spawn from these topics are great to read and I learn new things almost every time.
Sometimes people post comments without reading the post and that kind of pisses me off, but overall it&rsquo;s a nice
community that has done a decent job moderating itself.</p>
<p>What I also like about Hacker News is that they also have a second chance pool. If your submission was great but didn&rsquo;t get much
traction initially, then it might end up being given a second chance to get to the front page. Two of my submissions have
gone through this process, it&rsquo;s a really nice feeling to be acknowledged like that.</p>
<h3 id="people-like-hardware">
  <a class="heading-anchor" href="#people-like-hardware">People like hardware<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I&rsquo;ve noticed that no matter what hardware I talk about, there is someone out there interested in it.</p>
<p>For example, most clicks coming in from Google are related to products like <a href="/posts/2024/03/06/fairphone5/">Fairphone 5</a>
and <a href="/posts/2023/10/09/zimaboard/">Zimaboard.</a></p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/google-search-fairphone.png">
    <img src="/posts/2024/09/06/blog/media/google-search-fairphone_hu_9a7cdd6de97a7387.webp"
     width="747"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Screenshot taken in Firefox Private mode. It&#39;s beating The Verge!">

  </a>
  <figcaption class="center">Screenshot taken in Firefox Private mode. It&#39;s beating The Verge!</figcaption>
</figure>

<p>Niche products, <a href="/posts/2022/10/04/testing-expresscard-nvme-ssd-adapter/">such as ExpressCard to NVMe adapters</a>, are
also bringing
in a solid number of clicks.</p>









<figure class="center">
  <a href="/posts/2024/09/06/blog/media/google-search-expresscard.png">
    <img src="/posts/2024/09/06/blog/media/google-search-expresscard_hu_cfce2744dced9f3d.webp"
     width="766"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Screenshot taken in Firefox Private mode.">

  </a>
  <figcaption class="center">Screenshot taken in Firefox Private mode.</figcaption>
</figure>

<p>I wouldn&rsquo;t want to be a full-time reviewer like how most tech YouTubers operate, but it could be fun to get access
to cool hardware that I could then <del>do incredibly dumb things with</del> test.</p>
<h3 id="feedback">
  <a class="heading-anchor" href="#feedback">Feedback<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>You&rsquo;ll probably get feedback.</p>
<p>Most of it will be good, constructive and informative.</p>
<p>Some of it will be from people who are complete tools.</p>
<p>The most important step is to figure out which bucket the feedback falls into.</p>
<p>You don&rsquo;t have to address any of the feedback. You don&rsquo;t owe anyone anything. It&rsquo;s your blog.</p>
<p>If you&rsquo;re brave, you can consider <a href="https://ludic.mataroa.blog/compliments/">showcasing uninformed takes on your blog, in the style of Ludicity.</a></p>
<h3 id="follow-your-own-blog">
  <a class="heading-anchor" href="#follow-your-own-blog">Follow your own blog<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I use <a href="https://miniflux.app/">Miniflux</a> as my feed reader because it&rsquo;s simply the best one out there.</p>
<p>Counterintuitively, I also follow my own blog there as it helps me catch any issues with my RSS feed.</p>
<p>I&rsquo;ve caught a few issues, such as <a href="/posts/2024/02/13/oops/">my drafts being accidentally published,</a> or new pages on
my site being present in the RSS feed.</p>
<p>It&rsquo;s also just a good way to see if the feed is OK.</p>
<h2 id="other-blogs-that-i-like">
  <a class="heading-anchor" href="#other-blogs-that-i-like">Other blogs that I like<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I follow a lot of blogs, but the ones that have had the biggest influence on my own blog are the following:</p>
<ul>
<li><a href="https://www.jeffgeerling.com/blog">Jeff Geerling</a>
<ul>
<li>he covers a lot of cool single board computers and actually uses Ansible correctly!</li>
<li>he also has an accompanying <a href="https://www.youtube.com/c/JeffGeerling">YouTube channel</a></li>
</ul>
</li>
<li><a href="https://solar.lowtechmagazine.com/">Low-tech Magazine</a>
<ul>
<li>I love the concept of a solar-powered website and hope to do something similar in the future</li>
<li><a href="https://solar.lowtechmagazine.com/2020/12/how-and-why-i-stopped-buying-new-laptops/">this post</a> is what inspired me
to write <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/">my most successful post to date</a></li>
</ul>
</li>
<li><a href="https://louwrentius.com/">Louwrentius</a>
<ul>
<li>lovely little blog that covers all sorts of homelab-ish topics</li>
<li>this one is also solar-powered!</li>
</ul>
</li>
<li><a href="https://ludic.mataroa.blog/">Ludicity</a>
<ul>
<li>the aggressive tone is refreshing and gives me courage to say what I actually think</li>
<li>the blogging platform itself is also very opinionated and minimal, which I love to see!</li>
</ul>
</li>
</ul>
<h2 id="discovering-new-blogs">
  <a class="heading-anchor" href="#discovering-new-blogs">Discovering new blogs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Sometimes I am bored. Happens rarely, but when it does, I like to look around to see what other blogs are
out there.</p>
<p>I&rsquo;ve used the following tools to find new blogs:</p>
<ul>
<li><a href="https://cloudhiker.net/explore">Cloudhiker</a></li>
<li><a href="https://indieblog.page/">indieblog.page</a></li>
<li><a href="https://kagi.com/smallweb/">Kagi Small Web</a></li>
<li><a href="https://blogs.hn/">blogs.hn</a></li>
</ul>
<p>It requires intent and time to go through these, but that&rsquo;s also part of the fun. Similar to a dedicated music discovery
and active listening session, if you think about it.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I find writing to be incredibly fulfilling, and I hope that at least some of you end up writing about the topics that
you are passionate about.</p>
<p>If you feel that there&rsquo;s a topic that I didn&rsquo;t cover, or you have additional questions related to writing a blog, then
don&rsquo;t be afraid to reach out to me!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>the cheapest ARM-based VM at Hetzner Cloud could easily serve 1.6 Gbit/s of HTTPS traffic, benchmarked using <code>wrk</code> against my own blog.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>How I ended up working as a software developer</title><link>https://ounapuu.ee/posts/2024/08/16/career/</link><pubDate>Fri, 16 Aug 2024 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/08/16/career/</guid><description>A few seemingly unimportant experiences and choices can lead to big things.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/08/16/career/media/cover_hu_bb47a902ef679373.jpg" width="1200" height="630" alt="How I ended up working as a software developer" /><p>I&rsquo;ve officially worked as a software developer since August 2016, and by now I
have a fair share of stories to tell from those years. But those are stories for
another time.</p>
<p>Today I&rsquo;d like to focus on where it all got started.</p>
<h2 id="the-early-days">
  <a class="heading-anchor" href="#the-early-days">The early days<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I never considered myself good with computers, or a nerd, or anything like that
during my childhood. All my computing experiences can be summed up in a pretty
short list, and most of the memories are around computer games.</p>









<figure class="center">
  <a href="/posts/2024/08/16/career/media/petthekitty.jpg">
    <img src="/posts/2024/08/16/career/media/petthekitty_hu_3a8558f8353ee8fc.webp"
     width="1184"
     height="800"
     loading="lazy"
     decoding="async"
     alt="I was simply too busy petting the kitty.">

  </a>
  <figcaption class="center">I was simply too busy petting the kitty.</figcaption>
</figure>

<p>Starting off, there was that one Windows 95 box with no internet connection at
home. Me and my younger brother defaced the startup screen in Paint because it
was just one of the images on the drive, and there wasn&rsquo;t anything else
interesting
for us to do there.</p>
<p>Then there was that one laptop the family had temporarily. It ran Windows XP,
which felt really modern because the user interface had actual colors.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> I
remember
being fascinated by one game on
it: <a href="https://www.myabandonware.com/game/siia-sinna-laebi-linna-s-e32">Siia sinna läbi linna.</a>
It was a simple educational game where you had to follow traffic rules as a
pedestrian
and walk around. I had the most fun with it when I tried to illegally cross the
road and barely miss the cars.</p>
<p>My aunt had a desktop PC that I rarely could play with, but it had some great
games, like The Need for Speed (the very first one!) and a PC port of Sonic the Hedgehog 3.</p>
<p>Later on there was a Compaq Armada 1592DT. It ran <a href="https://en.wikipedia.org/wiki/Windows_Me">Windows Millenium Edition,</a>
which is commonly regarded as <strong>the worst</strong> Windows release ever. It was not great, I can tell you
that.</p>
<p>It was around this time that I also got into gaming more. I played through the
demos
of Need for Speed III Hot Pursuit and Sports Car GT<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> <em><strong>hundreds</strong></em> of times.
Free demos
was all I got, and not many games even ran on the laptop. The two games in
question
also ran slowly, but I still loved them.</p>
<p>Then there was a Windows 98 desktop PC that I got around 2004-2005. This time
in my life was characterized by family drama, so it was great to have a place
to escape. My fondest memories include <em>finally</em> playing the full version of
Need for
Speed III Hot Pursuit, and hours and hours of RuneScape.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> I still remember one
random event occurring in RuneScape where a tree pops up and you have to
interact
with them or try to kill them, however my computer froze at the time and no
amount
of hitting it with my foot helped. Lost my full mithril armor that day. The
computer eventually gave up with what I
assume was a hard drive failure.</p>
<p>Then we got an actual new computer for the first time in my life. It was 2006
and we got a Fujitsu tower PC with an AMD Athlon 64 X2 4200+ and an Nvidia
GeForce 7300. The GPU was passively
cooled and died soon, and the warranty service put in a Nvidia GeForce 6500
instead.
That ran <em>much</em> better. This was the era of more unpleasant life events, working
summers
as a newspaper seller<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, and playing a lot of GTA San Andreas and Need for
Speed World.
I could spend 9 hours playing every day while still keeping my grades up at
school.</p>
<p>I had the time of my life playing games, and it&rsquo;s probably what saved me from
making stupid, irreversible decisions.</p>
<h2 id="school-computers-and-me">
  <a class="heading-anchor" href="#school-computers-and-me">School, computers and me<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I went to first grade in 2002.</p>
<p>The first time I could use a computer in a classroom was in <strong>2010.</strong></p>
<p>There was one classroom full of Windows XP boxes, and with something like 256 MB of RAM in them.
The UI was very gray, likely as a result of switching to a &ldquo;classic&rdquo; theme to
save some resources.</p>
<p>I remember two items from the curriculum:</p>
<ul>
<li>creating a Word document</li>
<li>creating some pixel art in Paint</li>
</ul>
<p>We had to remember which computer we used and hide our files somewhere in the
folder structure if we didn&rsquo;t want to lose it between classes. USB sticks
were very expensive and not that popular as well.</p>
<p>Our teacher was what you&rsquo;d think of when you thought of the most stereotypical
sysadmin: probably good at their day job, but maybe not the best teacher. At least
they did show us the insides of a PC, and I remember how they were raving about
their IBM ThinkPad T20-series laptop and how the new ones were trash. I guess some
things never change.</p>
<p>There was also a short robotics course where we could do things with LEGO
Mindstorms robots, but we never quite understood what we were doing.</p>
<p>Not all schools in Estonia are made equal, and I experienced it first-hand. My
next school was a completely different experience, as they had <em>two</em> computer classes, and
the machines they were replacing were still years ahead of what we had at the
previous school.</p>
<p>I&rsquo;m very happy to see that we have companies like <a href="https://greendice.com/projects/">GreenDice</a>
who are motivated by similar experiences and want to make sure that everyone
has access to computers. Most media consumption happens on phones, but the real
work still gets done on PC-s.</p>
<h2 id="the-part-where-i-started-programming">
  <a class="heading-anchor" href="#the-part-where-i-started-programming">The part where I started programming<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When I went to 10th grade, I did so at a new school. It is considered one of the &ldquo;elite&rdquo; ones in Estonia,
and I got there by pure accident.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup></p>
<p>Ah, 2011. The iPhone was new, smartphones were evolving fast and I definitely
did not know how to talk to girls.</p>
<p>Around 2012, our class teacher sent out a notice saying that Tartu University
was offering a free extracurricular course named <em>&ldquo;Teeme ise arvutimänge&rdquo;</em>
(roughly translates to &ldquo;Let&rsquo;s build computer games&rdquo;).
It was fully online with no scheduled mandatory hours and I liked games, so I
signed up.</p>
<p>The course was about 7 weeks long. Every week you&rsquo;d focus on one area, starting
with the basics of Python 3, building up your knowledge with more complex
parts of the language and creating a text-based game. At the end of the course
you had the choice of building a text-based game or a 2D game
with <a href="https://www.pygame.org/">Pygame.</a></p>
<p>I had discovered retro gaming around this time, so I went ahead and
recreated the final boss level of Sonic the Hedgehog 3. I &ldquo;borrowed&rdquo; sprites and
the official soundtrack from various places online, and at the end I had
something
that didn&rsquo;t run very well, but it <em>ran</em>.</p>
<p>And it still runs on my Fedora Linux 40 laptop!</p>









<figure class="center">
  <a href="/posts/2024/08/16/career/media/game-level1.png">
    <img src="/posts/2024/08/16/career/media/game-level1_hu_4aa034cd20db0fe9.webp"
     width="1026"
     height="800"
     loading="lazy"
     decoding="async"
     alt="I got a bit excited replaying this.">

  </a>
  <figcaption class="center">I got a bit excited replaying this.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/16/career/media/game-title.png">
    <img src="/posts/2024/08/16/career/media/game-title_hu_71c79b6166aeb7fb.webp"
     width="1026"
     height="800"
     loading="lazy"
     decoding="async"
     alt="&#34;original content do not steal&#34;">

  </a>
  <figcaption class="center">&#34;original content do not steal&#34;</figcaption>
</figure>

<p>After the final project was completed, everyone who participated shared their
games with the group. I liked seeing a few games there where it was obvious
that the author had put actual effort in and loved working on it.</p>
<p>I passed, in spite of the obscene number of copyright violations that I had committed.</p>









<figure class="center">
  <a href="/posts/2024/08/16/career/media/whatthehellisgit.png">
    <img src="/posts/2024/08/16/career/media/whatthehellisgit_hu_a037486a1f32bd0.webp"
     width="378"
     height="223"
     loading="lazy"
     decoding="async"
     alt="It&#39;s clear that git was not part of the course.">

  </a>
  <figcaption class="center">It&#39;s clear that git was not part of the course.</figcaption>
</figure>

<p>Before I went to university, I also attended a one-off extracurricular
programming
class offered by the school. During that time, I showed my game to a classmate
there
and they were absolutely horrified at the code. For good reason. Whatever I did
there, it was horribly inefficient. At least my modern CPU can now chomp
through all that inefficiency.</p>
<p>With that feedback in mind, I rewrote the game from scratch, made fewer stupid
mistakes
and added new features as well. It was still around the same concept of the
Sonic the Hedgehog 3 final boss level, but the obstacles and enemies were more
varied
and the game ran at 60 FPS even on an old laptop.</p>
<p>What&rsquo;s funny is that the <em>new</em> version of the game doesn&rsquo;t run. I had to
manually
set the resolution of the game, and even after that the game crashes randomly
after 5-10 seconds.</p>









<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-crash.png">
    <img src="/posts/2024/08/16/career/media/newgame-crash_hu_166db3d3c9ddd8e5.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Definitely not future-proof.">

  </a>
  <figcaption class="center">Definitely not future-proof.</figcaption>
</figure>

<p>But hey, it looks so much better!</p>









<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-title.png">
    <img src="/posts/2024/08/16/career/media/newgame-title_hu_fbdc4cc6793d16fb.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="I even commissioned a drawing for the title screen. Big budget stuff!">

  </a>
  <figcaption class="center">I even commissioned a drawing for the title screen. Big budget stuff!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-levelselect.png">
    <img src="/posts/2024/08/16/career/media/newgame-levelselect_hu_5da15b1b1a6870f9.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Ain&#39;t nobody got time for replaying the whole game to debug the final boss!">

  </a>
  <figcaption class="center">Ain&#39;t nobody got time for replaying the whole game to debug the final boss!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-level1.png">
    <img src="/posts/2024/08/16/career/media/newgame-level1_hu_7e2bd072c487e77e.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The sprites are animated now!">

  </a>
  <figcaption class="center">The sprites are animated now!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-boss1.png">
    <img src="/posts/2024/08/16/career/media/newgame-boss1_hu_82ebddd20b8db084.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="Variety in bosses!">

  </a>
  <figcaption class="center">Variety in bosses!</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-boss2.png">
    <img src="/posts/2024/08/16/career/media/newgame-boss2_hu_bcc047a9532c9fd8.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="A bit harder to hit now.">

  </a>
  <figcaption class="center">A bit harder to hit now.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/08/16/career/media/newgame-finalboss.png">
    <img src="/posts/2024/08/16/career/media/newgame-finalboss_hu_700318624aa4c3ae.webp"
     width="1200"
     height="750"
     loading="lazy"
     decoding="async"
     alt="The orange ones follow a sine wave pattern. Very advanced AI!">

  </a>
  <figcaption class="center">The orange ones follow a sine wave pattern. Very advanced AI!</figcaption>
</figure>

<p>This Pygame adventure also spawned the only two StackOverflow questions that I
have ever
asked: <a href="https://stackoverflow.com/questions/23571956/pygame-way-to-create-more-userevent-type-events">the one where I ran into limitations of the library,</a>
and another
one <a href="https://stackoverflow.com/questions/22287975/background-in-pygame-causes-graphical-issues">where I couldn&rsquo;t understand why my background was funny.</a></p>
<p>I also ended up attending an event<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup> where I could show my game to others, and
<a href="https://level1.ee/2014/06/eesti-indie-mangud-mangutisel-doomsday-zone/">the article about it is still up!</a>
You might need to use your favourite translation service to understand it
though.</p>
<p>This one course is the sole reason I chose computer science in university and
ended up as a software developer. This sequence of events is purely accidental,
and yet it sparked this fire in me that thrives on building new things and
troubleshooting issues. I <em><strong>loved</strong></em> the immediate visual feedback that I got
when
building the game and had a lot of fun trying to figure out how to make the
computer do what I want.</p>
<p>A lot of what made me love programming was also what I enjoyed during my first
actual job as a software developer. I started out as a front-end developer,
working with Angular 2 right when it got the first official stable release.
It wasn&rsquo;t easy to start with something like that as a junior developer, but
I loved the immediate visual feedback and learning how to use the browser
tooling to troubleshoot issues.</p>
<p>For a few years I also considered pursuing a career in game development. I love
playing games, I love programming, so it would have made perfect sense, right?</p>
<p>Unfortunately the only things I kept hearing about game development were
negative ones, involving
poor working conditions, &ldquo;crunch time&rdquo;, and how most game developers end up
with mental illnesses and severe burnout, all because some people in suits
want to make even more money.</p>
<h2 id="things-i-wish-i-knew">
  <a class="heading-anchor" href="#things-i-wish-i-knew">Things I wish I knew<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The lead-up to my first actual job as a software developer included a lot of unknowns, anxiety and comparisons to more
successful students, which is why I&rsquo;d like to share some tech tips for those just starting out in this field or IT in
general.</p>
<p><strong>It&rsquo;s OK to try out this role and end up deciding that it&rsquo;s not for you.</strong> I
know quite a few
people that started out as software developers, but ended up transitioning into
a different role that suited their interests better, such as team lead, product
manager or data engineering. Even I had a two-year gig as a team lead! Change
can be scary, but it might end up being the right thing to do.</p>
<p><strong>Don&rsquo;t feel pressured to do <em>anything.</em></strong> Some YouTuber just posted a video
that you <em>have</em> to learn this new framework or programming language or you will never get
a job? Someone on Twitter keeps insisting that the blockchain is the future and everything
else is now obsolete? That is pure grade-A clickbaity bullcrap that plays on the fear of
missing out. Don&rsquo;t fall for it.</p>
<p>There&rsquo;s also a subset of developers who have an expectation that you also write
code in your free time and regularly contribute to open source projects. Unless
you
want to work at Google, Meta or any of the other &ldquo;big tech&rdquo; companies, then
you really don&rsquo;t need to cave in to this unreasonable pressure. You&rsquo;ll be fine.</p>
<p><strong>Do things because you <em>love</em> to do them.</strong>  I have the opportunity to do
software development stuff 32 hours a week<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">7</a></sup>, why would I want to do even <em>more</em> of it?
In my free time I want to do dumb experiments with my hardware and try out new ideas in my homelab. I also like writing a lot, so that&rsquo;s what I end up doing.</p>
<p><strong>Take care of yourself</strong>, and learn about the symptoms of burnout. It&rsquo;s OK to
take a rest if you need it. I wish someone told me this while I was in
university,
would have prevented quite a few chronic health issues.</p>
<p><strong>Programming skills don&rsquo;t matter as much as think they do.</strong> They still
matter, don&rsquo;t get me wrong, but it&rsquo;s a relatively small part of the job. The
ability to work well with others and a problem-solving mindset will take you
very far, and you&rsquo;ll figure out the technical details along the way.</p>
<p><strong>Don&rsquo;t do it for the money.</strong> The money won&rsquo;t cover the therapy that you&rsquo;re
going
to need to get over the soul-crushing agony that you experience every day if you
secretly hate software development and everything around it. There&rsquo;s a lot to dislike
in the industry even if you like this role, so I can&rsquo;t imagine how bad it might
be as someone who isn&rsquo;t able to enjoy the good parts of it.</p>
<p><a href="/misc/good-reads/">I also have a list of good articles</a> that will <em>hopefully</em>
give you a better idea about the industry, the role and the expectations to a
software developer.</p>
<p>Everyone has their own path to becoming a software developer, and this one
is mine. Yours will probably be different, and that is perfectly fine.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>if you only knew grayscale interfaces all your life, then you&rsquo;d be excited
about a change like that as well.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Sports Car GT launcher also went from reporting 1 MB of VRAM, to -1 MB, to
-1535 MB. For some reason it&rsquo;s a core memory of mine. I don&rsquo;t know why, either.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>it&rsquo;s called Old-School RuneScape now. I&rsquo;m not old, you&rsquo;re old!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>and I was damn good at it, too.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>it&rsquo;s not a weird flex, I just never planned on switching schools, but the
grades were good and the toilets in the new school weren&rsquo;t thick with smoke, so I
switched.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p>it&rsquo;s been 10 years. That&rsquo;s a long-ass time.&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:7">
<p>if you haven&rsquo;t tried a proper 4-day work week, and you have the means
to do it even with an effective 20% pay cut, then try it, it will be
life-changing.&#160;<a href="#fnref:7" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>My very first career day</title><link>https://ounapuu.ee/posts/2024/02/22/career-day/</link><pubDate>Thu, 22 Feb 2024 08:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/02/22/career-day/</guid><description>I had the opportunity to speak at a career day for the first time!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/02/22/career-day/media/cover_hu_eaeb9bb09ce07262.jpg" width="1200" height="630" alt="My very first career day" /><p>This post is a short overview of my experience at
a <a href="https://greendice.com/the-future-green-and-digital-in-every-field/">career day in Valga, Estonia, hosted with the help of GreenDice.</a></p>
<p>I&rsquo;ve never spoken at a career day before nor attended one as a student, which is why I instantly agreed to going to one
when GreenDice reached out to me.</p>
<p>Why? I never had opportunities like that as a student myself, which is why I try to do my part in making sure that
future generations have them.</p>
<p>After agreeing to speak at the event, I had to come up with an idea for a short workshop. Coming up with an idea was
surprisingly tricky due to the set of requirements and assumptions that I could rely on. What I could rely on were
Windows 10 PC-s that had a browser, reasonably fast internet access and 45 minutes per group.
The target audience would be students from 9th grade with all sorts of backgrounds, so the workshop would have to be
accessible to everyone.</p>
<p>I also asked my colleagues for ideas and got useful feedback: whatever you do, make sure that the students have the
chance to find and fix problems themselves.</p>
<p>The workshop ended up
as <a href="https://codepen.io/testingtonjohnston/pen/VwRVgxp">a simple website hosted on CodePen, an in-browser HTML/CSS/JS editor.</a>
It runs well in a browser and allows students to see the results of their changes visually. The web is also something
most of us rely on daily, so working on something relatable is likely a good idea. Hopefully this exercise would also
help demystify how websites work.</p>
<p>Software development solves problems using software as the tool, so the idea was to have students take an
existing but slightly broken software solution and fix it together. I would give a 60 second long intro that was mainly
about what HTML, CSS and JS do on a webpage and how to recover from any issues, and then we would get going.</p>
<p>Once everyone had opened up the editor, I asked the students what they thought about the webpage. Was it working
correctly?
Did it look good? Based on the feedback we&rsquo;d tackle these issues one by one. The solutions also had to come from the
students, so in a way I was there to just listen and try out fixes that the students came up with. At the end of the
session we&rsquo;d have a solution that functioned properly and looked good.</p>
<p>The issues I planted into the website were as follows:</p>
<ul>
<li>the background image might have been cute, but not suitable for the site as it made reading the text difficult</li>
<li>the previous developer left a visible comment in the middle of the page</li>
<li>the page title is too small</li>
<li>there is a photo of two cute cats present when you load the page
<ul>
<li>students convinced me that it was a feature, so we kept that in</li>
</ul>
</li>
<li>when you hover over the button, it goes blank</li>
<li>images of the food options are upside down</li>
<li>one image would not load properly</li>
<li>one food choice would have the wrong image</li>
<li>one food choice was missing an image</li>
</ul>









<figure class="center">
  <a href="/posts/2024/02/22/career-day/media/workshop.png">
    <img src="/posts/2024/02/22/career-day/media/workshop_hu_8c2e3a9ee9af0fe7.webp"
     width="1280"
     height="440"
     loading="lazy"
     decoding="async"
     alt="The masterpiece that the students started working on.">

  </a>
  <figcaption class="center">The masterpiece that the students started working on.</figcaption>
</figure>

<p>This was just the right amount of work to fit into 45 minutes and in general the students were following along nicely.</p>
<p>If I had to do something similar the next time, I&rsquo;d definitely have someone else assisting at the other end of the
classroom. Although I tried to encourage everyone to make mistakes and refresh the page in case things went really
wrong, some students were a bit hesitant with making changes to the website.</p>
<p>I&rsquo;m also thinking about doing something else with the students in the future if there are enough resources and time.
Perhaps something related to game development, robotics or AR/VR would probably be pretty cool to show off.</p>
<p>If you have organized career days about IT yourself and have ideas to share,
then please do reach out to me, I&rsquo;d be happy to hear about your ideas and experiences!</p>
]]></content:encoded></item><item><title>Oops, I published my drafts!</title><link>https://ounapuu.ee/posts/2024/02/13/oops/</link><pubDate>Tue, 13 Feb 2024 08:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/02/13/oops/</guid><description>Spoilers!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/02/13/oops/media/cover_hu_aacd342b7ca7c90b.jpg" width="1200" height="630" alt="Oops, I published my drafts!" /><p>Those of you who follow my blog using the RSS feed might have seen that new, incomplete posts popped up around the time
I published my <a href="/posts/2024/02/12/fosdem-2024/">FOSDEM 2024</a> post.</p>
<p>Oops.</p>
<p>I recently tried looking for an alternative to writing blog posts in IntelliJ and out of all the options I stuck to
<a href="https://github.com/marktext/marktext">MarkText</a>. Well, it does things a bit differently and what was once a
front-matter
containing all sorts of metadata, including the one that prevents publishing a post if it is a draft, turned into a
code block, and Hugo happily served that up.</p>
<p><code>```</code> vs <code>---</code>, there&rsquo;s a difference!</p>
<p>Anyway, sorry about that, and thanks to those who noticed and let me know.</p>
<p><em>Free tech tip:</em> if you have a website with an RSS feed, do follow it yourself, you&rsquo;ll catch these sorts of issues very
quickly!</p>
]]></content:encoded></item><item><title>FOSDEM 2024: my experience, some notes and tech tips</title><link>https://ounapuu.ee/posts/2024/02/12/fosdem-2024/</link><pubDate>Mon, 12 Feb 2024 08:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2024/02/12/fosdem-2024/</guid><description>I'm sleep-deprived, completely exhausted, but incredibly excited about the whole experience. Here are my notes, impressions and a lot of pictures about FOSDEM 2024.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2024/02/12/fosdem-2024/media/cover_hu_e7e6f01e50626f6c.jpg" width="1200" height="630" alt="FOSDEM 2024: my experience, some notes and tech tips" /><p>I finally went to <a href="https://fosdem.org/2024/">FOSDEM</a>. I&rsquo;m sleep-deprived, completely exhausted, but incredibly excited
about the whole experience.</p>
<p>I&rsquo;ve split this post into three separate sections.</p>
<ul>
<li>
<p><a href="/posts/2024/02/12/fosdem-2024/#the-conference">overall notes on the conference and the city</a></p>
<ul>
<li>less technical, but sheds light on the FOSDEM experience</li>
</ul>
</li>
<li>
<p><a href="/posts/2024/02/12/fosdem-2024/#the-stands-the-hallway-track">the hallway track and stands</a></p>
<ul>
<li>the thing you probably came to FOSDEM for</li>
</ul>
</li>
<li>
<p><a href="/posts/2024/02/12/fosdem-2024/#the-talks">my notes on the sessions I attended</a></p>
<ul>
<li>plus sessions that I plan to watch in the future</li>
</ul>
</li>
</ul>
<h2 id="the-conference">
  <a class="heading-anchor" href="#the-conference">The conference<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p><a href="https://fosdem.org/2024/">FOSDEM (Free and Open source Software Developers&rsquo; European Meeting)</a> is a huge non-profit,
volunteer-organized conference that&rsquo;s free of charge to attend thanks to sponsors and donations. It took place in
Brussels, Belgium at the ULB campus.</p>
<p>I heard about this conference from a friend who went there years ago, and after hearing about the experience and the
content there I knew I had to be there at least once in my life. But then a pandemic happened, so it was sort of in the
backlog for a while.</p>
<p><a href="https://concise.ee">My current employer</a> provides a perk that allows developers to attend technical conferences. After
the FOSDEM 2024 schedule was available I put together an
initial set of talks to attend, presented it to my employer, and got a green light to attend (and
travelling/accommodation paid for).</p>
<h3 id="the-city">
  <a class="heading-anchor" href="#the-city">The city<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>To make sure that I&rsquo;m well-rested, I arrived the night before FOSDEM with my friend. After dropping my stuff off at the
hotel, we went to get something to eat and continued at the Delirium Beer Garden to sample some of the finest Belgian
beers. It was very crowded, but after the first beers and some walking around the many floors we found a place to chill.</p>
<p>We ended up with sampling a meter of beer which was a selection of ten small beers, laid out on a plank. It was a nice
way to try different tastes and honestly all of them were either good or great. Cherry, raspberry and the green cactus
option were the sweetest, like some good lemonade that has the potential to cause hangovers.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/meter-of-beer.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/meter-of-beer_hu_950e871723b806a6.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Meter of beer. It didn&#39;t come pre-sampled by someone else, don&#39;t worry.">

  </a>
  <figcaption class="center">Meter of beer. It didn&#39;t come pre-sampled by someone else, don&#39;t worry.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/cactus.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/cactus_hu_dde421c0cf4655c4.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="This one was called &#34;Cactus&#34;. Didn&#39;t taste like one, but certainly looked the part and was absolutely delicious.">

  </a>
  <figcaption class="center">This one was called &#34;Cactus&#34;. Didn&#39;t taste like one, but certainly looked the part and was absolutely delicious.</figcaption>
</figure>

<p><strong>Free tech tip:</strong> don&rsquo;t underestimate the strength of Belgian beer. You won&rsquo;t taste it, but that 8-9% alcohol per
volume really hits in the morning.</p>
<p>Brussels is allegedly very nice, however I&rsquo;m not a big fan of the way trash is handled, there are bags everywhere and
some of them are broken, leaving small pieces of trash everywhere. You could also smell the lack of public restrooms
when walking down the streets in the city center.</p>
<p>There are some glimpses of good bicycle infrastructure, but they often don&rsquo;t connect well or are simply lines on the
ground which doesn&rsquo;t protect that well from cars. Based on the honks and the number of times they did not stop at
crosswalks, I can only assume that drivers in Brussels are both very aggressive and very incompetent at driving. In a
way it felt like home, especially since my hometown of Tallinn also uses red paint on some bicycle paths.</p>
<h3 id="the-dos-and-donts-of-fosdem">
  <a class="heading-anchor" href="#the-dos-and-donts-of-fosdem">The dos and don&rsquo;ts of FOSDEM<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>I went to the ULB campus using a tram. If you&rsquo;re not sure which one to take, then take the one with the most developers
headed towards it. Knowing when to get off is also easy as you can simply follow the crowd.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/tofosdem.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/tofosdem_hu_760a50ae273feaf5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="To FOSDEM!">

  </a>
  <figcaption class="center">To FOSDEM!</figcaption>
</figure>

<p>I arrived roughly 15 minutes before the keynote session. At that time there was plenty of room in the auditorium. By the
time the keynote started there were no seats available, so you might want to do the same and arrive a bit early.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/keynote.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/keynote_hu_d4771bd39b2df802.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="15 minutes before the keynote. The place was packed at the start of the keynote, with more people still coming in.">

  </a>
  <figcaption class="center">15 minutes before the keynote. The place was packed at the start of the keynote, with more people still coming in.</figcaption>
</figure>

<p>There were <em>a lot</em> of people attending FOSDEM. Keep a map handy, because your next session might take place in a room
that might be tricky to find, especially as a
first-timer. <a href="https://f-droid.org/en/packages/be.digitalia.fosdem/">The FOSDEM Companion app</a> is great for that, click
on the session you&rsquo;re interested in and the room name, and you&rsquo;ll have a good idea on where it&rsquo;s taking place.</p>
<p>This FOSDEM was the 24th FOSDEM to take place, which is important because the 25th one is happening next year. If you&rsquo;ve
been to any previous ones and are attending next year, then bring the oldest FOSDEM shirt with you, there will be a
special photoshoot taking place.</p>
<p>If you&rsquo;re going to attend FOSDEM in-person, then definitely
read <a href="https://petersouter.xyz/fosdem-survival-guide/">the FOSDEM survival guide.</a> All the points there are still
relevant and helped me out tremendously during my trip.</p>
<p>In short:</p>
<ul>
<li>
<p>take an earlier bus/tram to get to FOSDEM to avoid crowds and get there on time</p>
</li>
<li>
<p>if you want to guarantee getting a seat in a session, consider joining an earlier session in the same room</p>
<ul>
<li>you might also learn something about an area you had no clue about, which is a great bonus!</li>
</ul>
</li>
<li>
<p>don&rsquo;t underestimate the strength of Belgian beer</p>
<ul>
<li>trust me on that one</li>
</ul>
</li>
<li>
<p>food lines can get very long, bring some light snacks and plenty of water with you</p>
<ul>
<li>
<p>some places had water bottle refilling stations, such as the U building, but I had a hard time finding one in
others</p>
</li>
<li>
<p>there was plenty of <a href="https://en.wikipedia.org/wiki/Club-Mate">Club-Mate for sale</a> and based on the number of empty
bottles it was a crowd favourite</p>
</li>
</ul>
</li>
</ul>
<p>There were 879 events taking place at FOSDEM 2024. That is a lot of talks to go through. My recommendation is to take an
evening at least a week from the event and go through the list of talks starting with main tracks and lightning talks,
and following it up with devrooms that align with your interests.</p>
<p>If you do it in the <a href="https://f-droid.org/packages/be.digitalia.fosdem/">FOSDEM Companion</a> app, then you can bookmark
them and view your initial schedule. The app will show you where there are overlapping sessions by coloring the
start/end times red. The app can also show you if a room is too full to attend. Don&rsquo;t forget that switching rooms might
take about 15 minutes in some cases due to the size of the campus, so leave some room for walking in your schedule.</p>
<p>In my experience, the most enjoyable FOSDEM experience is one where you attend at most 2-3 tracks during the day and
leave plenty of time for eating, resting and visiting all the stands. It&rsquo;s going to be exhausting either way, so you
might as well make the most of the FOSDEM live experience. Talks are recorded and will be published soon after the event
so you&rsquo;re not going to miss much if you take things easy (unless there are issues capturing the session).</p>
<p>Here are a few simple guidelines that I recommend following so that listening to talks in FOSDEM live is a great
experience for both you and those around you:</p>
<ul>
<li>
<p>try to get to your next talk about 15 minutes before it starts, that allows you to queue up early and not miss your
session</p>
</li>
<li>
<p>don&rsquo;t talk or whisper during the talk and the Q&amp;A session with the speakers</p>
<ul>
<li>there were so many cases where the speaker could not even hear the question being asked, which is disrespectful
to the speaker and the audience</li>
</ul>
</li>
<li>
<p>if you really need to leave early, then be as quiet as possible</p>
<ul>
<li>the old desks at the seats make a lot of noise if you carelessly put them back up-right</li>
</ul>
</li>
<li>
<p>if you really didn&rsquo;t have time for a snack, then don&rsquo;t bring something that makes a lot of noise or smells strongly to
the auditorium</p>
</li>
</ul>
<p>If you want to get a FOSDEM t-shirt or hoodie in your favourite size, then the first half of the first day is the ideal
opportunity for that. At FOSDEM 2024 the t-shirts cost 25 EUR, hoodies cost 50 EUR.</p>
<p>Most payments you&rsquo;ll make will likely be with contactless payments via your card or phone, but definitely bring some
cash with you in smaller denominations as there were a few cases at the start of the conference where the payment
systems were not working properly, likely due to network issues. Somewhere between 100-200 EUR will likely cover
anything you&rsquo;d need at the conference itself.</p>
<p>With the food trucks I made an observation: the lines were longer for the more expensive and higher quality food
options. The cheaper ones are okay and are generally quite fast to get. The more &ldquo;premium&rdquo; trucks were not much slower
though so waiting in line might pay off.</p>
<p>During the keynote it was emphasized that some of the attendees will get sick as a result of this conference. They call
it <em>the FOSDEM flu</em>. I guess it&rsquo;s a thing that happens at many big conferences, but in any case if you do visit FOSDEM
then please don&rsquo;t do it while sick. If you fall sick at the event, then rest at the hotel and watch it on a livestream
instead. There&rsquo;s always next year!</p>
<p>One pattern I noticed is that quite a few talks were used as a great marketing tool for highlighting issues that the
speaker would like some help with solving. What better way to improve FOSS than to involve people who might not even be
aware of the issues but have the technical know-how to help?</p>
<h2 id="the-stands-the-hallway-track">
  <a class="heading-anchor" href="#the-stands-the-hallway-track">The stands (the hallway track)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>One of the highlights of the FOSDEM experience are the various stands in different buildings in the campus. You&rsquo;ll find
all sorts of different projects being represented, ranging from big, established ones (Fedora, Debian, Nextcloud,
PostgreSQL etc.) all the way down to small projects and organizations (postmarketOS, Ubuntu Touch, CalyxOS and many
more).</p>
<p>Most stands offer free merch, such as stickers. A lot of stands sell merch, most accept card payments, some accept
payments via online credit card payments, and a few take cash only.</p>
<p>I visited most booths at the event and spoke briefly with many of the people present there. If you&rsquo;re just curious about
what&rsquo;s on display and have no background knowledge, then don&rsquo;t be afraid to ask questions, no matter how simple you
think they are!</p>
<p>Here are my notes on the stands that I found the most interesting</p>
<h3 id="gnu-radio">
  <a class="heading-anchor" href="#gnu-radio">GNU Radio<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://www.gnuradio.org/">Visit the website</a>.</p>
<p>This stand had a simple and effective demo of a device monitoring the 2.4 GHz spectrum, which is also where older Wi-Fi
standards operate in. The person hosting the booth was happy to explain what was going on, even bringing out details
such as signals bouncing around the room and how they show up on the spectrum visualizer.</p>
<p>Turns out that you can achieve this by putting together two blocks in a visual editor in GNU Radio, and this is why it&rsquo;s
on my todo list now.</p>
<p><a href="/posts/2024/02/12/fosdem-2024/media/gnuradio.mp4">There&rsquo;s also a video clip of the visualization running.</a></p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/gnuradio.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/gnuradio_hu_1caf9a50db6e6728.webp"
     width="1280"
     height="721"
     loading="lazy"
     decoding="async"
     alt="GNU Radio showcasing its visualization prowess.">

  </a>
  <figcaption class="center">GNU Radio showcasing its visualization prowess.</figcaption>
</figure>

<h3 id="minetest">
  <a class="heading-anchor" href="#minetest">Minetest<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://www.minetest.net/">Visit the website</a>.</p>
<p>Minetest is an open source game engine and had a booth present at the event. They had the game running on a laptop. A
Steam Deck with the official dock was also present. I&rsquo;ve previously heard about this project many years ago, at that
time it was a simple Minecraft-like game but a bit too basic in my opinion. The demo at the booth reminded me of
something more polished and yet familiar enough to remind me of Minecraft 1.8 Beta days.</p>
<p>Turns out that over the years the game engine has seen a lot of development and there are many creators who have mades
games based on this engine. I was also delighted and surprised to hear that Minetest has been used in educational
projects.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/minetest.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/minetest_hu_bd462dcbf632d9ba.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Minetest running on a laptop, with a booklet showcasing some games made on it in front.">

  </a>
  <figcaption class="center">Minetest running on a laptop, with a booklet showcasing some games made on it in front.</figcaption>
</figure>

<p>This was a nice and colorful corner of the event, and now I&rsquo;m interested in giving Minetest a try again.</p>
<h3 id="ubuntu-touch">
  <a class="heading-anchor" href="#ubuntu-touch">Ubuntu Touch<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://ubuntu-touch.io/">Visit the website</a>.</p>
<p>Ah, Ubuntu Touch. I believe the first time I heard about Ubuntu Touch was when they introduced the convergence idea.
Your phone is the only computer you have, use it as a phone when out and about, and connect it to a dock when at home to
get a desktop experience.</p>
<p>The booth had a wide variety of devices present, including Fairphone 4 and 5 (this isn&rsquo;t the first time you&rsquo;ll see these
models mentioned). At the booth were people who actually daily drive Ubuntu Touch, and one person I talked to expressed
their interest in porting Ubuntu Touch to a Samsung foldable phone.</p>
<p>Ubuntu Touch isn&rsquo;t probably something I&rsquo;d run full-time, but perhaps it&rsquo;s time to give it a go again. My Nexus 5 still
has the boot logo that Ubuntu Touch installer creates, so that will serve as a reminder for me to check it out.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/ubuntu-touch.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/ubuntu-touch_hu_bccb88026fddef74.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Ubuntu Touch mascot looking over the phones.">

  </a>
  <figcaption class="center">Ubuntu Touch mascot looking over the phones.</figcaption>
</figure>

<h3 id="sailfishos">
  <a class="heading-anchor" href="#sailfishos">SailfishOS<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://sailfishos.org/">Visit the website</a>.</p>
<p>I knew of SailfishOS, but had never tried a device out with that OS. At FOSDEM I finally had the chance to do it, and
out of all the custom OS options that aren&rsquo;t Android-based, this one was the one with the smoothest and most polished
experience. When speaking to the person hosting the booth, I also learned that it is possible to even run Android apps
on it, although after doing some research on their website it seems like it&rsquo;s a feature that you need to pay for.</p>
<p>The phones laid out on the booth were various Sony Xperia devices. I&rsquo;ve not used or seen those devices, but they felt
really great in hand and were super small compared to modern phones. Seems like these models are also the ones that have
got the most polish and support, based on the materials on the website and my two minutes of fiddling with them.</p>
<p>Out of all the non-Android alternative operating systems, this one has the most potential to be a daily driver. The
person at the booth uses theirs as a daily driver so there must be potential on it. The corporate backing is likely what
allows the OS to feel usable and hopefully that will be enough to keep this project alive.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/sailfishos.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/sailfishos_hu_4cf37839e4991eb1.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Various Sony Xperia phones running SailfishOS.">

  </a>
  <figcaption class="center">Various Sony Xperia phones running SailfishOS.</figcaption>
</figure>

<h3 id="droidian-and-postmarketos">
  <a class="heading-anchor" href="#droidian-and-postmarketos">Droidian and postmarketOS<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://droidian.org/">Visit Droidian</a>. <a href="https://postmarketos.org/">Visit postmarketOS</a>.</p>
<p>There were multiple booths where you could try out various versions of Linux-based phones that aren&rsquo;t Android.</p>
<p>The phones were all sorts of older and newer devices that originally shipped with Android. The experience and support
was a combination of the hardware and the state of the mobile Linux distribution and UI. Some were quite okay, some were
rough, and some were just slow due to the age of the phone itself.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/droidian.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/droidian_hu_e2c1e4fffd63ed5d.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Plain old Linux? On my phone? It&#39;s more likely than you think!">

  </a>
  <figcaption class="center">Plain old Linux? On my phone? It&#39;s more likely than you think!</figcaption>
</figure>

<p>I really appreciate these types of efforts to give new life to old devices. Most Android devices lose software support
after a few years, but with projects that basically put Linux on a phone you can still find ways to make use of the
devices. They might not be stable enough yet to be considered a reliable daily driver as a smartphone, but you can do
all sorts of cool things with them, like running web servers or hosting encrypted remote backups of critical data.</p>
<p>One of the booths also had a Pinephone in a keyboard dock, which was neat as I&rsquo;ve never seen a Pinephone in real life,
nor had the opportunity to try one with a keyboard. It wasn&rsquo;t ergonomic trying to do it with two hands, but maybe I was
holding it wrong.</p>
<p>It was interesting to see GNOME or KDE-based user interfaces on phones. The gestures and navigating the UI was a bit
rough since there were slight differences on each OS. Still cool though!</p>
<p>Oh, and there was a visitor who had some cool gear with them. Other than a GPD portable computer, they also had a
mechanical keyboard with a wide display attached to it.
They tried connecting it to a phone that was on display at the booth, and it recognized it as a second display on the
first try. The model of the keyboard is <em>Ficihp K2</em> in case you&rsquo;re interested in similar gear.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/dockeddroidian.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/dockeddroidian_hu_c30b0ac592dec1c0.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="How to take notes in the coolest way possible.">

  </a>
  <figcaption class="center">How to take notes in the coolest way possible.</figcaption>
</figure>

<h3 id="calyxos">
  <a class="heading-anchor" href="#calyxos">CalyxOS<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://calyxos.org/">Visit the website</a>.</p>
<p>I had never heard of this Android-based OS before, but there they were, showcasing it on a freaking Fairphone 5 (and
also some other phones)!</p>
<p>The people at the booth were very friendly and helpful, answering any of the questions I had about app compatibility and
the OS itself.</p>
<p>The project seems to be backed by an US-based non-profit, <a href="https://calyxinstitute.org/">the Calyx Institute.</a></p>
<p>I&rsquo;m a bit wary about using this on my daily driver Fairphone 5 running Android 13 as I just got it, but if I had a spare
one for testing
I&rsquo;d definitely check out how well it fares as a privacy-focused OS. The potential is there and hopefully CalyxOS will
have a chance to prove itself as a long-term and stable project.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/calyxos.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/calyxos_hu_9cf9c5a086dbc9d7.webp"
     width="1143"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Totally forgot to take a photo of phones running CalyxOS as I was too busy giving the OS a try, but here&#39;s a hat!">

  </a>
  <figcaption class="center">Totally forgot to take a photo of phones running CalyxOS as I was too busy giving the OS a try, but here&#39;s a hat!</figcaption>
</figure>

<p>Side note: I&rsquo;m planning on covering my Fairphone 5 experience as a separate post in the future, but one
takeaway from FOSDEM is that I&rsquo;ve accidentally picked a tinkerer&rsquo;s dream phone.</p>
<h3 id="automotive-grade-linux">
  <a class="heading-anchor" href="#automotive-grade-linux">Automotive Grade Linux<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://www.automotivelinux.org/">Visit the website</a>.</p>
<p>Like with many projects, I had never heard about this one before FOSDEM.</p>
<p>This booth was displaying various interfaces designed for cars. There was a demo vehicle dashboard which was simulating
a moving car. Next to it were two bigger displays that had infotainment and control panel functionality with all sorts
of buttons on it.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/automotivelinux.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/automotivelinux_hu_c4747595accce41b.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Yup, that&#39;s RISC-V!">

  </a>
  <figcaption class="center">Yup, that&#39;s RISC-V!</figcaption>
</figure>

<p>Between these two setups was a small control board with 9 keys and two dials. Some of the buttons popped up warning
lights on the digital dashboard, such as passenger airbag failure. Other buttons had various stickers on them: HTML5, Qt
and Flutter. Turns out that the intotainment display demo was built on top of containers and pressing a key would stop
the running one and start up a different one based on whichever button you clicked.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/automotivelinuxdash.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/automotivelinuxdash_hu_c6ddeb6bc89aaff.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Unlike with my actual car, with this one you could turn the warning lights off without having to spend a lot of money!">

  </a>
  <figcaption class="center">Unlike with my actual car, with this one you could turn the warning lights off without having to spend a lot of money!</figcaption>
</figure>

<p>One of the infotainment displays was running off of a Raspberry Pi, which was cool. The rest of the displays were
running off of a stack of various bits of hardware.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/automotivelinuxinfotainment.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/automotivelinuxinfotainment_hu_b9247a1870ca6b31.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Dashboard and infotainment setup, with the container switching buttons between them.">

  </a>
  <figcaption class="center">Dashboard and infotainment setup, with the container switching buttons between them.</figcaption>
</figure>

<p>Based on the marketing materials at the booth it seems like automotive grade Linux is also collaborating with some big
names in the auto industry, which is neat!</p>
<h3 id="pine64">
  <a class="heading-anchor" href="#pine64">Pine64<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://pine64.org/">Visit the website</a>.</p>
<p>I&rsquo;ve occasionally checked out Pine64 progress and devices online, and at FOSDEM I finally got around to play around with
some of them.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/pine64.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/pine64_hu_3bfa57017cb3a287.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="So much tech to play with!">

  </a>
  <figcaption class="center">So much tech to play with!</figcaption>
</figure>

<p>I first checked out the smartwatch named <a href="https://wiki.pine64.org/wiki/PineTime">PineTime</a>. It comes in multiple
versions, one for daily use (the sealed model),
and one which is bulkier but easier to open and flash in case you mess up your firmware. I&rsquo;m currently using a <a href="https://www.casio.com/us/watches/casio/product.F-105W-1A/">Casio
F105W</a> and haven&rsquo;t been a big fan of smartwatches, but the
hardware on the sealed model felt premium and something I&rsquo;d
pay good money for. The functionality was basic, but it had everything you&rsquo;d want from a basic watch, plus a heart rate
monitor and even a Pong-like game. I&rsquo;m seriously considering getting one now.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/pinetime.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/pinetime_hu_b298b0f89ebe9b12.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Do you know what time it is?">

  </a>
  <figcaption class="center">Do you know what time it is?</figcaption>
</figure>

<p><a href="https://wiki.pine64.org/wiki/PineTab-V">The PineTab-V</a>, a RISC-V based tablet, was also present and running KDE Plasma.
The experience was unstable at the time
as I had the settings app crash on me once, but that&rsquo;s likely down to driver support not being quite there yet. That&rsquo;s
OK, since they advertise the device as an experimental device right now.</p>
<p>Something I wasn&rsquo;t even aware of was the <a href="https://wiki.pine64.org/wiki/PineNote">PineNote</a>, a Linux tablet with an e-ink
display. It was running an actual GNOME desktop on it so the interface was instantly familiar to me. As a test case I
opened up my blog on it and it worked just fine. Scrolling the
page to read the blog was a bit clunky due to the low refresh rate that an e-ink display has, that&rsquo;s just a limitation
of the technology. <a href="/posts/2024/02/12/fosdem-2024/media/pinenote-scrolling.mp4">Here&rsquo;s a clip demonstrating it.</a></p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/pinenote.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/pinenote_hu_4de0ac61c128cd95.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Shameless plug, I know.">

  </a>
  <figcaption class="center">Shameless plug, I know.</figcaption>
</figure>

<p>While I was checking out the hardware, there was also a demonstration going on of the capabilities of
the <a href="https://wiki.pine64.org/wiki/Pinecil">Pinecil</a>, a
small soldering iron that&rsquo;s really cool and gets quite hot. I&rsquo;m a bit surprised that it didn&rsquo;t trigger the smoke alarm
that was a few meters away from the booth.</p>
<h3 id="bytenight-2024--hackerspace-brussels-hsbxl">
  <a class="heading-anchor" href="#bytenight-2024--hackerspace-brussels-hsbxl">Bytenight 2024 @ Hackerspace Brussels (HSBXL)<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>One of the many FOSDEM fringe events was a party hosted at <a href="https://hsbxl.be/">Hackerspace Brussels</a>, a hackerspace
located in an old industrial building. The event had DJ-s playing music, a t-shirt making booth, a fancy projector
setup, a room with SuperTuxKart on a big screen and a small Raspberry Pi-based mini arcade box, and the room where I
assume work gets done since it had all the electronics equipment and workspaces.</p>
<p>The projector setup used in the party area was simple but elegant. It was positioned in a way that allowed various
surfaces to reflect the video at different levels, making it all feel three-dimensional.</p>
<p>I loved how one of the hackerspace members was excited to show off the insides of the mini arcade cabinet and explain
the build process of it, including the design of the physical components. It&rsquo;s cool seeing people get enthusiastic about
something they&rsquo;ve built with their own hands.</p>
<p>At one point me and my friend ended up speaking to a group of people, one of whom was showcasing their Tamagochi and
offering it to others to interact with. I learned from them that there exists a self-hostable Snapchat-like app
called <a href="https://piqchat.net/">Piqchat.</a> My friend gave it a go on their instance and after fiddling with the sign-up
process (we were at least two beers in at this point) he got it working.</p>
<p>We arrived around 20:45ish at the location, and at that point the dancefloor was a bit empty, but after 23:00ish it
looked like a proper party. I wasn&rsquo;t in the mood to party much because there was a whole second day of FOSDEM left and I
was already exhausted.</p>
<p>Interesting location, interesting vibe and probably a great place for raves.</p>
<h3 id="and-the-rest">
  <a class="heading-anchor" href="#and-the-rest">And the rest&hellip;<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Here are some quick notes on other booths that I need to throw out there so that I don&rsquo;t end up forgetting them.</p>
<p><strong>KDE</strong>: other than stickers or merch, they had small handmade plushies of the project mascot Konqi. I&rsquo;m still a bit sad
that I didn&rsquo;t get one at the first opportunity because they were all sold out during the first day.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/kde-gnome.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/kde-gnome_hu_bfb7126ab73f9b1b.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Loved the fact that they were next to the GNOME booth. :)">

  </a>
  <figcaption class="center">Loved the fact that they were next to the GNOME booth. :)</figcaption>
</figure>

<p><strong>PostgreSQL</strong>: I got to play in a game of Kahoot and while I crashed and burned in the final standings, I learned a lot
about the PostgreSQL project details in the process. They also had cute hand-made (in Germany of all places!) elephant
plushes in PostgreSQL-blue so of course I bought one. Fun fact: the ones sold there were version 2 of the plush which
has the nice feature of not falling over on a flat surface. See, making PostgreSQL stable isn&rsquo;t that hard!</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/postgresql.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/postgresql_hu_96f9aa60e52eb86e.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="It&#39;s clear that I don&#39;t know how to take selfies, and the poor low-light performance of the Fairphone 5 camera certainly
didn&#39;t help.">

  </a>
  <figcaption class="center">It&#39;s clear that I don&#39;t know how to take selfies, and the poor low-light performance of the Fairphone 5 camera certainly
didn&#39;t help.</figcaption>
</figure>

<p><strong>Firefox cookies:</strong> Mozilla handed out free cookies from a pink food truck. No cookie banner included, but I guess it&rsquo;s
a nice way to remind everyone that Mozilla Firefox still exists. It blocks ads on desktop PC-s and Android, use it or
lose it!</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/cookies.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/cookies_hu_6e1ca5ec50b00ca6.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="First-party cookies!">

  </a>
  <figcaption class="center">First-party cookies!</figcaption>
</figure>

<p><strong>ISRG and LetsEncrypt:</strong> <em>I went to FOSDEM and all I got was this free cert.</em> The person at the booth was
also handing them out in large quantities, just like Let&rsquo;s Encrypt servers.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/letsencrypt.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/letsencrypt_hu_b2374074a73a089c.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Brilliant!">

  </a>
  <figcaption class="center">Brilliant!</figcaption>
</figure>

<p><strong><a href="https://f-droid.org/en/packages/com.enjoyingfoss.feeel/">Feeel</a>
and <a href="https://f-droid.org/en/packages/de.wger.flutter/">wger</a>:</strong> I know that it doesn&rsquo;t look like it (yet) but I do go to
the gym regularly and my current workflow
involves keeping notes in a Google Sheets file. I never knew that a FOSS solution exists for tracking my workouts. I
need to try it.</p>
<p><strong>FOSSASIA</strong>: these lovely people were selling LED badges that you can program easily with
an <a href="https://f-droid.org/en/packages/org.fossasia.badgemagic/">Android app called Badge Magic.</a> This was 100% nerd bait
and ranked high on the &ldquo;I don&rsquo;t need it but it&rsquo;s so cool that I need to get one&rdquo;. Simple. Elegant. Awesome!
Oh, and due to the transfers being Bluetooth Low-Energy powered, I think someone accidentally sent their badge contents
to my
device. Whoops. <a href="/posts/2024/02/12/fosdem-2024/media/badgemagic.mp4">Here&rsquo;s mine in action!</a></p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/fossasia.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/fossasia_hu_8e2ebfda1ad782b8.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="A lot of people wore these over the campus, including myself.">

  </a>
  <figcaption class="center">A lot of people wore these over the campus, including myself.</figcaption>
</figure>

<p><strong>Jenkins:</strong> they had <em>Roundernetes</em>, a Kubernetes cluster made of lots of Raspberry Pi-s, in a round frame. I&rsquo;d love to
build something similar one day, just because it&rsquo;s neat!</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/roundernetes.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/roundernetes_hu_b6855e5b82a45a9d.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="They certainly know how to nerd-snipe someone!">

  </a>
  <figcaption class="center">They certainly know how to nerd-snipe someone!</figcaption>
</figure>

<p><strong><a href="https://checkmk.com/">Checkmk</a></strong>: it was the first time I heard about this monitoring solution, but after hearing
about their background and
their approach to building Checkmk that involved a lot of cooperation with customers, I&rsquo;ll need to give this a proper
look. Oh, and they had an air quality sensor hooked up to the booth, the results were OK when I visited the booth.</p>
<h2 id="the-talks">
  <a class="heading-anchor" href="#the-talks">The talks<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>You&rsquo;re probably coming to FOSDEM for the vibe, the people and all the fun stands, but there are also hundreds of talks
that you can choose to attend.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/curl.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/curl_hu_cade8035f345500a.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Hey, it&#39;s that guy from curl!">

  </a>
  <figcaption class="center">Hey, it&#39;s that guy from curl!</figcaption>
</figure>

<p>There were many talks covering interesting topics, but I could only attend a relatively small number of those live.
There&rsquo;s simply too much interesting content out there.</p>
<p>Here are my notes on the ones I attended live.</p>
<h3 id="where-the--are-the-packets-going">
  <a class="heading-anchor" href="#where-the--are-the-packets-going">&ldquo;Where the !?*! are the packets going?&rdquo;<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2929--where-the-are-the-packets-going-/">View the talk page</a>.</p>
<p>This was one of those sessions I decided to sit in on to catch one I really wanted to attend and it was a good decision
as the room was packed.</p>
<p>This talk gave a quick overview of a modified version of <code>traceroute</code> by Catchpoint and the enhancements they made to
it, involving QUIC support, functionality that bypasses firewalls and some shenanigans in Linux setups on Azure (the
Microsoft cloud services platform).</p>
<p><strong><em>techtipsy rating:</em> 6/10</strong>, it was alright.</p>
<h3 id="broom-not-included-curling-the-modern-way">
  <a class="heading-anchor" href="#broom-not-included-curling-the-modern-way">Broom not included: curling the modern way<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1909-broom-not-included-curling-the-modern-way/">View the talk page</a>.</p>
<p>This talk was originally meant for a 40 minute session but due to limitations of the FOSDEM schedule, 20 minutes was all
he got.</p>
<p>This session was a rapid-fire presentation of curl development and all sorts of things that you could do with it. I&rsquo;ve
used <code>curl</code> so far for simple requests, but after this session I know that you can do all sorts of shenanigans,
including parallel transfers and a lot of JSON mangling. <em>JSON, JSON, JSON!</em></p>
<p>I also learned about <a href="https://curl.se/trurl/">trurl</a> which is handy for working with URL-s. Parse them, modify them, do
whatever you desire without re-implementing all that complexity yourself. Neat!</p>
<p><strong><em>techtipsy rating:</em> 10/10</strong>, short, amusing and yet useful listen about curl, looking forward to a longer version in
the
future!</p>
<h3 id="improving-ipv6-only-experience-on-linux">
  <a class="heading-anchor" href="#improving-ipv6-only-experience-on-linux">Improving IPv6-only experience on Linux<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1798-improving-ipv6-only-experience-on-linux/">View the talk page</a>.</p>
<p>I initially didn&rsquo;t plan on sitting in for this one, but since one of the WiFi networks hosted by FOSDEM itself was IPv6
only and I&rsquo;m plagued by my ISP only working over IPv4 (<em>old-man-yells-at-Elisa.jpg</em>), I decided to listen to this one.</p>
<p>The speaker gave an overview of the situation with IPv6, which operating systems handle it well and which do not, and
how you can improve the IPv6 compatibility on your own machine.</p>
<p>In short: Android works, Linux/Windows mostly work, but all the Internet of Things garbage (smart <em>everything</em>) is
something you should simply avoid at all costs since those hastily thrown together pieces of crap only work over IPv4.</p>
<p>The rest of the session covered possible solutions for making sure that IPv4 and IPv6 both work nicely on your machine.
Turns out that there really isn&rsquo;t one perfect solution for this problem, especially since you can&rsquo;t just ignore that
part of the Internet that doesn&rsquo;t support IPv6, yet.</p>
<p>This talk was also a way to ask for help from the FOSS community to help come up with a solution. If you&rsquo;re into this
topic, then go ahead and reach out!</p>
<p><strong><em>techtipsy rating</em>: 8/10</strong>, learned a lot about IPv6 support and what&rsquo;s going on in this area.</p>
<h3 id="an-engineers-guide-to-linux-kernel-upgrades">
  <a class="heading-anchor" href="#an-engineers-guide-to-linux-kernel-upgrades">An engineer&rsquo;s guide to Linux Kernel upgrades<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3370-an-engineer-s-guide-to-linux-kernel-upgrades/">View the talk page</a>.</p>
<p>Great presentation that included useful recommendations for rolling out Linux kernel upgrades and why you don&rsquo;t want to
wait a long time to upgrade, backed up with data and nice visualisations, and memes.</p>
<p>Although this talk was about Linux kernel upgrades, the main idea is very much applicable in software development as
well. If you don&rsquo;t release software as often as possible but keep making changes at the same pace, then your change
delta (or
the number of pending changes) increases, and so does the risk of something going wrong, either by releasing a buggy
change that&rsquo;s now harder to troubleshoot due to the large number of changes deployed, or not releasing new versions of
software with security patches.</p>
<p>This talk also explained the Linux kernel development workflow, the meaning behind version numbers (it&rsquo;s not
semantic versioning!), and how security patches get merged into &ldquo;long-term support&rdquo; versions.</p>
<p>In short: update often, deploy often, measure things.</p>
<p><strong><em>techtipsy rating</em>: 9/10</strong>, great listening for software developers and Linux newbies alike.</p>
<h3 id="soft-reboot-keep-your-containers-running-while-your-image-based-linux-host-gets-updated">
  <a class="heading-anchor" href="#soft-reboot-keep-your-containers-running-while-your-image-based-linux-host-gets-updated">Soft Reboot: keep your containers running while your image-based Linux host gets updated<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3282-soft-reboot-keep-your-containers-running-while-your-image-based-linux-host-gets-updated/">View the talk page</a>.</p>
<p>My day job uses Kubernetes for running our services. Have some pods (containers) running on a host that you need to
update? No problem, Kubernetes starts new pods on another host, directs traffic to those and you can now update that
host.</p>
<p>This talk shows another way of updating your host operating system and apparently this functionality is already present
on most modern Linux systems that run <code>systemd</code>.</p>
<p>In short, if your containers meet certain criteria, then you can utilize this soft reboot functionality to update
and reboot your base system without any noticeable interruptions to your containers. Your
kernel will still be the same version, so keep that in mind. And yes, the irony of this solution is not lost to me after
listening
to <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3370-an-engineer-s-guide-to-linux-kernel-upgrades/">the talk that emphasized the importance of updating your kernel as often as possible.</a></p>
<p>Although the customizations behind it are quite simple if you follow the guidelines, this talk still felt like magic to
me. I guess that only means that I should look into it further.</p>
<p><strong><em>techtipsy rating:</em> 9/10</strong>, interesting concept that has real world usages at big tech companies and yet felt like
something I could understand with my small brain.</p>
<h3 id="juggling-with-uids-and-gids-rootless-container-deployment-with-ansible">
  <a class="heading-anchor" href="#juggling-with-uids-and-gids-rootless-container-deployment-with-ansible">Juggling with UIDs and GIDs: rootless container deployment with Ansible<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3412-juggling-with-uids-and-gids-rootless-container-deployment-with-ansible/">View the talk page</a>.</p>
<p>Short but sweet talk about how the speaker manages their home server, including a neat workaround that most people who
have worked with containers have faced: permission issues between containers and the host.</p>
<p>I&rsquo;m actually struggling with a similar issue right now in my home server setup and I&rsquo;ll definitely have to reference
this talk once I get around to trying to fix it.</p>
<p>It was kind of odd how relatable this talk was to me: it&rsquo;s related to self-hosting, the speaker has a home server
running, they mentioned <a href="https://www.linuxserver.io/">linuxserver.io</a> images, and they care about running containers
rootless. Even my friend made a
note about the similarities.</p>
<p><strong><em>techtipsy rating:</em> 10/10</strong>, incredibly relatable and useful to me, a self-hosting enthusiast.</p>
<h3 id="orchestrating-ebpf-applications-in-kubernetes-and-fedora">
  <a class="heading-anchor" href="#orchestrating-ebpf-applications-in-kubernetes-and-fedora">Orchestrating eBPF Applications in Kubernetes and Fedora<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1745-orchestrating-ebpf-applications-in-kubernetes-and-fedora/">View the talk page</a>.</p>
<p>This was another session that I decided to attend because hey, I&rsquo;ve already got a good seat and the session after that
is in the same room.</p>
<p>I had little knowledge about <a href="https://ebpf.io/">eBPF</a> before or what it does, but after listening to this one I have a
rough idea about it. In short: small programs in the kernel that are used for networking, security and
monitoring purposes.</p>
<p>This talk shed some light on deploying eBPF applications with <code>bpfman</code> and nuances around it.</p>
<p><strong><em>techtipsy rating:</em> 6/10</strong>, flew a bit over my head due to my knowledge gaps in eBPF, but it did raise my awareness
about this area.</p>
<h3 id="lift-and-shift-modernising-a-legacy-lamp-application-with-systemd-nspawn">
  <a class="heading-anchor" href="#lift-and-shift-modernising-a-legacy-lamp-application-with-systemd-nspawn">Lift and shift: Modernising a legacy LAMP application with systemd-nspawn<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3008-lift-and-shift-modernising-a-legacy-lamp-application-with-systemd-nspawn/">View the talk page</a>.</p>
<p>During my self-hosting adventure I&rsquo;ve used various setups, including running containers with <code>systemd-nspawn</code>. If you
don&rsquo;t know what that involves, then it&rsquo;s pretty much a container that acts more like a virtual machine when you interact
with it. I have also worked with out of date software projects so this one felt like it could be relevant to my
interests.</p>
<p>This talk was a quick overview of the troubles that the speaker faced with a horrifically out of date software stack
that was still actively used at a school.</p>
<p>The steps taken involved securing the system against basic attacks, then working out how to containerize it and run it,
including
ripping apart old Debian Docker images and having to work around such limitations as &ldquo;there&rsquo;s no systemd&rdquo;.</p>
<p>Great reference for anyone facing similar situations. Wish the speaker had more time to go into the whole other category
of issues related to the software stack itself, including the MySQL related issues they faced during this migration.</p>
<p><strong><em>techtipsy rating:</em> 8/10</strong>, great topic and useful tips, would have loved more horror stories and pictures.</p>
<h3 id="beyond-joins-and-indexes">
  <a class="heading-anchor" href="#beyond-joins-and-indexes">Beyond Joins and Indexes<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3598-beyond-joins-and-indexes/">View the talk page</a>.</p>
<p>This session was a sequel to a previous talk that the presenter gave so I was worried a bit about having knowledge gaps,
but luckily that wasn&rsquo;t that big of a problem.</p>
<p>This talk covered some common PostgreSQL queries and various operations that go on behind the scenes, supported by
illustrations on how exactly PostgreSQL performs those operations.</p>
<p>There were a lot of examples shown and it was genuinely interesting. At one point it became more difficult
to follow along, but I&rsquo;ll mark that down to this being the first session of the second day of FOSDEM. I think my brain
quit on <em>parallel hash join</em> part. In a way I felt like I was back in school.</p>
<p>Given the background of the speaker, it&rsquo;s no surprise that
they<a href="https://momjian.us/main/presentations/performance.html"> have lots of presentations</a> and resources on PostgreSQL.
Will definitely have to check those out.</p>
<p><strong><em>techtipsy rating:</em> 9/10</strong>, made my head hurt but I&rsquo;m now aware of what to Google when dealing with PostgreSQL, and I
know which materials to reference to refresh my memory on this topic.</p>
<h3 id="isolation-levels-and-mvcc-in-sql-databases-a-technical-comparative-study">
  <a class="heading-anchor" href="#isolation-levels-and-mvcc-in-sql-databases-a-technical-comparative-study">Isolation Levels and MVCC in SQL Databases: A Technical Comparative Study<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3600-isolation-levels-and-mvcc-in-sql-databases-a-technical-comparative-study/">View the talk page</a>.</p>
<p>This talk started out well: forget what you know about SQL standards because those are apparently not correct in modern
SQL databases. Way ahead of you there, Mr. Pachot!</p>
<p>Turns out that life before MVCC (multi-version concurrency control) was rough and reading data involved locking it.
Unintentionally
locking tables is something that&rsquo;s a common problem at my day job with <em>writes</em>, so I can&rsquo;t imagine what type of hell
life would
be if that was still the reality.</p>
<p>This talk shed some light on how databases handle transactions, reads and writes. Good resource to refer back to.</p>
<p>Made me awfully paranoid about databases and data consistency now. Can I even <em>trust</em> databases any more? Or my
knowledge on this topic?</p>
<p>Sidenote on <a href="https://www.yugabyte.com/">YugabyteDB</a>: as someone who has been surprised
by <a href="https://aws.amazon.com/rds/aurora/">Amazon Aurora</a> quirks at my day job (broken indices after a
minor version upgrade, anyone?), I find it interesting that there are other companies that provide a similar service
involving a PostgreSQL-compatible database with a custom data storage solution below it.</p>
<p><a href="https://dev.to/franckpachot">Author also has a blog on all things SQL, might be worth checking out.</a></p>
<p><strong><em>techtipsy rating:</em> 8/10</strong>, made me feel even more insecure about my database knowledge, but at least I know how to
fix that.</p>
<h3 id="linux-load-average-and-other-silly-metrics">
  <a class="heading-anchor" href="#linux-load-average-and-other-silly-metrics">Linux load average and other silly metrics<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1921-linux-load-average-and-other-silly-metrics/">View the talk page</a>.</p>
<p>Quick overview of why Linux load average is not an useful metric to follow, and can be incredibly misleading in some
scenarios, especially if you compare sync vs async I/O. I&rsquo;ve been guilty of tracking that metric religiously myself,
so&hellip; <em>whoops.</em></p>
<p>Even the Linux kernel source code calls it a silly metric!</p>
<p>Look at Pressure Stall Information instead to understand where your system is bottlenecking.</p>
<p><strong><em>techtipsy rating:</em> 7/10</strong>, good topic but the live demo part could have used some polish.</p>
<h3 id="private-clouds-do-not-need-to-be-legacy">
  <a class="heading-anchor" href="#private-clouds-do-not-need-to-be-legacy">Private clouds do not need to be legacy!<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1779-private-clouds-do-not-need-to-be-legacy-/">View the talk page</a>.</p>
<p>This one was a run through various high-level tech tips to take into account when faced with the task of moving to a
on-premise cloud setup.</p>
<p>During my own professional career that officially begun in 2016, there has always been a push to move workloads into the
cloud, for all sorts of reasons, legitimate or misguided. Turns out that on-prem isn&rsquo;t dead and some organizations are
moving back in that direction due to legal or technical requirements.</p>
<p>Here are my takeaways:</p>
<ul>
<li>
<p>avoid third party software because that&rsquo;s usually a source of lock-in</p>
</li>
<li>
<p>if faced with <em>buy vs build</em> decisions, prefer build</p>
</li>
<li>
<p>keep things super simple</p>
</li>
<li>
<p>if faced with build-time or run-time complexity, prefer the former, otherwise more technical layers in run-time result
in more difficult troubleshooting due to added complexity</p>
</li>
<li>
<p>consider using Kubernetes (and an open source distribution of it)</p>
</li>
<li>
<p>version control your infrastructure</p>
</li>
<li>
<p>if you automate something, automate it 100% end-to-end, don&rsquo;t half-ass it or include manual middle steps</p>
</li>
</ul>
<p>A lot of ideas mentioned here are also applicable to those working with cloud platforms in any large company. If you
have competent engineers, then you&rsquo;ll probably have no major problems if you move to a private cloud setup as a lot of
the tooling and knowledge should transfer over.</p>
<p><strong><em>techtipsy rating:</em> 7/10</strong>, would have loved to see case studies of public -&gt; private cloud migrations to illustrate
the process and highlight the pain points.</p>
<h3 id="firefox-power-profiling-a-powerful-visualization-of-web-sustainability">
  <a class="heading-anchor" href="#firefox-power-profiling-a-powerful-visualization-of-web-sustainability">Firefox power profiling: a powerful visualization of web sustainability<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2716-firefox-power-profiling-a-powerful-visualization-of-web-sustainability/">View the talk page</a>.</p>
<p>This was a fun one for me because I care about how much power my tech consumes, and the speaker put a new twist on it.
Ever wondered how much energy is spent loading your website? Now you can find that out!</p>
<p>This talk ties in with Mozilla&rsquo;s vision for a better internet and their stated sustainability goals. Building new
computing hardware is very resource and energy intensive, and shoddy websites motivate people to upgrade sooner than
necessary.</p>
<p>The steps to take to measure the performance and power consumption of your webpage are quite simple. The power
measurement support is hardware and platform dependent, but even without that you can get a pretty good idea of how well
your website performs. The whole process was easy enough to do that I could follow it along on my laptop during the
talk.</p>
<p>The talk was simple to follow and yet covered a lot of details and nuance around power profiling on various platforms.
This should be mandatory for anyone working in web development, especially those that add animated full-page backgrounds
on websites or load in megabytes of JavaScript.</p>
<p>Give this talk a listen and start measuring website performance, I highly encourage it!</p>
<p><strong><em>techtipsy rating:</em> 10/10</strong>, I hate poorly performing websites and love my machines running as efficiently as
possible, and this talk brings those two topics together in a very nice way.</p>
<h3 id="postgres-vs-linux-filesystems">
  <a class="heading-anchor" href="#postgres-vs-linux-filesystems">Postgres vs. Linux filesystems<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3605-postgres-vs-linux-filesystems/">View the talk page</a>.</p>
<p>My experience with hosting PostgreSQL has mainly been limited to one instance that is used by Nextcloud, and during my
professional career I&rsquo;ve only observed migrations away from ZFS-based self-hosted PostgreSQL instances, so I was really
interested in seeing how different filesystems affect PostgreSQL performance.</p>
<p>This talk laid out some general guidelines for anyone running PostgreSQL, such as keeping your kernel up to date to get
the best performance and avoid old kernel bugs, and presented lots of graphs detailing the behaviour of different
filesystems under heavy workloads simulated using <code>pgbench</code>.</p>
<p>I recommend that you view the results, they might surprise you. As a <code>btrfs</code> user, they certainly made me think about
choosing it if I were to ever build a dedicated database server on raw hardware.</p>
<p>Benchmarking is very difficult to get right so I suspect that there might be other nuances at play here with the
results. Interesting presentation regardless.</p>
<p>Sidenote: the presenter was running <a href="https://www.qubes-os.org/">QubesOS</a>, which I&rsquo;ve briefly played around with in the
past. I never expected to see anyone <em>actually</em> using it as their daily driver. Very impressive!</p>
<p><strong><em>techtipsy rating:</em> 9/10</strong>, I now have an urge to do my own benchmarks to verify these results (but my TODO list is
long enough already).</p>
<h3 id="are-project-tests-enough-for-automated-dependency-updates-a-case-study-of-262-java-projects-on-github">
  <a class="heading-anchor" href="#are-project-tests-enough-for-automated-dependency-updates-a-case-study-of-262-java-projects-on-github">Are Project Tests Enough for Automated Dependency Updates? A Case Study of 262 Java Projects on Github<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3029-are-project-tests-enough-for-automated-dependency-updates-a-case-study-of-262-java-projects-on-github/">View the talk page</a>.</p>
<p>I picked this one mainly due to being annoyed with Dependabot spam and the state of tests at my day job.</p>
<p>This talk covered the promise of automated dependency upgrades and ways you can avoid seemingly innocent upgrades
breaking things in production, covering tools like <a href="https://pitest.org/">PIT</a>
and <a href="https://github.com/jhejderup/uppdatera">Uppdatera</a>. If your tests suck, then adding mutation testing and/or static
analysis to your project might help catch problems before they make it to prod, find unused dependencies and tests that
do not properly verify that the service works.</p>
<p>The speaker also briefly mentions the age-old problem of balancing code reuse vs increasing operational costs. Maybe
don&rsquo;t bring in thousands of dependencies so that you can avoid writing a few lines of code?</p>
<p>There&rsquo;s a whole research paper on this topic as well (check presentation for more details).</p>
<p><strong><em>techtipsy rating:</em> 8/10</strong>, maybe a project where tests are in shambles can be improved after all&hellip;</p>
<h3 id="the-ones-i-watched-later">
  <a class="heading-anchor" href="#the-ones-i-watched-later">The ones I watched later<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Due to scheduling conflicts, room capacity limitations and the fact that I can&rsquo;t teleport, I could not attend everything
live.</p>
<p>Here are the ones that I watched later from a recording.</p>
<h4 id="fosdem-infrastructure-review">
  <a class="heading-anchor" href="#fosdem-infrastructure-review">FOSDEM infrastructure review<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3025-fosdem-infrastructure-review/">View the talk page</a>.</p>
<p>Quick overview of the infrastructure that makes FOSDEM tick. Especially loved the rendering rack made out of laptops and
lessons learned from doing FOSDEM over the years. Includes challenges faced by the organizing team and the (funny)
workarounds they employed.</p>
<p><em><strong>techtipsy rating: 9/10</strong></em>, recording quality is good and I appreciate the look behind the scenes.</p>
<h4 id="where-did-all-the-fun-go-and-how-to-bring-it-back-with-foss">
  <a class="heading-anchor" href="#where-did-all-the-fun-go-and-how-to-bring-it-back-with-foss">Where Did All the Fun Go? And How to Bring it Back with FOSS!<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1899-where-did-all-the-fun-go-and-how-to-bring-it-back-with-foss-/">View the talk page</a>.</p>
<p>Certainly one of the more unorthodox talks at FOSDEM 2024, but it does carry an important message.
The AI and heavy metal parts can feel a bit jarring at first, but in the end it all makes sense, trust me.</p>
<p>Made me miss something that I realized we don&rsquo;t have much of in tech lately: fun! Makes me appreciate creators like
<a href="https://www.youtube.com/@programmersarealsohuman5909">&ldquo;Programmers are also human&rdquo;</a>
and <a href="https://www.youtube.com/@KRAZAM">KRAZAM</a>
so much more now as they carry on the spirit that was covered in the talk.</p>
<p>This is one of those talks where the recording is a bit off, the slides are missing for about half the session so I
recommend opening the slides in another tab (muted) and try to follow along.</p>
<p><em><strong>techtipsy rating: 8/10</strong></em>, great content that lifts the spirit, but recording hampered by technical issues.</p>
<h4 id="diy-private-container-registry">
  <a class="heading-anchor" href="#diy-private-container-registry">DIY Private Container Registry<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2161-diy-private-container-registry/">View the talk page</a>.</p>
<p>This one I feel was hampered by issues with the recording and the short time slot. I felt like the session could go more
in depth on the topic and the custom solution that the speaker was involved in building.</p>
<p>Never knew that the authentication and authorization part of handling private container images isn&rsquo;t actually
standardized and
relies mostly on cloud providers&rsquo; features and/or HTTP basic authentication.</p>
<p><em><strong>techtipsy rating: 5/10</strong></em>, there is potential for a good talk here if given more time and if the speaker goes in
depth.</p>
<h4 id="open-source-for-sustainable-and-long-lasting-phones">
  <a class="heading-anchor" href="#open-source-for-sustainable-and-long-lasting-phones">Open Source for Sustainable and Long lasting Phones<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3362-open-source-for-sustainable-and-long-lasting-phones/">View the talk page</a>.</p>
<p>I discovered this talk randomly while scrolling through the FOSDEM schedule and checking the main track talks. I think I
skipped over this one initially because I had no idea that this was all about Fairphone!</p>
<p>If you&rsquo;ve never heard about Fairphone or why they exist, then I 100% encourage you to give this one a watch. You&rsquo;ll
learn everything you&rsquo;d need to know about Fairphone, including their evolution and how they have approached software and
hardware longevity in their phones.</p>
<p>I was surprised to hear how many obstacles Fairphone faced when trying to keep phones running on up-to-date software.</p>
<p>Yes, I do think that <a href="https://www.youtube.com/watch?v=e-4RlKcinzc">LinusTechTips missed the point of Fairphone</a>.</p>
<p>If I hadn&rsquo;t bought a Fairphone 5 before coming to FOSDEM, then this talk would have totally made me get one. That, and
the fact that most of the custom OS booths had one on display. And Fairphone supports them!</p>
<p><em><strong>techtipsy rating: 10/10</strong></em>, this talk gives me hope that we <em>can</em> change the world, one phone at a time.</p>
<h4 id="you-too-could-have-made-curl">
  <a class="heading-anchor" href="#you-too-could-have-made-curl">You too could have made curl!<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1931-you-too-could-have-made-curl-/">View the talk page</a>.</p>
<p>Inspirational overview from the guy behind <code>curl</code>, covering the journey of <code>curl</code> and the various challenges
over the years. Daniel is very supportive and encouraging in this one, absolutely no gate keeping here and I love it!</p>
<p>If you had doubts about if you could ever be a successful maintainer of an open source project, then this talk
covers most things that you&rsquo;d need to know about the journey, what to keep doing and what to avoid.</p>
<p>There are more general recommendations as well, such as the time management aspect. Daniel intentionally
leaves out playing video games and uses every available time slot that he has. I&rsquo;ve found that if I just start
doing things no matter the timeslots and pick carefully what to focus on, then I can get a lot done, so this strategy
does work!</p>
<p><em><strong>techtipsy rating: 10/10</strong></em>, the microphone quality isn&rsquo;t great on the recording, but the good content makes up for
it.</p>
<h4 id="how-to-build-an-open-source-school-cloud-for-5-million-users">
  <a class="heading-anchor" href="#how-to-build-an-open-source-school-cloud-for-5-million-users">How to Build an Open Source School Cloud for 5 Million Users<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2415-how-to-build-an-open-source-school-cloud-for-5-million-users/">View the talk page</a>.</p>
<p>This one was mainly about how ownCloud Infinite Scale was used to roll out a solution used by over a million students.</p>
<p>Brief and a bit light on the technical specifics, but still useful. I heard about ownCloud and their Infinite Scale
offering before
and was curious about it due to the alleged performance improvements, but never gave it much thought because the most of
the community backing seems to be behind Nextcloud, and that matters a lot to me. Now I know how they achieve that
scale and it sounds interesting, might need to give it a go.</p>
<p>If you&rsquo;re wondering on a high level what components it would take to roll out such a big project, then this talk covered
that fairly well. The tooling looks a lot like what I work with at my day job.</p>
<p>The recording glitched out near the end of the talk but returned to normal by the time they got around to the Q&amp;A part.
Good questions from the audience!</p>
<p><em><strong>techtipsy rating: 8/10</strong></em>, would love to see a more in depth talk on this topic that also deals with operational
struggles and the project management challenges.</p>
<h4 id="using-code-generated-by-ai-issues-misconceptions-and-solutions">
  <a class="heading-anchor" href="#using-code-generated-by-ai-issues-misconceptions-and-solutions">Using code generated by AI: issues, misconceptions and solutions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1953-using-code-generated-by-ai-issues-misconceptions-and-solutions/">View the talk page</a>.</p>
<p>A short and good intro into the world of AI and how it interacts with copyright law. Comparing audio file formats to AI
models from the copyright perspective was a brilliant comparison to make.</p>
<p>I&rsquo;m pretty sure now that most AI models are trained on copyrighted works. Hope the markets don&rsquo;t notice that.</p>
<p><em><strong>techtipsy rating: 9/10</strong></em>, easy listening, well-spoken speaker and I learned something new from an area that I don&rsquo;t
usually follow that closely.</p>
<h4 id="streamlining-developer-experience-the-power-of-cicd-standardization-and-interoperability">
  <a class="heading-anchor" href="#streamlining-developer-experience-the-power-of-cicd-standardization-and-interoperability">Streamlining Developer Experience: The Power of CI/CD Standardization and Interoperability<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2964-streamlining-developer-experience-the-power-of-ci-cd-standardization-and-interoperability/">View the talk page</a>.</p>
<p>Speaker starts with a mention of having used AI to generate some work in the slides, which is a fun point to make when
the last talk I watched was related to AI and copyright. They were a bit of a distraction though as my mind automatically
wandered to detecting AI anomalies in those images (there were plenty of those).</p>
<p>This one covers a lot of what is needed to provide a good developer experience so that your developers can better
focus on their core objectives. It was more of a high-level overview of the principles and examples of tooling that
support these. Most of what was covered sounded familiar so I guess that part of my day job isn&rsquo;t in shambles.</p>
<p>Never knew that Backstage could integrate with CI/CD pipelines.</p>
<p>Some minor audio glitches in recording. Not a dealbreaker.</p>
<p><em><strong>techtipsy rating: 6/10</strong></em>, AI-generated imagery was more of a distraction for me; would have loved to hear more about
the technical specifics or case studies where these types of improvements have been made.</p>
<h4 id="stopping-all-the-attacks-before-they-start-building-a-security-first-api">
  <a class="heading-anchor" href="#stopping-all-the-attacks-before-they-start-building-a-security-first-api">Stopping all the attacks before they start: Building a security-first API<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2352-stopping-all-the-attacks-before-they-start-building-a-security-first-api/">View the talk page</a>.</p>
<p>Simple overview of what it takes to build an API that&rsquo;s reasonably secure.</p>
<p>Unsurprisingly, the focus is on the very basics: validate your input, add authentication that works, check if the user
is authorized to perform the actions and monitor and log your system. Speaker also emphasizes the importance of having a
threat model because how else would you know who and what to protect against?</p>
<p>My career has shown that implementing the basics will get you very far towards having a secure system. If you ignore the
basics, you will pay the price (and don&rsquo;t forget about the accrued technical debt!).</p>
<p><em><strong>techtipsy rating: 8/10</strong></em>, covers basic topics, but that&rsquo;s the whole point since our industry can&rsquo;t even get those
right.</p>
<h4 id="observations-on-a-dnssec-incident-the-russian-tld">
  <a class="heading-anchor" href="#observations-on-a-dnssec-incident-the-russian-tld">Observations on a DNSSEC incident: the russian TLD<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3740-observations-on-a-dnssec-incident-the-russian-tld/">View the talk page</a>.</p>
<p>My interest in this one was mainly about the actual real-life reported Internet outages in Russia that occurred shortly
before FOSDEM. There was a lot of speculation and this talk covered the whole event really nicely, calling out the
baseless claims by random people on the Internet. The speaker then proceeded to show what actually happened and
showcased <a href="https://dnsviz.net/">DNSViz</a>, which was very helpful in visually showing what went wrong with the <code>.ru</code> top
level domain.</p>
<p><em><strong>techtipsy rating: 9/10</strong></em>, the session was short but sweet, the speaker cracked a few laughs from the audience and
a technical topic got presented in an understandable way.</p>
<h4 id="open-source-in-2024-boundaries-burnout-business">
  <a class="heading-anchor" href="#open-source-in-2024-boundaries-burnout-business">Open Source in 2024: boundaries, burnout, business<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2029-open-source-in-2024-boundaries-burnout-business/">View the talk page</a>.</p>
<p>Great talk that covers the human side of open source. While this talk is more focused on the open source perspective,
a lot of the recommendations here are also applicable to software developers in general. A lot of focus is put on
setting boundaries, which is great.
This talk complements <a href="https://fosdem.org/2024/schedule/event/fosdem-2024-1931-you-too-could-have-made-curl-/">this one by Daniel Stenberg of <code>curl</code> fame</a>
so give that one a watch as well!</p>
<p>I like how the speaker added links to their blog to various slides that cover the topic in question in depth. My reading
list got a bit longer again.</p>
<p>During the Q&amp;A there was an interesting idea mentioned: <em>the human user guide</em>, which as far as I understood is a
document that covers everything you&rsquo;d need to know about the person you&rsquo;re working with. Things like &ldquo;you should know X
about me&rdquo;, &ldquo;it makes me happy when my colleagues do Y&rdquo;, &ldquo;it makes me sad when someone does Z&rdquo;. It sounds like something
that can backfire if implemented poorly, but it&rsquo;s an interesting concept.</p>
<p><a href="https://fosdem.org/2024/events/attachments/fosdem-2024-2029-open-source-in-2024-boundaries-burnout-business/slides/22591/Open_Source_-_boundaries_burnout_business_jSoCbxc.pdf">The slides</a>
seem to be missing from the recording so I recommend that you open them up in a separate window.</p>
<p><em><strong>techtipsy rating: 10/10</strong></em>, great speaker covering important topics that many software developers unfortunately learn
by first-hand experience, myself included.</p>
<h4 id="power-profiling-my-entire-house-with-the-firefox-profiler">
  <a class="heading-anchor" href="#power-profiling-my-entire-house-with-the-firefox-profiler">Power profiling my entire house with the Firefox Profiler<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2723-power-profiling-my-entire-house-with-the-firefox-profiler/">View the talk page</a>.</p>
<p>A nice story about a software developer from Mozilla deciding to measure all things electrical in their home, and why
they decided to use the Firefox Profiler to visualize it.</p>
<p>This one is relevant to my interests because I run some smart plugs at home and collect all that data for display in
Grafana. A lot of the observations that the speaker made about devices consuming power sound similar to the ones I&rsquo;ve
made over the past month or so.</p>
<p>This one also contains a few tech tips for new parents who are also software developers. Unexpected, but a welcome
addition.</p>
<p>Some small audio disruptions in the recording. Not a dealbreaker.</p>
<p><em><strong>techtipsy rating: 10/10</strong></em>, interesting topic, slides are structured well, talk contains actionable advice, and it
makes me want to measure absolutely everything at my home even more.</p>
<h4 id="so-you-think-you-know-git">
  <a class="heading-anchor" href="#so-you-think-you-know-git">So you think you know Git<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-3611-so-you-think-you-know-git/">View the talk page</a>.</p>
<p>If you know <code>git</code> basics, then this one will be really useful as it covers lots of <code>git</code> features and functionality that
you might not even be aware of.</p>
<p>I mainly use <code>git</code> via IntelliJ GUI nowadays due to the ease of use, but I now know what it is probably doing in the
background to achieve those results, especially when it comes to checking who wrote that awful piece of crap soluti- oh,
it was me back in 2021.</p>
<p><em><strong>techtipsy rating: 10/10</strong></em>, speaker is very enthusiastic, lots of good tech tips and I learned something!</p>
<h4 id="magic-and-software">
  <a class="heading-anchor" href="#magic-and-software">Magic and Software<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h4>
<p><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2332-magic-and-software/">View the talk page</a>.</p>
<p>Not even going to spoil this one, just go watch it.</p>
<p><em><strong>techtipsy rating: 10/10</strong></em>, magic magic magic.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I <em><strong>loved</strong></em> FOSDEM 2024.</p>
<p>My expectations were high based on what I heard before, and it still exceeded them!
The occasional technical issues weren&rsquo;t a dealbreaker, there was generally plenty of room in the sessions
(at least those I went to), and both the content and the people were great.</p>
<p>I felt at home, surrounded by people with whom I have similar interests. It&rsquo;s not an environment I find myself in
often, even at work, which is why FOSDEM felt so special.</p>
<p>Next time I&rsquo;ll try to take part in more community events if possible, talk to people and leave some time for sightseeing
in Brussels.</p>
<p>I&rsquo;d like to thank my employer <a href="https://concise.ee/">Concise Systems</a> for paying for travel and accommodation.</p>
<p>Special thanks go to <a href="https://zirk.me/">my friend Arti</a> who introduced me to FOSDEM in the first place and helped make
my
first FOSDEM a memorable one.</p>









<figure class="center">
  <a href="/posts/2024/02/12/fosdem-2024/media/fosdemgang.jpg">
    <img src="/posts/2024/02/12/fosdem-2024/media/fosdemgang_hu_786b1fe11e12ad4e.webp"
     width="981"
     height="800"
     loading="lazy"
     decoding="async"
     alt="FOSDEM gang.">

  </a>
  <figcaption class="center">FOSDEM gang.</figcaption>
</figure>

]]></content:encoded></item><item><title>My cat water fountain comes with a spicy USB power adapter</title><link>https://ounapuu.ee/posts/2023/12/19/spicy-usb-adapter/</link><pubDate>Tue, 19 Dec 2023 14:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/12/19/spicy-usb-adapter/</guid><description>It turns out that you can't trust any USB type A power adapter to be within spec.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/12/19/spicy-usb-adapter/media/cover_hu_fcf88f3f7c17bdbd.jpg" width="1200" height="630" alt="My cat water fountain comes with a spicy USB power adapter" /><p>It turns out that you can&rsquo;t trust any USB type A power adapter to be within spec.</p>
<p>I have a <a href="https://www.catit.com/products/drinking-fountains/flower-fountain/">Catit Flower Fountain</a>
for my two adorable cats. The idea of a water fountain for cats may sound odd,
but having one really helps with cats staying hydrated and that alone avoids all
sorts of health issues.</p>
<p>At one point I wanted to see if I could create a sort of a DIY UPS for the water fountain. It would be quite bad if I
was at work and a power outage results in cats not being able to drink water (they don&rsquo;t really care for normal water
bowls after getting the fountain). I had some battery banks available for testing, and I noticed that the pump for the
water fountain is powered over a USB type A cable.</p>
<p>Should be easy, right?</p>
<p>Apparently not.</p>
<p>I tried multiple different power banks between the water fountain and the
USB power adapter that came with it, and all of them would work for a bit
and turn off after some time. I didn&rsquo;t think much of it back then, but I did
notice that two of the power banks I used started glitching out during
normal use elsewhere.</p>
<p>Months later, I attached an IKEA power strip to the side of my work desk
to make charging various things easier. It also has two USB type A ports and the
water fountain was near the desk temporarily, so I plugged it in there. It worked,
but I noticed that the water fountain was quieter now, the &ldquo;hum&rdquo; that it makes
was almost gone. That made me curious, so I used the original adapter again
and the &ldquo;hum&rdquo; was there again.</p>
<p>I took a look at the original power adapter specs to see if there&rsquo;s a difference
in the amount of current that these two different USB power sources provide.
What I discovered instead was that the power adapter that comes with the fountain
outputs a solid <em><strong>7.5V</strong></em>. I measured the voltage with my multimeter as well,
and it reports <em><strong>7.71V</strong></em>. USB type A ports typically provide about 5V, with a maximum
of 5.25V from my observations in the real world.</p>









<figure class="center">
  <a href="/posts/2023/12/19/spicy-usb-adapter/media/image0.jpg">
    <img src="/posts/2023/12/19/spicy-usb-adapter/media/image0_hu_11377618365e531c.webp"
     width="954"
     height="595"
     loading="lazy"
     decoding="async"
     alt="Yikes.">

  </a>
  <figcaption class="center">Yikes.</figcaption>
</figure>

<p>7.5V over USB type A is <em>probably</em> not safe with other devices, especially since a normal person
only sees a USB port on the adapter and thinks that it is perfectly safe to use
it to charge their phone or other devices. Yes, properly implemented USB type <em><strong>C</strong></em>
ports can negotiate all sorts of voltages, but this is not one of them.</p>
<p>Probably explains why my power banks are acting odd now and glitching out.</p>
<p>This is why I have trust issues.</p>
<h2 id="2023-12-19-update">
  <a class="heading-anchor" href="#2023-12-19-update">2023-12-19 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>By popular demand, here are the two adorable cats.</p>









<figure class="center">
  <a href="/posts/2023/12/19/spicy-usb-adapter/media/cats.jpg">
    <img src="/posts/2023/12/19/spicy-usb-adapter/media/cats_hu_4e3ddb6741f64f98.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Tux and Põssa. Põssa can be roughly translated to &#34;Piggy&#34; in English. I&#39;ll let you guess how he got that name.">

  </a>
  <figcaption class="center">Tux and Põssa. Põssa can be roughly translated to &#34;Piggy&#34; in English. I&#39;ll let you guess how he got that name.</figcaption>
</figure>

]]></content:encoded></item><item><title>Control - how to make a game enjoyable for casual audiences</title><link>https://ounapuu.ee/posts/2023/12/01/control/</link><pubDate>Fri, 01 Dec 2023 10:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/12/01/control/</guid><description>How one toggle in the game settings allowed me to enjoy a notoriously difficult game.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/12/01/control/media/cover_hu_41d463d98ad86107.jpg" width="1200" height="630" alt="Control - how to make a game enjoyable for casual audiences" /><p>I&rsquo;ve decided to intentionally take more time to play video games this year,
since it&rsquo;s a relatively healthy way to escape from the real world once in a while.
A friend recommended one game in particular: <a href="https://store.steampowered.com/app/870780/Control_Ultimate_Edition/">Control: Ultimate Edition</a>.
During the Steam summer sale of 2023, I went ahead and bought it.</p>
<p>I have liked it more than I expected to.</p>









<figure class="center">
  <a href="/posts/2023/12/01/control/media/image-1.png">
    <img src="/posts/2023/12/01/control/media/image-1_hu_d724be4b207d0278.webp"
     width="408"
     height="84"
     loading="lazy"
     decoding="async"
     alt="And I&#39;m not even done with the game!">

  </a>
  <figcaption class="center">And I&#39;m not even done with the game!</figcaption>
</figure>

<p>What prompted me to cover this game wasn&rsquo;t the captivating story, the sheer amount
of content available in the Ultimate Edition of the game, or the wild action
that you can find yourself in, it&rsquo;s much more simple than that.</p>
<p>In short, Control provides you with &ldquo;Assist mode&rdquo;, a set of options that allow
you to adjust the high difficulty of the game. This includes settings that help lock on to enemies,
which is great for players using controllers. There are also sliders to adjust
the recovery rate of various resources and even a one-hit kill mode.</p>
<p>My favourite of all of these is the immortality toggle.</p>









<figure class="center">
  <a href="/posts/2023/12/01/control/media/image-2.jpg">
    <img src="/posts/2023/12/01/control/media/image-2_hu_d67d5bdbcf86f8dc.webp"
     width="1280"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Assist mode options in Control.">

  </a>
  <figcaption class="center">Assist mode options in Control.</figcaption>
</figure>

<p>I don&rsquo;t take time to play video games to add more stress to my life. I work with
legacy software that falls over in novel ways almost weekly at this point, there&rsquo;s
too much stress in my life already. I like a
good challenge once in a while, but in most cases I play games to have fun. I&rsquo;m
also a fan of great stories, and many great stories are told via the medium of
video games. I&rsquo;d hate to miss out on those experiences due to the game being
too difficult or making me feel frustrated.</p>
<p>In the case of Control, the immortality toggle was what allowed me to relax,
follow the story with great interest, and feel like a <em><strong>god</strong></em> that kept
<em>yeeting</em> exploding forklifts at various enemies with explosive gun shots
sprinkled inbetween. There were still some challenging parts in the game even
with immortality in place, but they did not cause me to feel stressed out or
get frustrated with the game.</p>
<p>This one simple toggle is probably the sole reason why this game has become one
of my all-time favourites.</p>
<p>I&rsquo;m sure that there are people out there who disagree with the view that games
should always be easy or enjoyable. I don&rsquo;t care. I play games for myself, not
to be validated by some bozo on the internet.</p>
<p>While writing this post, I looked around the internet to see what others think
of Control and its difficulty, and what caught my eye were numerous results
discussing the difficulty of the game. I was also happy to see that <a href="https://www.wired.com/story/casual-gamer-control-easy-mode-wait/">there are
others out there who agree with me</a>
(or more precisely I agree with them). I found it surprising that the &ldquo;Assist mode&rdquo;
was added to the game a year after its release. Guess it pays off to be a patient
gamer.</p>
<p>Perhaps all of this explains why I had such a blast playing GTA San Andreas as
a teenager. Cheats like <code>HESOYAM</code> and <code>AEZAKMI</code> are still hardwired in my brain
since I used them a lot, and they allowed me to wreak havoc in-game and not have
to worry about getting stuck at an annoyingly difficult mission.</p>
<p>Hats off to Remedy Entertainment for adding the assist mode, I really appreciate it.</p>
<p>Oh, and the game works well on the Steam Deck. Great job!</p>
]]></content:encoded></item><item><title>The optimization treadmill: why I keep changing my computing setup all the time</title><link>https://ounapuu.ee/posts/2023/10/25/the-optimization-treadmill/</link><pubDate>Wed, 25 Oct 2023 10:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/10/25/the-optimization-treadmill/</guid><description>A short explanation about what drives me to experiment with new hardware setups in my self-hosting hobby.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/10/25/the-optimization-treadmill/media/cover_hu_8818061f304a9396.jpg" width="1200" height="630" alt="The optimization treadmill: why I keep changing my computing setup all the time" /><p>I have a bad habit of changing my computing setups all the time. I tend to see new gear, then I get
some new ideas, and then I obsessively think about it for weeks and months until I just buy it.
And then the cycle repeats.</p>
<p>I&rsquo;ve had time to think about why that keeps happening and I think I&rsquo;ve got it.</p>
<p><em><strong>I keep changing the goals, constantly,</strong></em> and with that I kept optimizing my
setup in a different direction every time.</p>
<p>This post also serves as a way to explain <a href="/posts/2023/10/09/zimaboard/">my thought process behind my last post about the Zimaboard</a>,
since my writing may not have been clear enough on that point, or some of you just can&rsquo;t read.</p>
<h2 id="the-treadmill">
  <a class="heading-anchor" href="#the-treadmill">The treadmill<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>It all started with the first step in my self-hosting adventure. I had a 1TB WD external hard drive that was a single copy
of all my important files, which is less than ideal if you want to preserve your data.
My goal became to have another redundant copy of the storage, so I built a server from old PC parts and
used hard drives, all running ZFS, and hosted in a room where loud PC-s were more of a norm.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-1.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-1_hu_25c122b165ff26a8.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="First actual server setup that I had.">

  </a>
  <figcaption class="center">First actual server setup that I had.</figcaption>
</figure>

<p>After that setup moved to my rented apartment, I discovered that having a buzzing tower of 8 hard drives
(that was an upgrade I later made) consumes
a lot of power and is also unbearable when you&rsquo;re trying to sleep in the same room.
My goal became to reduce the noise and the power consumption, so I upgraded to a Ryzen 2000-series based setup
and at least two WD Red 4TB hard drives. It was quieter, faster and more power efficient compared to the previous setup.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-2.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-2_hu_5657a28acdf54d9.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Fun fact: one of the WD Red drives died and had to be replaced through warranty. ">

  </a>
  <figcaption class="center">Fun fact: one of the WD Red drives died and had to be replaced through warranty. </figcaption>
</figure>

<p>Then I discovered that laptops use even less power than that. A ThinkPad X230 I had around used less than 10 watts
when idling, and it just so happened that I had one to play around with.
My goal became to reduce the power consumption of my home server setup even more.
I ended up putting my storage on two
4TB WD Red hard drives connected over USB 3.0 and running my home services off of that ThinkPad.</p>
<p>Soon after that, I discovered that having a cat around USB-connected storage running <code>btrfs</code> is a really bad idea.
There was data loss, but luckily nothing I could not replace. My goal became to have a low power setup that was more
cat-proof and did not rely on USB-based storage. That&rsquo;s how I ended up with a TerraMaster F2-221.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-3.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-3_hu_7a22da10ddae38cf.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Meet Tux, the data loss queen. Hopefully makes up for the fact that I don&#39;t have a 
picture of those two setups.  ">

  </a>
  <figcaption class="center">Meet Tux, the data loss queen. Hopefully makes up for the fact that I don&#39;t have a 
picture of those two setups.  </figcaption>
</figure>

<p>Damn, these hard drives sure are loud in that NAS! I also discovered that some external 2.5&quot; hard drive enclosures
can be opened up to reveal 2.5&quot; 15mm SATA hard drives in up to 5TB capacities.
<a href="/posts/2020/08/29/what-running-out-of-sata-ports-looks-like/">And you can plop those onto a PCIe card, for some reason.</a>
And I really liked the Thermaltake Core V1 and SSD-s for certain types of storage.
My goal became to build a really cool and performant server that housed both hard drives and SSD-s, because why not?</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-4.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-4_hu_6a6e46bf345af9ea.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="RGB-powered server.  ">

  </a>
  <figcaption class="center">RGB-powered server.  </figcaption>
</figure>

<p>Oh, wait, no, that thing uses a lot of power and a ThinkPad T430 became available in my computing fleet.
I probably got a good deal on some 8TB hard drives around this time as well.
My goal became having a lot of storage around while also using less power, and having it all
as cat-proof as possible. That&rsquo;s how a ThinkPad T430 ended up being a home server.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-5.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-5_hu_7e083d43ceb10ec.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Embrace the jank.">

  </a>
  <figcaption class="center">Embrace the jank.</figcaption>
</figure>

<p>Oh, crap, that ThinkPad kept overheating because the CPU in it was a bit too much at higher loads!
My goal became to find a suitable replacement that did not use a lot of power.
Luckily I heard about the concept of <a href="https://www.servethehome.com/introducing-project-tinyminimicro-home-lab-revolution/">TinyMiniMicro</a>
and got myself a Lenovo ThinkCentre M73 Tiny.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-6.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-6_hu_e5e6ff1adfec4343.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The original TinyMiniMicro setup. ">

  </a>
  <figcaption class="center">The original TinyMiniMicro setup. </figcaption>
</figure>

<p>Damn, those hard drives sure are noisy, apparently due to WD running those at 7200rpm.
My goal became to silence those hard drives as much as possible. I got a lot of acoustic foam, and what ended up working
was to stack the drives horizontally, and add some foam between the pieces, that got rid of the humming. I also
added a fan to keep the drives from overheating.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-7.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-7_hu_4f0d8b9faae28e72.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The TinyMiniMicro setup with some foam. I added the fan later. ">

  </a>
  <figcaption class="center">The TinyMiniMicro setup with some foam. I added the fan later. </figcaption>
</figure>

<p>Hold on, the Raspberry Pi 4 is allegedly usable as a home server now? And it uses even less power when idling?
My goal then became to have a server setup that has a single-digit idle power consumption, meaning less than 10 watts.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-8.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-8_hu_b0ee93544c6e437a.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The Raspberry Pi 4 that I did testing with. ">

  </a>
  <figcaption class="center">The Raspberry Pi 4 that I did testing with. </figcaption>
</figure>

<p>Unfortunately I could not get the software part running right, the setup would freeze due to unknown reasons. At least
<a href="/posts/2021/02/01/how-to-fix-zfs-pool-not-importing-at-boot/">I wrote a post about troubleshooting ZFS issues</a>
as part of this run, and Google keeps recommending it to people according to Google Search Console data.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/screenshot-google.png">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/screenshot-google_hu_241a457ed5f6ce17.webp"
     width="933"
     height="800"
     loading="lazy"
     decoding="async"
     alt="If Google keeps recommending it, then I guess it&#39;s useful to people. ">

  </a>
  <figcaption class="center">If Google keeps recommending it, then I guess it&#39;s useful to people. </figcaption>
</figure>

<p>Alright, I can&rsquo;t make the setup more efficient. Hold on, I also have a desktop PC, and that also consumes power when
idling. That seems wasteful. My goal became to do my computing all on one machine, filling the roles of a server,
workstation and gaming PC all at the same time. <a href="/posts/2021/05/23/self-hosting-endgame/">And I did it, and wrote a post about it as well!</a></p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-9.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-9_hu_3ea578e613d1eec1.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The all-in-one setup. ">

  </a>
  <figcaption class="center">The all-in-one setup. </figcaption>
</figure>

<p>Spoiler alert: it was in fact <em>not</em> the end-game of my setup, because I soon discovered that having everything on the
same PC requires quite a special setup, and a reboot on the host OS affects all the other use cases. If you care about
uptime, then it&rsquo;s probably better to have separate machines for all of that. I didn&rsquo;t want to give up on the idea of virtualized
setups just yet, and thus my goal became to have one PC for my server and gaming needs. Games need storage, lots of it.
My server has lots of storage. Makes sense, right?</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-10.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-10_hu_96cab6cd6b670713.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The heart of the new setup: ASRock X570M Pro4 motherboard.  ">

  </a>
  <figcaption class="center">The heart of the new setup: ASRock X570M Pro4 motherboard.  </figcaption>
</figure>

<p>After using that setup, <a href="/posts/2021/12/29/vr-vfio-latency/">I discovered that VR and virtualized gaming don&rsquo;t mix that well.</a>
Damnit. Oh, hey, I have all these SSD-s now from that experiment, and if I shrink my data needs a bit, I could
fit it all on a mirrored setup of two 4TB SSD-s, and they don&rsquo;t use much power as well. That opened up a
lot of possibilities regarding my next setup because a lot of small PC-s can handle two SATA SSD-s just fine.
My goal became to build a silent and efficient home server. <a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">This resulted in the ASRock Deskmini X300 setup.</a></p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-11.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-11_hu_240437cee7dcdc08.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Look how tiny it is!">

  </a>
  <figcaption class="center">Look how tiny it is!</figcaption>
</figure>

<blockquote>
<p>I’m hoping that the current DeskMini-based server configuration is the one that will last me a while.</p>
</blockquote>
<p>That aged well.</p>
<p>I had a ThinkPad T430 lying around, and now that my storage needs were served by two 4TB SSD-s, I could
finally do that <a href="/posts/2020/08/22/stupid-project-ideas-1/">one stupid idea from 2020</a>.
I also dislike knowing that I have perfectly good hardware sitting in a box and collecting dust.
My goal then became to use
my ThinkPad T430 as a low-power, silent and efficient home server.
<a href="/posts/2022/05/10/thinkpad-as-a-home-server/">It was successful.</a>
<a href="/posts/2023/01/27/thinkpad-as-server-followup/">Or at least mostly successful.</a></p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-12.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-12_hu_60bcdba190871e52.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The ThinkPad T430 as a server.">

  </a>
  <figcaption class="center">The ThinkPad T430 as a server.</figcaption>
</figure>

<p>But the search for that elusive combination of low power consumption, adequate performance, stability, resilience and silence
was not over. My blog gained traction from time to time and it would be really embarrassing if an overheated
laptop or a longer power outage resulted in an outage. You see, the ThinkPad was good as a server, but it
still overheated under specific conditions and once the battery runs out, the &ldquo;Power on with AC attach&rdquo; functionality
does not work, which is quite bad for a server. My goal became to find that elusive solution.</p>
<p>I tried the LattePanda V1 since I got it for a good price. <a href="/posts/2023/02/28/lattepanda-v1/">Didn&rsquo;t work out for my use case, sadly.</a>
The website situation got solved with moving that portion of my
self-hosting setup to <a href="/posts/2023/03/26/hosted-on-kspace/">k-space hosting</a>, leaving me to do further experiments
without affecting my lovely website that much.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-13.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-13_hu_fce367b478e69d94.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The LattePanda test setup.">

  </a>
  <figcaption class="center">The LattePanda test setup.</figcaption>
</figure>

<p>After keeping my eyes open for various options, <a href="/posts/2023/10/09/zimaboard/">the Zimaboard was the one that finally won.</a>
Silent. Meets my storage, networking and performance requirements. Small. Super low power usage. x86 based so I know my stuff
runs on it well. It&rsquo;s not perfect, but it did all of those things.</p>









<figure class="center">
  <a href="/posts/2023/10/25/the-optimization-treadmill/media/setup-14.jpg">
    <img src="/posts/2023/10/25/the-optimization-treadmill/media/setup-14_hu_263feac6bc54aaa1.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Hopefully this one sticks.">

  </a>
  <figcaption class="center">Hopefully this one sticks.</figcaption>
</figure>

<p>And there you have it, the reason why I have written over half of these blog posts, and why my setup just keeps changing
and depleting my wallet at the same time.</p>
<p>Let&rsquo;s be honest, I&rsquo;m sure that as soon as I find something
exciting in the tech world to play around with, I&rsquo;m probably going to try it out. Some call it <em>passion</em>, I call it
<em>lack of fiscal responsibility</em>.</p>
<p><em><strong>Free tech tip</strong></em> to those starting out in self-hosting: experimentation
is really fun, but it&rsquo;s easy to lose focus and get carried
away with changing your setup all the time. You can do a lot with much less
hardware than you think, so try to approach building a minimum viable home server
setup first and upgrade only if absolutely necessary. In my experience it&rsquo;s just as fun
and probably much cheaper as well.</p>
]]></content:encoded></item><item><title>My trip to the Communication and Laptop Museum in Estonia</title><link>https://ounapuu.ee/posts/2023/09/19/trip-to-communication-laptop-museum/</link><pubDate>Tue, 19 Sep 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/09/19/trip-to-communication-laptop-museum/</guid><description>I ended up going to a small museum run by a passionate enthusiast in the beautiful countryside of south-east Estonia while on vacation, here are my notes on it.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/09/19/trip-to-communication-laptop-museum/media/cover_hu_6e8961586cf333b2.jpg" width="1200" height="630" alt="My trip to the Communication and Laptop Museum in Estonia" /><p>While on vacation I went on a small road-trip across Estonia. During the second half of the trip I ended up being in Võrumaa,
and while driving I suddenly remembered a random fact that some people mentioned in a hackerspace Slack channel: there&rsquo;s
a new museum around here!</p>
<p><a href="https://vorumaateataja.ee/koik-uudised/uudised/31199-marko-koemets-avas-laupaeval-oma-hallimae-talus-side-ja-laptopimuuseumi">The museum was officially opened on 10th of June 2023</a>
<a href="https://menu.err.ee/1609004267/vorumaa-mees-avas-vanade-sidevahendite-naituse">(more news coverage from ERR)</a>
and when me and my wife got there, we were visitors number 96 and 97. By the time we arrived there, other visitors were
wrapping up and we were greeted by the owner of the museum.</p>
<p>The bulk of the museum lives in a small wooden house. While the building might be small, there was plenty to look at on
the inside. Old servers, mobile phones, rotary dial phones, telecommunications equipment, promotional phone company
materials from 90s and 00s, it had it all. Some of the phones were even connected together and you could make actual
calls between them.</p>









<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/promotional.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/promotional_hu_64763eae2a6caf41.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Promotional materials and actual customer support desks that used to belong to EMT (Eesti Mobiiltelefon), a telecom
company that operated since 1991.">

  </a>
  <figcaption class="center">Promotional materials and actual customer support desks that used to belong to EMT (Eesti Mobiiltelefon), a telecom
company that operated since 1991.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/promotional2.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/promotional2_hu_556466e8fc039413.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Ads used to be wild.">

  </a>
  <figcaption class="center">Ads used to be wild.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/mobilephones.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/mobilephones_hu_2a0958ca8e1be1ab.webp"
     width="504"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Lots of older mobile phones. Most of them were relevant during various parts of my childhood.">

  </a>
  <figcaption class="center">Lots of older mobile phones. Most of them were relevant during various parts of my childhood.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/bigphones.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/bigphones_hu_aaa1ced5ddb6ecf7.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Big mobile phones.">

  </a>
  <figcaption class="center">Big mobile phones.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/ipuhhonee.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/ipuhhonee_hu_a6589b1245b83fe1.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The biggest mobile phone: promotional display monitor shaped as one of the first iPhones.">

  </a>
  <figcaption class="center">The biggest mobile phone: promotional display monitor shaped as one of the first iPhones.</figcaption>
</figure>

<p>Next to the building was an actual 2G/3G tower. Not as high as the real thing, but all the equipment was there and set up.
It wasn&rsquo;t connected or operating for obvious reasons, but still, pretty cool to look at. So cool that I forgot to take
a picture of it.</p>
<p>There were a bunch of old payphones lined up near the museum building. If I remember correctly, one of those was connected
up to the other phones inside. Now these were a blast from the past, I remember seeing these payphones all over Tallinn
during 2000s, didn&rsquo;t use them much myself though. The payphones also contained examples of plastic cards that you had to
use to be able to use the payphone. Those had all sorts of wild designs so there was plenty of opportunity for personalization.</p>









<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/payphone.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/payphone_hu_d584bb92227082d1.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Payphone with various pay cards present behind a plastic shield.">

  </a>
  <figcaption class="center">Payphone with various pay cards present behind a plastic shield.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/hellothere.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/hellothere_hu_91bb371ad1e9257c.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Party like it&#39;s 1999.">

  </a>
  <figcaption class="center">Party like it&#39;s 1999.</figcaption>
</figure>

<p>The yard contains a selection of signs from telecom companies over the years. Those used to live on the outside of buildings
or within shopping centers.</p>









<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/signs.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/signs_hu_8d16babd029cba17.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="You can see when the rebranding started and evolved.">

  </a>
  <figcaption class="center">You can see when the rebranding started and evolved.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/signs2.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/signs2_hu_255a646a4d631ad5.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The signs are bigger than you realize when you get closer to them.">

  </a>
  <figcaption class="center">The signs are bigger than you realize when you get closer to them.</figcaption>
</figure>

<p>The highlight of the museum for me was the owner and maintainer, Marko Koemets. It&rsquo;s clear from the way he speaks that
he is passionate about communications equipment and technology in general. With each exhibition he always had interesting
stories to share, either about the equipment on display or the history of Estonian telecommunications starting from the
90s. I won&rsquo;t spoil any of those here, you&rsquo;ll have to visit and hear them first-hand.</p>
<p>He also shared some future plans with the museum. If there are enough donations, then the museum
is going to expand with a second building dedicated to old laptops. The owner has 600+ laptops waiting to be shown off.</p>
<p>If you ever find yourself in south-east Estonia and you&rsquo;re interested in this type of tech, then do give this place a visit.
Details about opening times, prices and contact information can be found on
<a href="https://www.lanec.eu/english.htm">this lovely appropriately themed website.</a></p>
<p>If you can&rsquo;t make it there physically but are interested in supporting the museum, then you can make donations to the bank account
listed on the website. <a href="https://www.lanec.eu/tasutaannetajad.htm">You&rsquo;ll also get a mention on the website!</a>
There&rsquo;s also merch that you can buy on-site to support the museum.</p>









<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/merch.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/merch_hu_90c5f48d1e20ad8a.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Ultra limited edition &#34;Side ja laptopi muuseum&#34; mug. Inside are some pens, two of them belonging to a telecommunications
company EMT. ">

  </a>
  <figcaption class="center">Ultra limited edition &#34;Side ja laptopi muuseum&#34; mug. Inside are some pens, two of them belonging to a telecommunications
company EMT. </figcaption>
</figure>

<p>I recommend checking the website and details about the opening times before planning a visit. At the time of writing
you need to call ahead to set up a visit. It&rsquo;s definitely worth the effort and after the visit you can explore south
Estonia, <a href="https://www.visitestonia.com/en/where-to-go/south-estonia">there&rsquo;s plenty to see and do there.</a></p>
<h2 id="2025-july-update">
  <a class="heading-anchor" href="#2025-july-update">2025 July update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>We happened to be in south-east Estonia again and decided to visit the museum one more time.</p>
<p>The timing was unfortunate:
<a href="https://news.err.ee/1609744110/friday-storms-knock-out-power-to-thousands-more-outages-likely-saturday">a huge storm the night before knocked out the power for about 15 000 households in Estonia</a>,
and the museum was hit as well. This meant that the phones on the exhibition didn&rsquo;t work, and you had to use a
flashlight to get a good look at the exhibition, but the owner of the museum was as cheerful as always and shared some
background on the exhibitions.</p>
<p>The backside of the house was now under construction, with an expansion of the museum building being worked on.</p>
<p>This time I didn&rsquo;t forget to take a picture of the cell tower. :)</p>









<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/2025-update-2.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/2025-update-2_hu_8f50485a0f47aaa.webp"
     width="601"
     height="800"
     loading="lazy"
     decoding="async"
     alt="The cell tower in all its glory.">

  </a>
  <figcaption class="center">The cell tower in all its glory.</figcaption>
</figure>

<p>I also saw an ad and an informational pamphlet about the museum, which is a nice addition and makes discoverability
better.</p>









<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/2025-update-0.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/2025-update-0_hu_138d5e9a16c5a06d.webp"
     width="601"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Small informational pamphlet, found in Eesti Maanteemuuseum, which is also a fantastic place to visit.">

  </a>
  <figcaption class="center">Small informational pamphlet, found in Eesti Maanteemuuseum, which is also a fantastic place to visit.</figcaption>
</figure>










<figure class="center">
  <a href="/posts/2023/09/19/trip-to-communication-laptop-museum/media/2025-update-1.jpg">
    <img src="/posts/2023/09/19/trip-to-communication-laptop-museum/media/2025-update-1_hu_64e5e413e3bf54cc.webp"
     width="1065"
     height="800"
     loading="lazy"
     decoding="async"
     alt="A larger sign in a parking lot near Suur Munamägi.">

  </a>
  <figcaption class="center">A larger sign in a parking lot near Suur Munamägi.</figcaption>
</figure>

]]></content:encoded></item><item><title>My experience at the k-space hackerspace hackathon</title><link>https://ounapuu.ee/posts/2023/08/03/k-space-hackathon/</link><pubDate>Thu, 03 Aug 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/08/03/k-space-hackathon/</guid><description>I went to the hackathon, built some useful stuff and only did stupid things about 4 times!</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/08/03/k-space-hackathon/media/cover_hu_417372bb9bfe3c4.jpg" width="1200" height="630" alt="My experience at the k-space hackerspace hackathon" /><p><a href="https://www.k-space.ee/">k-space</a> is a hackerspace in Tallinn, Estonia, and they organized
a hackathon recently. Unlike in most hackathons, in this one you could whatever you like with no
expectations about building a business or coming up with an MVP, just come on down to the space and
start working on your passion projects!</p>
<p>I had some ideas on what I could do, but a few of them would have required access to workshop tools,
for which I did not have a key. I could always get one, but was too lazy to bother with it. I looked at
<a href="https://wiki.k-space.ee/en/hackathon/2023">the list of ideas that had been written down by other hackerspace members</a> and picked
the one marked as <code>[easy]</code>:  <em>Wire up electronic lock for workshop</em>.</p>
<p>If I achieve that goal, then I don&rsquo;t have to worry about getting another key, and I could also get access to all
the workshop tooling! And since it was marked as easy, I figured that I could do it and have some time
left over for playing around with things like the laser cutter.</p>
<h2 id="impressions">
  <a class="heading-anchor" href="#impressions">Impressions<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before I get to the technical part, I&rsquo;d like to say a few words about the hackathon and the organization itself.</p>
<p>The highlight of the hackathon was the immense sense of accomplishment that I felt. I work as a software
developer at my day job, which often involves dealing with incidents, migrating services from virtual machines
to Kubernetes, and sometimes from Kubernetes to Kubernetes, and anything else that comes my way.
The issue with most software teams is that the products that you build and maintain are often disconnected
from the real world. You don&rsquo;t see the physical impact of the work that you do, and that can leave you
feeling empty. Sure, you spent days switching a service to Kubernetes, but you don&rsquo;t feel like you did anything at all.</p>
<p>During this hackathon I had the opportunity to build things with my own hands, and the door controller software doing
its thing resulted in real-life actions. You swipe the card, it beeps, and you can hear the electronic lock being
opened. That, and the opportunity to work on a project involving a Raspberry Pi and mounting it so neatly was very
satisfying.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image0.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image0_hu_61bd02bbbae6985d.webp"
     width="1200"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Software developer at work. Photo by Arti Zirk.">

  </a>
  <figcaption class="center">Software developer at work. Photo by Arti Zirk.</figcaption>
</figure>

<p>The hackathon crowd itself was not that big, hovering around 15 or so people. We even had guests from Germany who were
really helpful, great to talk with and they provided their expertise to help out wherever possible. I loved how the
collaboration worked for the rewrite of the door controller software to the Go programming language. One guy knew all about
the original software and how it works but was just learning Go, and the other guy was just visiting the space and had
extensive Go experience.</p>
<p>Although this post is mainly about my own experience and the stuff that I worked on, there were plenty of other
cool projects going on during the hackathon as well. One that I really liked due to how practical it was is <a href="https://wiki.k-space.ee/en/utilities/kegerator">&ldquo;the kegerator&rdquo;</a>
that provided cold carbonated mate tea throughout the hackathon. It lives in an old fridge and I think the execution
of it was really neat! <a href="https://youtu.be/x4Qh9MTCzQo">Here&rsquo;s the livestream recording where other projects are also covered.</a></p>
<p>There were plenty of refreshments available and I took full advantage of that because if there&rsquo;s one thing that can get
my brain working on overdrive, it&rsquo;s copious amounts of sugar and caffeinated beverages. Oh, and we got pancakes as well!
Peetri Pizza really blew it with the pizzas though, never seen pizzas that are this sad.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image1.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image1_hu_d56a9b50ed3dd9d7.webp"
     width="601"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Vibes on day 0.">

  </a>
  <figcaption class="center">Vibes on day 0.</figcaption>
</figure>

<p>There were some small issues, such as the streaming setup crapping out at the last day during the part where we presented
our work, but overall I was happy with how the hackathon turned out.</p>
<p>For future hackathons we probably need to do a bit more marketing and think about the dates more so that we can get
more enthusiasts on board. Having our German friends around really added a lot to the event and I would like to see
more knowledge-sharing between communities in the future.</p>
<h2 id="build-log">
  <a class="heading-anchor" href="#build-log">Build log<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Here&rsquo;s a rundown of what I did during the hackathon.</p>
<p><a href="https://youtu.be/x4Qh9MTCzQo?t=985">There&rsquo;s also a video where I talk about my hackathon work!</a></p>
<p>Whenever you see the name <a href="https://zirk.me">Arti</a>, then that refers to my good friend who helped out a lot during the hackathon.</p>
<h3 id="day-0">
  <a class="heading-anchor" href="#day-0">Day 0<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>The hackathon began on 27th of July at 18:00.</p>
<p><a href="https://www.youtube.com/watch?v=eZLQK60Cj3c">Everyone presented their plans</a> and then the work begun.</p>
<p>I used the first evening to put together a rough plan and figure out what needs to be done. In short, the
plan was like this:</p>
<ul>
<li>buy some quick splice terminals</li>
<li>assemble the Raspberry Pi with the custom HAT that is used to interact with the card reader and electronic door lock</li>
<li>install the card reader on the door</li>
<li>run the networking and power cables</li>
<li>connect all the cables to the Pi</li>
<li>set up the card reader software</li>
<li>test in production</li>
</ul>
<p>After taking some pictures of the door lock test setup that another participant assembled, I decided to go and rest for what&rsquo;s
to come.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image3.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image3_hu_e04dcad5c3a93216.webp"
     width="1200"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Door controller test setup. Photo by Arti Zirk.">

  </a>
  <figcaption class="center">Door controller test setup. Photo by Arti Zirk.</figcaption>
</figure>

<h3 id="day-1">
  <a class="heading-anchor" href="#day-1">Day 1<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This is the part where all the action started.</p>
<p>I began by taking stuff apart.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image4.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image4_hu_1a64de43f3ae9edb.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>After making some additional holes I ran the cable that connects to the electronic door switch. That was easy enough.</p>
<p>Then I began thinking about where the Raspberry Pi door controller setup would go. The workshop is a very
dusty place and it would probably need some kind of protection from it. The first idea was to custom design
a 3D printed case or customise an existing design, but after a short discussion and brainstorming we realized
that getting a plastic box big enough to house the Pi and all the wiring makes more sense.</p>
<p>Me and Arti set off to find something like that in the hackerspace. After going through lots of boxes and shelves,
we stumbled upon two metal boxes. Those boxes used to house some kind of security equipment and had inside
circuitry that converts 220V AC to 13.6V DC, which was ideal for our use case. It also had leads to connect
an UPS battery, which was even better!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image5.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image5_hu_945147e72f8db4e3.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Oh, and we also found this fun little thing.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image6.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image6_hu_9bd0f755b43c90a5.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Anyway, I went ahead and drilled some mounting holes for the Pi. We had M2.5 nylon screws and standoffs available
at the space, and with some assistance from Arti I learned about the wonders of countersink drill bits.</p>
<p>I really liked how the mounted Pi looked. I&rsquo;ve seen a ton of projects on YouTube and elsewhere with Raspberry Pi-s
being modded and mounted in all sorts of ways, but doing it myself felt really good, especially since I
was reusing an old metal box that had no other purpose.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image7.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image7_hu_bcd67fde930b4011.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I set up the microSD card with Raspberry Pi OS and figured that I could find it on the k-space network. However,
I then remembered that the internal network was <code>/16</code>, which made the process much longer. I did not have access
to the network switch, but I did end up getting acces to <em>a</em> Pi, it just wasn&rsquo;t the one I just set up. That was a
fun discovery.</p>
<p>I decided to go with the easy route and connect the Pi to an actual monitor and keyboard. That process ended
up being faster than scanning the network for Pi-s.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image8.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image8_hu_e71431422df0ef61.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I also added an UPS battery to the setup. It barely fit the enclosure and it had to be raised a bit so that
the lid on the box would close properly. But it worked out really well!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image9.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image9_hu_abe30aa12543d233.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>By the end of the day we also had the card reader installed on the door. We contemplated putting the reader on the other
side of the glass because the reader can read cards up to 9cm away, and quick tests showed that it would actually work,
however we had concerns about mounting it that way, and it would look a bit too janky even by k-space standards.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image10.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image10_hu_932489d20a35046e.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<h3 id="day-2">
  <a class="heading-anchor" href="#day-2">Day 2<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>Day 2 started with me trying to figure out how to run the cables. Making a suitably sized CAT5e cable was easy and
it worked on the first try and drilling a hole through plywood was also simple, but when trying to figure out how to
run the power I ran into a bit of trouble. There was very little room in the junction point that I intended to use, and
when my brain shorted out I asked Arti for some help (again). He figured out a way to run the additional cable while not
interfering with the power cables that ran to the light fixtures.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image11.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image11_hu_54326914815c4fce.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="In hindsight, that first aid kit didn&#39;t really have anything that would help with an electricity-related accident.">

  </a>
  <figcaption class="center">In hindsight, that first aid kit didn&#39;t really have anything that would help with an electricity-related accident.</figcaption>
</figure>

<p>Due to the way we decided to run the card reader cables, we had to extend the cable that comes from the card reader.
For that I used a CAT5e cable and some quick splices. I later learned that using your thumb power alone is not enough to
splice cables, you actually need to push them all the way in with plyers. Once that was figured out, me and Arti
installed a very professional looking cable cover involving a random piece of plastic tube, zipties and screws.
Not that I needed the help, Arti was just working on porting some Python code to Golang and wanted a break. He ended
up making a lot of breaks, not sure what that says about the learning curve of Golang.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image12.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image12_hu_f41214ba834d1d6e.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Now came the difficult part. I had to wire up everything to the Raspberry Pi without breaking anything. I had the photos
I took on day 0, but in hindsight they were not that great since I had trouble figuring out what went where. Luckily
another door controller in the space had a similar setup and I could use that as a reference point.</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image13.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image13_hu_d3ba65c2fc38a4d6.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>The Raspberry Pi HAT gets 12V input power, some of that is passed to the door controller, and then we have two leads
that are connected to both the door controller and the electronic lock. If someone swipes their card and they have access to
that particular door, the card reader light
goes green and 12V is applied to the electronic door lock, making it open it. There&rsquo;s software that controls it, but
I did not have to worry about that too much because two other hackathon participants were working on that.</p>
<p>I had Arti check the cabling before the initial test and after a hesitant go-ahead from him we powered it on. The Pi
powered on, but the card reader was not doing anything. It was supposed to do a few beeps and show a red light. Uh-oh.
That&rsquo;s when Arti reviewed the quick splices that I used and pointed out that they were not pushed all the way in. After
using brute force (pliers), we powered it on again and it worked!</p>
<p>The rest of the evening was spent testing out the card reader software that was being ported. That revealed a few issues,
but <a href="/posts/2023/08/03/k-space-hackathon/media/dooropen.mov">we did get a successful door opening!</a></p>
<p>At this point I was very happy and I think half the hackerspace heard that.</p>
<h3 id="day-3">
  <a class="heading-anchor" href="#day-3">Day 3<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>At this point I was quite tired, but I felt really accomplished. I assembled the setup without burning everything down,
and I only shorted out the UPS battery once after absent-mindedly connecting the same alligator clip to both power
leads. Whoops.</p>
<p>I spent that half-day cleaning everything up and mounting the power and networking cables to the wall. I also labeled
the box so that we know what that mysterious white box is and where it gets its power.</p>
<p>At 14:00 the hackathon timer ran to zero and we were wondering what would happen with the countdown. Well&hellip;</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image14.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image14_hu_a2d06791217a9388.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I presented my work, listened to what others were up to, and then we got some creative awards. Arti, the guy working
on the Golang port of the door controller software, got &ldquo;K-SPACE Certified Go Developer&rdquo;, and I am now a &ldquo;K-SPACE
Certified Licensed Electrician&rdquo;. Whoo!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image15.jpg" aria-label="View full-size image">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image15_hu_d3effbeb939ea057.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>I&rsquo;d like to thank everyone who organized the event, and Arti Zirk for helping out with the project on many occasions!</p>
<p>That was pretty much it!</p>









<figure class="center">
  <a href="/posts/2023/08/03/k-space-hackathon/media/image16.jpg">
    <img src="/posts/2023/08/03/k-space-hackathon/media/image16_hu_ff471a16a5d6d66f.webp"
     width="1200"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Left: happy hackathon participant. Right: the guy responsible for organizing it. Photo by Arti Zirk.">

  </a>
  <figcaption class="center">Left: happy hackathon participant. Right: the guy responsible for organizing it. Photo by Arti Zirk.</figcaption>
</figure>

]]></content:encoded></item><item><title>I held a talk about my self-hosting adventure!</title><link>https://ounapuu.ee/posts/2023/05/26/my-selfhosting-adventure/</link><pubDate>Fri, 26 May 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/05/26/my-selfhosting-adventure/</guid><description>I had the opportunity to talk about my self-hosting adventure and share some tech tips at k-space, the hackerspace in Tallinn, Estonia.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/05/26/my-selfhosting-adventure/media/cover_hu_c51564873470915e.jpg" width="1200" height="630" alt="I held a talk about my self-hosting adventure!" /><p>There are two reasons why I haven&rsquo;t written much lately, and one of them is that I was cooking up a
talk about self-hosting, more specifically my own self-hosting adventure (the other one is the Steam Deck, more about
that in the future).</p>
<p>The talk took place on May 25th 2023 at <a href="https://www.k-space.ee/">k-space, a hackerspace in Tallinn, Estonia</a>.</p>
<p>This talk was livestreamed and you can watch the recording by <a href="https://www.youtube.com/watch?v=V5dMKLHO4dM">clicking on this link</a>.</p>
]]></content:encoded></item><item><title>Life is maintenance, maintenance is life</title><link>https://ounapuu.ee/posts/2023/04/20/maintenance/</link><pubDate>Thu, 20 Apr 2023 06:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/04/20/maintenance/</guid><description>You can't ignore maintenance, be it in software or other aspects of life, and here's why.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/04/20/maintenance/media/cover_hu_47c2fd964041107c.jpg" width="1200" height="630" alt="Life is maintenance, maintenance is life" /><p>Over my relatively short career (6+ years), I&rsquo;ve noticed a change in the way I approach building things.
When I was still an inexperienced junior developer who barely survived operating in a Linux
environment and saw backend development as a black box, I was happy to get things
working at all.</p>
<p>Nowadays, no matter what I do, I have to take maintenance into account.</p>
<p>In software development, having to account for maintenance means being picky about what dependencies to include.</p>
<p>Do the developers of the dependency have a good track record?</p>
<p>Does it still receive regular new releases?</p>
<p>How often does it break compatibility with new major releases?</p>
<p>Would it be possible to avoid including the dependency by going with another solution, such as writing a small amount
of code yourself?</p>
<p>Is this project maintained by a single person?</p>
<p>Or solely by a VC-backed company that is burning through cash fast?</p>
<p>What if that company has layoffs or goes under?</p>
<p>If you ask yourself these questions, you&rsquo;re probably going to make a choice that&rsquo;s at least somewhat informed, and
you might be able to avoid some pain later on.</p>
<h2 id="its-a-gamble">
  <a class="heading-anchor" href="#its-a-gamble">It&rsquo;s a gamble<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>But sometimes you just can&rsquo;t win.</p>
<p>When working as a junior developer, I was happy to add yet another dependency to the project because it solved that one particular
problem I was working on without me having to worry about implementing the functionality myself. I really didn&rsquo;t give much
thought to what would happen to that dependency years from now.</p>
<p>After working in multiple software development teams, I know how painful it is to get a neglected software development
project back on track (hi, T3!). Choices made in the past (and not necessarily by you) can interrupt your team and
put brakes on any other development that you were planning on.</p>
<p>One relatively recent example comes to mind. I wasn&rsquo;t working on this change myself, but saw how it affected the team.
There was a frontend project based on React, Redux and a bunch of other pieces that were thrown together. One of those
dependencies was a library that was used to render all sorts of tables. There was just one little issue with it: that
dependency was now unmaintained and blocking updates to other dependencies in the project, like React.
One abandoned library that was utilized in a good chunk of the project meant that another solution had to be
chosen and all existing usages had to be ripped out. Given the poor technical state of the project in general
(and that&rsquo;s putting it nicely), that was no easy task, and many weeks were spent on trying to get the house
in order. Eventually the team succeeded, but the cost was high, all because a choice made in the past did not pay off.</p>
<p>You might do some basic research, consider the ups and downs of all the choices, and still make a choice that will
haunt you or the next developer. Sometimes it&rsquo;s simply a coin toss. Life happens, and developers are not
immune to it. The developer might be working on that one library as a passion project, but decide to quit after burning
out. Or they get other priorities, like starting a family, or they decide to switch careers entirely. Or they might
have simply passed away. Such is life.</p>
<h2 id="the-issue-with-tutorials">
  <a class="heading-anchor" href="#the-issue-with-tutorials">The issue with tutorials<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re looking to solve a particular problem, you&rsquo;re probably going to go straight to your search engine of choice
and throwing in some related keywords.</p>
<p>Looking at what&rsquo;s out there in terms of tech often results in browsing through search results and a bunch of tutorials.
Those tutorials are often focused on the bare minimum: here&rsquo;s what we&rsquo;re setting up, here are some commands that you
need to run to get there, and <em>et voilà</em>, you have something that works!</p>
<p>When was the last time you saw a tutorial that also focused on the maintenance of that solution?</p>
<p>If you&rsquo;re new to this industry, maintenance is not something that you necessarily think about as you&rsquo;re most likely
focused on getting things to work in the first place. Building things, exposing them to the world and then ignoring
maintenance is one of the many reasons why the software landscape is in shambles. Best case scenario, the world around
your little service updates and introduces outages that you could have avoided with a little love and care. Worst case
scenario, you get in the crosshairs of a bot that&rsquo;s scanning the whole Internet for vulnerable services, and your
little service might be following orders from adversarial countries and taking part in cyberattacks.</p>
<p>If you&rsquo;re setting something up, think about what the maintenance will look like, and try to estimate the amount of time
you&rsquo;ll have to spend on it. If you can automate a big part of maintenance, then that&rsquo;s even better.</p>
<p>You should still build new things, but you can&rsquo;t ignore maintenance.</p>
<p>If you&rsquo;re someone who just realized that they have this one web service running on a VM somewhere in the cloud with
uptime measured in years and no automatic updates being applied, then I guess you now know what you&rsquo;ll be working on
this week.</p>
<h2 id="not-just-software">
  <a class="heading-anchor" href="#not-just-software">Not Just Software<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Maintenance applies elsewhere as well.</p>
<p>You decide to buy a smartphone, and you care about using the hardware for a long time, perhaps 5+ years. Perhaps due to
environmental concerns, or due to smartphones being ridiculously expensive in 2023.</p>
<p>This means that you probably want one where you can replace the battery with a reasonable cost, since that&rsquo;s considered
to be a consumable item in electronics and it <em>will</em> eventually stop holding a charge.</p>
<p>Which option would you go with?</p>
<ul>
<li><a href="https://www.ifixit.com/Guide/iPhone&#43;14&#43;Battery&#43;Replacement/152966">Apple iPhone 14</a>, battery replacement takes 1-2 hours
and specialized tools</li>
<li><a href="https://www.ifixit.com/Guide/Google&#43;Pixel&#43;7&#43;Battery&#43;Replacement/154680">Google Pixel 7</a>, again, 1-2 hours and
specialized tools needed</li>
<li><a href="https://www.ifixit.com/Guide/Fairphone&#43;4&#43;Battery&#43;Replacement/152861">Fairphone 4</a>, <strong>30-60 seconds</strong> to replace the
battery, no tools needed if you can pry the back cover up with your fingernail</li>
</ul>
<p>From this perspective the Fairphone 4 is the obvious choice. You will have to consider other aspects as well when
picking a smartphone, such as the camera quality, performance and any other features you expect from it, so it&rsquo;s not
always about maintenance, but it can still play a big part in the decision-making process.</p>
<p>Or let&rsquo;s consider a laptop instead. You can cheap out and get one with the lowest price from the store, but
it&rsquo;s unlikely to last more than a few years before it has issues, and repairing it might not make sense due to lack of
spare parts or the repairability of the device being a nightmare. If you care about longevity, you can instead opt for
an used business-class laptop that has better physical construction and lots of affordable spare parts available for
quite a long time.</p>
<p>If you can forego having a car, then that&rsquo;s
a load off your back, since those hunks of metal tend to attract all sorts of problems and require expensive maintenance.
Trust me, I have one made by a certain German car manufacturer notorious for having expensive repairs, and it&rsquo;s not fun.</p>
<p>When choosing a place to live, consider that a bigger apartment or house will have a larger surface area for problems
to exist. More rooms, more area, more things that need attention and repairs.</p>
<p>If you start looking at the choices you make through the lens of maintenance, you can reduce the amount of time and money
that you&rsquo;ll later regret having to spend due to choices made in the past. Any new object you acquire will likely need
maintenance for it to last for a long time. Are you willing to put in that effort? You&rsquo;ll be paying either way, with
your money or your own time, or both.</p>
<h2 id="free-tech-tip-to-developers">
  <a class="heading-anchor" href="#free-tech-tip-to-developers">Free tech tip to developers<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re having trouble explaining the need to perform regular maintenance in your
software development project to the business side, then try using an analogy. Most people probably would not want to
work in an office with broken windows, a leaky roof and the heating system malfunctioning, so why should your software
get treated differently?</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Maintenance is something you can&rsquo;t ignore. It will catch up with you eventually, and it will not let you choose the
place or time for it. If you make conscious decisions, you can reduce the burden and avoid some of the pain later on.</p>
]]></content:encoded></item><item><title>I looked at this site on the Wayback Machine</title><link>https://ounapuu.ee/posts/2023/03/06/way-way-back/</link><pubDate>Mon, 06 Mar 2023 18:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/03/06/way-way-back/</guid><description>I took a look at my site through the Wayback Machine and found that it used to belong to a political candidate in Estonia.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/03/06/way-way-back/media/cover_hu_3e42d335237de418.jpg" width="1200" height="630" alt="I looked at this site on the Wayback Machine" /><p><a href="https://www.valimised.ee/">Yesterday was election day in Estonia and the results are in,</a> which is why
I remembered that one time I looked at my website on <a href="https://archive.org/web/">the Wayback Machine</a>.</p>
<p>This domain used to point to a <a href="https://web.archive.org/web/20131106131123/http://ounapuu.ee/">Wordpress site that hosted
content for a candidate in the local elections</a>,
at least around 2011-2014.</p>
<p>For international readers: &ldquo;Õunapuu&rdquo; is a relatively common last name in Estonia.
Special characters in domains weren&rsquo;t that widely adopted back then, which is
how you end up using &ldquo;Ounapuu&rdquo;.</p>
<p>The site is political in nature and a quick glance at the writing reveals that
the text is&hellip; <em>interesting</em>, to put it nicely.</p>
<p>After 2014, things seem to have changed as the blog did not get any new posts and
at some point the domain was not renewed. <a href="https://web.archive.org/web/20170926081245/http://ounapuu.ee/">Around 2017</a>
I registered the domain because a friend recommended that I get myself a domain,
because personal domains are cool. Best move I&rsquo;ve made in my career, especially
as I later heard from a colleague that someone else with the same last name was
asking about this domain name and wanted to register it in their name.</p>
<p>The site has gone through some changes. It used to <a href="https://web.archive.org/web/20180601184813/https://ounapuu.ee/">host a super basic page
that referred to my work</a>,
and it also linked to <a href="https://web.archive.org/web/20190325122634/https://blog.ounapuu.ee/">a blog that never quite took off</a>.
It did eventually, but not in that form.</p>
<p>The setup that you&rsquo;re looking at right now <a href="https://web.archive.org/web/20200810114604/https://ounapuu.ee/">was established in 2020</a>.
I ended up taking a ready-made Hugo theme and tweaking it to my liking.</p>
<p>And that&rsquo;s pretty much it. I didn&rsquo;t expect this domain to have much history,
but thanks to <a href="https://archive.org/">the Internet Archive</a> we have records of it.</p>
<p>Here&rsquo;s to hoping that I don&rsquo;t forget to renew the domain!</p>
]]></content:encoded></item><item><title>Shrinkflation, SanDisk style</title><link>https://ounapuu.ee/posts/2023/02/15/shrinkflation/</link><pubDate>Wed, 15 Feb 2023 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2023/02/15/shrinkflation/</guid><description>A cheap USB stick and the marketing around it caused disappointment, more at 11.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/posts/2023/02/15/shrinkflation/media/cover_hu_3f8d085c81d8a354.jpg" width="1200" height="630" alt="Shrinkflation, SanDisk style" /><p><strong>2023-02-16 update:</strong> this post is <strong>not</strong> about the &ldquo;GB vs GiB&rdquo; issue, or the &ldquo;lost disk space&rdquo; that you
notice after formatting the device in an OS. Please read the article in full before
making inaccurate comments online.</p>
<p>For many years, I have used two SanDisk Ultra 16 GB USB flash drives
as OS installation media. Since I do not trust <a href="https://www.ventoy.net/en/index.html">Ventoy</a> yet,
and alternative &ldquo;one stick that does it all&rdquo; solutions have had odd bugs from time to time,
I prefer having separate physical USB sticks for each OS, one for Fedora Linux,
and one for Windows 10.</p>
<p>I hate reflashing sticks all the time and would like to have at least one around
that always has Fedora Linux on it, so I decided to get two more USB sticks of the
same brand and size. Once they arrived, I got annoyed.</p>
<p>The old flash drive shows up like this in GNOME Disks.</p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-0.png" aria-label="View full-size image">
    <img src="/posts/2023/02/15/shrinkflation/media/image-0_hu_e94c505cd851477c.webp"
     width="397"
     height="122"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Here&rsquo;s the new one.</p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-1.png" aria-label="View full-size image">
    <img src="/posts/2023/02/15/shrinkflation/media/image-1_hu_33959bdf0f4bf38e.webp"
     width="409"
     height="120"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Although it does not matter one <em>bit</em> for my use case, I am annoyed that the new one
is shipping with much fewer bits than the old one. I&rsquo;m a whole 607125504 bytes short!
That&rsquo;s 579 MB, or about half a gigabyte.</p>
<p>The only difference that I can make out on the surface is that the new one was manufactured in Malaysia.</p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-2.jpg">
    <img src="/posts/2023/02/15/shrinkflation/media/image-2_hu_482485eb9cc5b2fd.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Other than years worth of wear and tear, they look almost identical.">

  </a>
  <figcaption class="center">Other than years worth of wear and tear, they look almost identical.</figcaption>
</figure>

<p>But it seems that SanDisk (or their new owner Western Digital) has legally covered their butt with
<a href="https://support-en.wd.com/app/answers/detailweb/a_id/35080">this knowledge base article.</a></p>









<figure class="center">
  <a href="/posts/2023/02/15/shrinkflation/media/image-3.png" aria-label="View full-size image">
    <img src="/posts/2023/02/15/shrinkflation/media/image-3_hu_4fb23f920cfa8ac8.webp"
     width="862"
     height="179"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Here&rsquo;s the line that explains why some bytes are seemingly missing on formatted media.
This is what consumers are usually concerned about once they use their storage device.</p>
<blockquote>
<p>SanDisk defines 1 GB as 1,000,000,000 bytes.  Operating Systems define 1 GB as 1,073,741,824 BYTES.</p>
</blockquote>
<p>However, this section is the one actually relevant to my finding.</p>
<blockquote>
<p>A portion of the total capacity is used to store certain functions including optimizations of the memory
that support performance and endurance and therefore is not available for user storage.
This is disclosed on our packaging and marketing materials when you see the statement &ldquo;Actual user storage less.&rdquo;</p>
</blockquote>
<p>Based on this, I assume that SanDisk cheaped out and decided to not add enough flash to provide
both the advertised storage of 16 000 000 000 bytes available to the user <em>and</em> some room for
over-provisioning that flash storage benefits from. And somehow they are the only ones who do it
this way, as all other storage media that I own shows up with the proper number of bytes.</p>
<p>And for those interested, here&rsquo;s <code>f3</code> output for both the old and new sticks.</p>
<p>Old:</p>
<pre tabindex="0"><code># f3probe /dev/sdc --destructive --time-ops
F3 probe 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

WARNING: Probing normally takes from a few seconds to 15 minutes, but
         it can take longer. Please be patient.

Good news: The device `/dev/sdc&#39; is the real thing

Device geometry:
	         *Usable* size: 14.91 GB (31266816 blocks)
	        Announced size: 14.91 GB (31266816 blocks)
	                Module: 16.00 GB (2^34 Bytes)
	Approximate cache size: 0.00 Byte (0 blocks), need-reset=no
	   Physical block size: 512.00 Byte (2^9 Bytes)

Probe time: 1&#39;49&#34;
 Operation: total time / count = avg time
      Read: 463.8ms / 4814 = 96us
     Write: 1&#39;48&#34; / 4192321 = 25us
     Reset: 1us / 1 = 1us
</code></pre><p>New:</p>
<pre tabindex="0"><code># f3probe /dev/sdd --destructive --time-ops
F3 probe 8.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.

WARNING: Probing normally takes from a few seconds to 15 minutes, but
         it can take longer. Please be patient.

Good news: The device `/dev/sdd&#39; is the real thing

Device geometry:
	         *Usable* size: 14.34 GB (30081024 blocks)
	        Announced size: 14.34 GB (30081024 blocks)
	                Module: 16.00 GB (2^34 Bytes)
	Approximate cache size: 0.00 Byte (0 blocks), need-reset=no
	   Physical block size: 512.00 Byte (2^9 Bytes)

Probe time: 1&#39;02&#34;
 Operation: total time / count = avg time
      Read: 338.2ms / 4814 = 70us
     Write: 1&#39;02&#34; / 4192321 = 14us
     Reset: 1us / 1 = 1us
</code></pre><p>I&rsquo;m not even mad, I&rsquo;m just disappointed.</p>
<h2 id="2023-02-16-update">
  <a class="heading-anchor" href="#2023-02-16-update">2023-02-16 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>This post received more attention than usual, so here are some additional details and clarifications.</p>
<blockquote>
<p>Why do you not trust Ventoy?</p>
</blockquote>
<p>Ventoy is a great tool from what I&rsquo;ve seen online and the use case it fills does save time and resources.
However, I have some reservations about it. If I had to compromise a bunch of critical systems
over a long time period, then publishing a great tool and having it tamper with your OS installation media
silently would be a really good pick. At this time, I don&rsquo;t trust the developers of the tool enough
and I don&rsquo;t have the time or skills to perform repeated audits of the software every time they release a
new version.</p>
<blockquote>
<p>MBR vs GPT partitioning</p>
</blockquote>
<p>That was an oversight on my part, I should have presented both disks with the same partitioning scheme
to avoid unnecessary confusion. This has now been corrected.</p>
<blockquote>
<p>Alternatives to Ventoy</p>
</blockquote>
<p>One reader pointed out a physical device that can be used for a similar purpose as Ventoy: <a href="http://iodd.kr">IODD</a>.
I have not tested on myself and reportedly it has some bugs and is not 100% perfect, but it seems like
a neat hardware-based alternative.</p>
<p>I have personally tried out things like <a href="https://www.drivedroid.io/">DriveDroid</a> in the past, but
that required a rooted Android phone and it was not 100% bug-free either.</p>
<blockquote>
<p>Everyone knows that GB and GiB are not the same, why is this post even a thing,
the author is clearly incompetent and dumb.</p>
</blockquote>
<p>Read the article.</p>
]]></content:encoded></item><item><title>This site will be offline on 2022-08-17 between 18:00-19:00 EEST</title><link>https://ounapuu.ee/posts/2022/08/17/this-site-will-be-offline/</link><pubDate>Wed, 17 Aug 2022 15:45:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/08/17/this-site-will-be-offline/</guid><description>_what 4.8 EUR/kWh does to a mf_</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="This site will be offline on 2022-08-17 between 18:00-19:00 EEST" /><p>There really isn&rsquo;t much to say here, nor is there a rational reason behind this.
I just see it as an opportunity to send a signal and test the capabilities of
my UPS.</p>
<p>I&rsquo;ve prepared for this moment with my self-hosting setup, let&rsquo;s see how well it
holds up. Hopefully better than the electrical grid.</p>
<p><em>Winter is coming.</em></p>









<figure class="center">
  <a href="/posts/2022/08/17/this-site-will-be-offline/media/image.png">
    <img src="/posts/2022/08/17/this-site-will-be-offline/media/image_hu_d259196280e18aed.webp"
     width="591"
     height="800"
     loading="lazy"
     decoding="async"
     alt=":harold:">

  </a>
  <figcaption class="center">:harold:</figcaption>
</figure>

]]></content:encoded></item><item><title>The absolute state of Bluetooth audio in 2022</title><link>https://ounapuu.ee/posts/2022/06/29/absolute-state-of-bluetooth-audio/</link><pubDate>Wed, 29 Jun 2022 11:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/06/29/absolute-state-of-bluetooth-audio/</guid><description>Whose idea was this?</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="The absolute state of Bluetooth audio in 2022" /><p>I have the Sony WH-1000XM3 headphones. They&rsquo;re good for consuming content.
Audio calls with your colleagues? Forget about it.</p>









<figure class="center">
  <a href="/posts/2022/06/29/absolute-state-of-bluetooth-audio/media/image.jpg">
    <img src="/posts/2022/06/29/absolute-state-of-bluetooth-audio/media/image_hu_ff41c2636290302.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Thanks, Bluetooth. #notsponsored by Värska, it&#39;s just very hot right now.">

  </a>
  <figcaption class="center">Thanks, Bluetooth. #notsponsored by Värska, it&#39;s just very hot right now.</figcaption>
</figure>

<p>This is the setup I have to go with, and it has all to do with how Bluetooth
works. Your options with Bluetooth headsets are the following:</p>
<ul>
<li>high quality sound output, no audio input</li>
<li>low quality sound output, low quality audio input (HSP/HFP)</li>
</ul>
<p>That&rsquo;s it.</p>









<figure class="center">
  <a href="/posts/2022/06/29/absolute-state-of-bluetooth-audio/media/codecs.png">
    <img src="/posts/2022/06/29/absolute-state-of-bluetooth-audio/media/codecs_hu_45d5174ea899cf00.webp"
     width="471"
     height="407"
     loading="lazy"
     decoding="async"
     alt="Choice of codecs exposed by Fedora 36.">

  </a>
  <figcaption class="center">Choice of codecs exposed by Fedora 36.</figcaption>
</figure>

<p>This isn&rsquo;t a problem with Linux, either. I&rsquo;ve done a test call with the help
of my friend on my iPhone SE 2020 using the same headset on Discord, and the
audio quality was still crap. Even the microphone on the phone itself had better
quality.</p>
<p>The only reasonable choice for doing voice calls is attaching a separate wired
microphone to your Bluetooth headphones. The mic quality is much better now and
you still have the option of disconnecting the mic whenever it&rsquo;s not needed.
The mic I&rsquo;m using in the first image is the ModMic.</p>
<p>It&rsquo;s a damn shame that I need to resort to this type of setup though. Who pushed
for going all-in on Bluetooth and throwing out the headphone jack from phones
before making sure that Bluetooth actually works properly?</p>
<p>Rant over.</p>
]]></content:encoded></item><item><title>How I treat my urge to hoard data</title><link>https://ounapuu.ee/posts/2022/03/08/something-is-better-than-nothing/</link><pubDate>Tue, 08 Mar 2022 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/03/08/something-is-better-than-nothing/</guid><description>Something is better than nothing.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="How I treat my urge to hoard data" /><p>The tagline for <a href="https://www.reddit.com/r/DataHoarder/">/r/datahoarder</a> reads:
&ldquo;It&rsquo;s A Digital Disease!&rdquo;. I agree.</p>









<figure class="center">
  <a href="/posts/2022/03/08/something-is-better-than-nothing/media/why-cant-i-hold-all-these-drives.jpg">
    <img src="/posts/2022/03/08/something-is-better-than-nothing/media/why-cant-i-hold-all-these-drives_hu_5e93fb29edda7513.webp"
     width="458"
     height="449"
     loading="lazy"
     decoding="async"
     alt="Why can&#39;t I hold all these hard drives?">

  </a>
  <figcaption class="center">Why can&#39;t I hold all these hard drives?</figcaption>
</figure>

<p>At some point I realized that the pursuit to hoard all the things will just keep
on consuming more and more of my time and money. Storage is cheap up until to a
point, once you find yourself tracking hard drive prices via
<a href="https://de.camelcamelcamel.com">camelcamelcamel</a> and being excited that a 12 TB
external hard drive is at it&rsquo;s lowest price, you may start suspecting that you
have a hoarding issue.</p>
<p>I don&rsquo;t have anything against what people at /r/datahoarder and other archival
efforts do. Data archival done by volunteers is what allows us to preserve
history and cultural artifacts of our time (YouTube videos, memes etc.). I just
had to find a solution to my situation before it got too bad.</p>
<h2 id="something-is-better-than-nothing">
  <a class="heading-anchor" href="#something-is-better-than-nothing">Something is better than nothing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Once you find yourself with terabytes of data and decide to scale down, you will
need to make some changes. Most of the time this results in deleting a lot of
data that you don&rsquo;t care about that much. This works, but there are some files
that will be difficult to part with.</p>
<p>In my experience, most of the storage is taken up by media files.
I would still like to have a copy of some videos, but if they are downloaded
in 1080p or 4K resolutions, they will take up a lot of space.</p>
<p>That&rsquo;s when I decided to change my approach with data like that. I would still
like to have <em>a</em> copy, but it doesn&rsquo;t necessarily have to be full quality all
the time. When you rewatch YouTube videos that you have archived from 2006-2010s,
you&rsquo;ll notice that the video quality is bad. That doesn&rsquo;t mean that you enjoy
the videos any less. Watching these old videos is just an act of going through
your memories and feeling nostalgic, the medium itself is just the spark needed
to revive the memories.</p>
<p>With that, I decided to start following this simple rule: <em>something is better
than nothing</em>.</p>
<p>I don&rsquo;t need 4K versions of all the channels I follow. <code>bestvideo[height&lt;=1080]</code>
in <code>yt-dlp</code> configuration will limit the resolution of all the videos you download
to 1080p, which is still good enough.</p>
<h2 id="data-value-and-you">
  <a class="heading-anchor" href="#data-value-and-you">Data, value, and you<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re someone like me who watches YouTube frequently, then you probably have
some channels that you care about a lot.</p>
<p>With channels that I truly care about, I still keep the highest quality copies of
all their videos on my server. This has a real cost in terms of storage, but the
value I have got out of the videos is much greater than that.</p>
<p>However, there are some exceptions. <a href="https://www.youtube.com/c/LinusTechTips">LinusTechTips</a>
is a great channel and has had a huge influence in my life. However, they upload
almost daily and do long streams from time to time. Archiving the whole channel
is just not feasible at my scale. Even when limiting the resolution to 480p,
the full channel archive takes up over 300 GB of space in 2022. Instead, I&rsquo;ve
opted to recognizing the videos that are the most memorable, such as
<a href="https://youtu.be/eCz-IixxR_k">the petabyte project</a>, and have archived those
individually.</p>
<p>There&rsquo;s also a certain type of data that isn&rsquo;t that common: data created by you
and your friends/family. Extra care and focus should be put on this type of
data, because it&rsquo;s very unlikely that someone else has a copy of gigabytes worth
of cat pictures you&rsquo;ve taken over the years. Make plenty of backups and don&rsquo;t
worry too much about hoarding it now, as long as it&rsquo;s not a big burden for you.</p>
<h2 id="constraints">
  <a class="heading-anchor" href="#constraints">Constraints<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Constraints force you to get creative. It also helps with tuning down your data
hoarding habit.</p>
<p>Set physical limitations to the data you can store. For example: limit yourself
to running only two hard drives at a time. The only way to get more storage is
to upgrade vertically to bigger hard drives, which is naturally
throttled by the relatively slow increases in hard drive sizes.</p>
<p><a href="/posts/2022/01/17/asrock-x300-future-of-desktops/">For reference, my current setup has some pretty harsh limits when it comes to
storage</a>. The only way to get
more is to spend a lot of money on bigger SSD-s.</p>
<h2 id="the-internet-archive">
  <a class="heading-anchor" href="#the-internet-archive">The Internet Archive<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you don&rsquo;t want to go through all the hassle, but still want to contribute
to archival efforts, then you can donate to <a href="https://archive.org/donate/">the Internet Archive</a>
instead. Buying and running all those hard drives isn&rsquo;t free, you know.</p>
<p>And if you&rsquo;re planning on uploading data to the Internet Archive, then please
do not abuse it. Only upload data that you feel is worth preserving.</p>
]]></content:encoded></item><item><title>Surviving the front page of HackerNews on a 50 Mbps uplink</title><link>https://ounapuu.ee/posts/2022/02/09/hn-stats-analytics/</link><pubDate>Wed, 09 Feb 2022 06:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/02/09/hn-stats-analytics/</guid><description>Overview of basic analytics during that one time my blog post got traction on HackerNews, and the steps I took to prepare for just this occasion.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Surviving the front page of HackerNews on a 50 Mbps uplink" /><p>Around a month ago <a href="https://news.ycombinator.com/item?id=29871693">I shared my blog post</a>
on HackerNews. I guess I lucked out with the choice of the topic, because it
brought out a lot of enthusiasts who shared their own experiences with older
machinery that still works in 2022. I really appreciate the feedback and the
experiences shared!</p>
<p>Anyway, what is noteworthy in my opinion is that my blog runs off of a residential
connection that has an upload speed limit of 50 Mbps. Once I noticed the post
getting traction, I was worried for a moment. It&rsquo;s not a rare sight to see a post
on the front page of HackerNews and see it being down due to all the attention
it got.</p>
<p>Somehow, my post managed to weather the storm. Here&rsquo;s what happened.</p>
<h2 id="analyzing-the-logs">
  <a class="heading-anchor" href="#analyzing-the-logs">Analyzing the logs<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My page doesn&rsquo;t have any sort of first-party or third-party analytics software
running. Tracking users across the web is a big no-go for me and I will live by
that, especially on my website. I do have <code>nginx</code> logs, though.</p>
<p>After a quick look around, I found <code>goaccess</code>, a tool that can parse <code>nginx</code>
logs and put together some basic statistics. I found it to be good enough for my
purposes. Here are some notable statistics.</p>
<p>To understand the HackerNews effect, note that the post was published on
2022-01-10 07:42. These logs also include requests towards services that I host
myself.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/0-summary.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/0-summary_hu_b474c8c8793657ee.webp"
     width="765"
     height="129"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>The summary of the week during which one of my posts got popular on HN, as
reported by <code>goaccess</code>, looks like this.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/1-unique-visitors.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/1-unique-visitors_hu_49ff5e1446f00055.webp"
     width="422"
     height="236"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>During quiet days, nginx logs around 50K requests a day. On 10th of January,
there was a 12x increase. The effect was also noticeable the next day, during
which I assume people caught up with their 100+ tabs that they usually have
open. This may also be down to the post being shared around as well.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/2-requested-files.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/2-requested-files_hu_39a135548114515b.webp"
     width="1182"
     height="573"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>Based on this statistic, it seems that the post got around 75K views, either by
real people, crawlers or preview generators.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/3-static-requests.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/3-static-requests_hu_ffdb322a95f80571.webp"
     width="1006"
     height="575"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>When we look at the number of requests made towards specific assets, such as
the images in the post, we can see that real impressions are likely to be
around 55K. The first image has been downloaded more than the other two, likely
indicating that it was used as the preview image when the article was linked
on other sites.</p>
<p>This statistic also highlights a surprisingly large cost of web fonts.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/6-operating-systems.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/6-operating-systems_hu_39d29d88d2748f31.webp"
     width="391"
     height="213"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>The OS results are likely to be biased, since my self-hosted services go through
the same reverse proxy. The &ldquo;Unknown&rdquo; section is likely related to crawlers and
other bots pinging my server.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/7-browsers.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/7-browsers_hu_2c11e077a3bee02.webp"
     width="382"
     height="211"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>No surprise there: Chrome is the most popular browser used to reach my site.
Firefox makes up a good chunk of hits as well, but a lot of those are likely
requests made from my own machine.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/8-time-distribution.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/8-time-distribution_hu_ac0137243e7e9ac.webp"
     width="1280"
     height="355"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>The time distribution of the requests is interesting. You can notice the background
noise associated with bots and crawlers that occurs during the night. My post
was posted in the morning in my local timezone (UTC +2), which was around the
time EU people wake up and get to work. The other spike around 14-15:00 can
likely be attributed to our friends over the Atlantic ocean.</p>
<p>16:00 in my local time is a bit special. A lot of things coincide with this time:</p>
<ul>
<li>the review embargo for the latest highly sought after CPU/GPU is over, followed
by a barrage of videos on this product in YouTube</li>
<li>the stock market opens and news start rolling in about some big moves</li>
<li>if Slack is having issues, then it&rsquo;s around this time, because I can only
assume that people get to work and do a production release at the start of the
workday.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/13-http-status-codes.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/13-http-status-codes_hu_cab75752f718d089.webp"
     width="901"
     height="503"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>To my surprise, my server survived this and there aren&rsquo;t too many issues. The
400 and 500 errors are likely attributed to bots trying to exploit my server and
crawlers visiting links that are not valid any more.</p>









<figure class="center">
  <a href="/posts/2022/02/09/hn-stats-analytics/media/16-geolocation.png" aria-label="View full-size image">
    <img src="/posts/2022/02/09/hn-stats-analytics/media/16-geolocation_hu_1178a8ef5d7702d0.webp"
     width="467"
     height="220"
     loading="lazy"
     decoding="async"
     alt="">

  </a>
  
</figure>

<p>There&rsquo;s likely a bias here as well regarding Europe.</p>
<h2 id="how-i-built-the-blog">
  <a class="heading-anchor" href="#how-i-built-the-blog">How I built the blog<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>When I started writing blog posts regularly, I had some principles that I wanted
to stick to:</p>
<ul>
<li>the goal should be on the writing, not the part where I build the website itself</li>
<li>the site has to be static: build it once and deploy it, which should result in
fewer opportunities for attacks and reduced load on the CPU</li>
</ul>
<p>With this in mind, I decided to stick with <a href="https://gohugo.io/">Hugo</a>. Hugo is
just a single binary, has plenty of themes to pick from, and it seems like a
reasonable-enough choice for a site. It&rsquo;s not the easiest to use as you&rsquo;ll be
mainly operating in Markdown, and with the theme that I use, I have to
copy-paste a <code>&lt;figure&gt;</code> section, change the image name that it points to, and
make sure that I didn&rsquo;t mess anything up. However, because this approach rules
out me getting hit by the hottest Wordpress plugin vulnerability of the week, I
think it&rsquo;s a fair trade-off to make.</p>
<p>I picked <a href="https://github.com/panr/hugo-theme-hello-friend">this theme</a> by
<a href="https://radoslawkoziel.pl/">Radosław Kozieł</a> and customized it so that it has a landing page
of sorts as well. I haven&rsquo;t updated it yet and it has some flaws, but it gets
the job done, and that&rsquo;s what matters to me the most.</p>
<p>Hosting media, such as images, seems like a no-brainer, just put them on the
page and be done with it. Pictures taken with an iPhone SE 2020 are quite big,
though (3-4 MB per image), which will result in the page loading very slowly.
To avoid images bloating the size of the page too much, I have set up a system
where I keep the original images in one folder, copy them to another one, run
<code>mogrify -resize 1024x768 -quality 85 *.jpg</code> to keep the images small, but still
detailed enough, and then deploy those converted images along with the rest of
the blog.</p>
<p>With converted images, a page with three images can fit in less than 1 MB of
transferred files without any issues. With original images, the same page would
require 10 MB of files to be transferred. The math is simple: with a limited
uplink, optimizing the images results in your server being able to serve 10x
more requests.</p>
<h2 id="residential-connections-and-dns">
  <a class="heading-anchor" href="#residential-connections-and-dns">Residential connections and DNS<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you&rsquo;re like me, then you probably have a crappy router/modem box from your
local ISP, and a dynamic IP address that usually changes whenever you reboot
said box. This presents a challenge when you try to host anything from your
residential connection since the IP address could change at any time.</p>
<p>To resolve this, there are two options I&rsquo;m aware of: dynamic DNS providers, or
setting up a script that talks to your DNS provider over a standard API.</p>
<p>I haven&rsquo;t personally used any dynamic DNS providers, such as <a href="https://www.duckdns.org">DuckDNS</a>,
mainly because my domain registrar has a handy API that I can use to
automatically update my IP address with any time it changes. And yes, I did have
an issue with the script where I triggered a change every minute, resulting in
an angry e-mail being sent to me. Free tech tip: only propagate changes when the
IP address <em>actually</em> changes.</p>
<p>There&rsquo;s one downside with this issue: you can set your domain TTL (time-to-live)
low, but no matter how low you set it, there will be a period of time after
an IP address change where some DNS servers will point to your old IP address.
This is an availability risk you have to consider when setting up a service on
a dynamic IP address.</p>
<h2 id="future-steps">
  <a class="heading-anchor" href="#future-steps">Future steps<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At one point I took a look a the assets of the Hugo theme that I use and noticed
that it includes a dependency named <code>prism.js</code>, which might be a good thing to
include if you want to display code snippets with syntax highlighting. My issue
with it was that it was included on every page load and took up a significant
chunk of transferred data. I decided to remove it, and just like that, the page
loads even faster.</p>
<p>There&rsquo;s still room for improvement. The page currently also includes some custom
fonts. If I decide that a built-in font is good enough, then there&rsquo;s potential
for an additional 0.3 MB of savings.</p>
<p>The web is bloated enough already, but at least I can control what I send to the
client machines on my website.</p>
<h2 id="conclusion">
  <a class="heading-anchor" href="#conclusion">Conclusion<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you don&rsquo;t want to go through all the hassle and just want a website up and
running, just get yourself a cheap virtual machine at a cloud provider, or use
something like Github Pages. Those solutions are less likely to hit limits with
bandwidth.</p>
<p>If you like tinkering and the decentralized, self-hosted web to exist
(<em>not Web 3.0!</em>), then feel free to use this post as inspiration for your very
own website. There&rsquo;s a lot that you can do with limited resources, and it&rsquo;s
fun to push the limit.</p>
<p>And as a quick tech tip: you can use <a href="https://web.archive.org/web/20220110074515/https://ounapuu.ee/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/">The Wayback Machine</a>
as an insurance policy for your website. If you are concerned about it going
down, have them take a snapshot of it and link it somewhere in a comment.</p>
]]></content:encoded></item><item><title>Why I went back to using a ThinkPad from 2012</title><link>https://ounapuu.ee/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/</link><pubDate>Sun, 09 Jan 2022 11:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/</guid><description>How trying out new laptops and messing with my personal computing setup motivated me to go back to a laptop that some would call ancient.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Why I went back to using a ThinkPad from 2012" /><p><em>This post is inspired by <a href="https://solar.lowtechmagazine.com/2020/12/how-and-why-i-stopped-buying-new-laptops.html">this article from the Low-tech Magazine</a>.
I highly recommend giving that a read as well!</em></p>
<p>Over my lifetime, I&rsquo;ve used a bunch of different computers, mainly due to new
ideas and requirements popping into my mind every time I&rsquo;m content with my
current setup. One of my last changes might be a bit of a headscratcher for some.</p>









<figure class="center">
  <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/t430.jpg">
    <img src="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/t430_hu_2d4404a123679511.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="ThinkPad T430 in all its glory.">

  </a>
  <figcaption class="center">ThinkPad T430 in all its glory.</figcaption>
</figure>

<h2 id="background">
  <a class="heading-anchor" href="#background">Background<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At my current place of employment, I&rsquo;ve had the opportunity to try out recently
released laptops from Lenovo and Dell, with the goal of evaluating them for
software development workloads and pick a default option for new hires. My work
laptop at the time was the Lenovo ThinkPad T480 with some decent specs and an
NVIDIA GeForce MX 150 GPU that was weak and throttled itself whenever it hit 70
degrees Celsius in Windows 10, making it absolutely useless.</p>
<p>I tried out a fair number of makes and models: Lenovo ThinkPad P14/T14 (gen 1
and 2) in both Intel 11th gen and AMD Ryzen 4000/5000 series configurations, plus
some Dell Latitudes with Intel 11th gen CPU-s as well. And the result? A lot of
disappointment.</p>
<p>The non-exhaustive list of issues I ran into with these machines on Fedora
Linux 34:</p>
<ul>
<li>The touchpad would sometimes randomly not work on one of the ThinkPads.</li>
<li>On AMD models, performance was less than stellar for my workloads and not a
significant jump over a laptop from 2018.</li>
<li>The Intel CPU-s had throttling issues that made them unusable for basic
things like calls over Google Meet as they would throttle to 400 MHz.</li>
<li>On one of the Dell machines, it was very easy to overheat the SSD, which lead
to the CPU throttling to 400 MHz. Yes, the SSD caused the CPU to throttle.</li>
<li>Wi-Fi/Bluetooth would not work on one of the laptops, even when I was using an
up-to-date Linux distro. Likely related to the type of adapter used (not Intel).</li>
</ul>
<p>Once that experiment was done, we settled on the least crappy version of the
ThinkPads that had an AMD Ryzen CPU, at least those didn&rsquo;t sound like jet
engines under load and didn&rsquo;t have insane throttling issues.</p>
<p>It&rsquo;s not all that bad, though. I was now committed to using my current ThinkPad
T480 for as long as possible. It, too, had a rough start, but at least all the
issues it came with have been ironed out over time.</p>
<h2 id="hopping-between-machines">
  <a class="heading-anchor" href="#hopping-between-machines">Hopping between machines<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At this point in time, I had three machines:</p>
<ul>
<li>desktop PC (for work and personal stuff)</li>
<li>work laptop (for work stuff only)</li>
<li>personal laptop (for personal stuff, of course)</li>
</ul>
<p>I could not rely on the work laptop for personal use as it has limited storage
options. Call me a freak, but I feel very uneasy running on a single SSD, even
if my data is backed up to my NAS and on external backup drives. With my <a href="/posts/2021/12/29/vr-vfio-latency/">desktop
PC use case affecting other workloads as well</a>, I
had to come up with a solution.</p>
<p>Syncing data between machines was not the issue here. <a href="https://syncthing.net/">Syncthing</a>
is an absolute open-source gem and had no issues with things like
<code>node_modules</code> folders. The main issue was the fact that I didn&rsquo;t want to carry
two laptops around or buy an extra USB-C dock for use at home.</p>
<p>I took the risk and jumped back to the ThinkPad T430 for both my personal and
work use cases.</p>
<h2 id="thinkpad-t430-the-history">
  <a class="heading-anchor" href="#thinkpad-t430-the-history">ThinkPad T430: the history<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>My ThinkPad T430 has a rich history. I got it in 2016 to replace my aging
ThinkPad T60. Getting this laptop felt similar to that time a desktop PC that ran
Windows 98 got replaced with a dual-core &ldquo;beast&rdquo; in 2006.</p>
<p>In 2006, my webpage load times went from 30 seconds to a second. Getting
Android app build times from 60 seconds to around 10 seconds on the T430 felt
the same.</p>
<p>This ThinkPad T430 has survived all the following:</p>
<ul>
<li>A bicycle crash while it was in a backpack. The latch mechanism broke and
there are a couple of cracks in the palm rest, but the rest is working fine.</li>
<li>A coffee spill, which luckily only discoloured the casing of two USB 3.0 ports.</li>
<li>Liquid metal experiments, had some pretty close calls there with my dumb ass
almost shorting the system out.</li>
<li>Use as a budget low-power server machine for a bit.</li>
</ul>
<p>5 years later, it&rsquo;s back in my possession again after a short stint at a family
members&rsquo; hands.</p>
<p>There&rsquo;s more to this than simply a rich history, though.</p>
<h2 id="the-modifications">
  <a class="heading-anchor" href="#the-modifications">The modifications<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Over the years, I&rsquo;ve been inspired by whatever modifications people over at
<a href="https://www.reddit.com/r/thinkpad/">/r/thinkpad</a> have come up with. If you
want a short summary, you can check out
<a href="https://medium.com/@n4ru/the-definitive-t430-modding-guide-3dff3f6a8e2e">the definitive T430 modding guide</a>
to get some inspiration.</p>
<p>To make this machine viable in 2021, you need the CPU, RAM and SSD upgrades at
the very minimum.</p>
<p>Here&rsquo;s the list of upgrades I&rsquo;ve done:</p>
<ul>
<li>CPU upgrade to a quad-core Intel i7-3820QM (45W TDP).</li>
<li>RAM upgrade to 16 GB DDR3 memory.</li>
<li>Storage: 250GB mSATA for OS, 2x 1TB SATA SSD-s for data, made possible with a
HDD caddy that replaces the optical drive.</li>
<li>New third party 9-cell battery. I&rsquo;ve had mixed experiences with these, but
the one I have now seems to be good enough.</li>
<li>Replaced the heatsink and fan assembly with one that has a Delta fan
(FRU 04W3270). It&rsquo;s quieter and doesn&rsquo;t have the high-pitched whine that the
Toshiba fan exhibits.</li>
<li>At one point, I ran an external GPU off of the ExpressCard34 slot.</li>
<li>Installed <a href="https://github.com/n4ru/1vyrain">1vyrain</a> to get rid of annoying
limitations, such as the Wi-Fi whitelist.</li>
<li>Upgraded the Wi-Fi card to Intel Wireless-AC 7260.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/fandesign.jpg">
    <img src="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/fandesign_hu_2e4291c1c9feb921.webp"
     width="600"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Delta fan (top) vs the annoyingly loud Toshiba fan (bottom).">

  </a>
  <figcaption class="center">Delta fan (top) vs the annoyingly loud Toshiba fan (bottom).</figcaption>
</figure>

<p>There are some things I&rsquo;d like to eventually tinker with:</p>
<ul>
<li>Replace the display with a compatible 1600x900 panel that has better image
quality. The current screen is awful.</li>
<li>Do something fun with the ExpressCard34 slot. There&rsquo;s the <a href="https://thinkmods.store/collections/all-mods-1/products/expresscard-to-nvme-adapter">thinkmods.store
ExpressCard34 SSD adapter</a>,
but I haven&rsquo;t seen that released yet.</li>
</ul>









<figure class="center">
  <a href="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/egpu.jpg">
    <img src="/posts/2022/01/09/why-i-went-back-to-using-a-thinkpad-from-2012/media/egpu_hu_71bc0f4a5a4cb46a.webp"
     width="1067"
     height="800"
     loading="lazy"
     decoding="async"
     alt="eGPU setup that I used to run back in 2017 with surprisingly good results.">

  </a>
  <figcaption class="center">eGPU setup that I used to run back in 2017 with surprisingly good results.</figcaption>
</figure>

<p>With these modifications, it feels like an usable laptop again.</p>
<h2 id="but-why">
  <a class="heading-anchor" href="#but-why">But why?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The reasons why I went back to the T430 are quite simple.</p>
<ul>
<li>Build quality: it has survived a nasty fall, and it will probably survive the
next ones as well.</li>
<li>CPU performance is roughly on par with the T480 under sustained load.</li>
<li>No dedicated GPU that takes up valuable space and power.</li>
<li>Battery life with the 9-cell battery is on par or even better in real
world use scenarios, compared to the T480.</li>
<li>Ridiculous storage configurations: dual-boot, triple-boot, RAID1 setups,
16+TB of solid-state storage, it&rsquo;s all possible on this old laptop!</li>
<li>Decent selection of ports, including VGA and gigabit ethernet.</li>
<li>Docking stations can be dirt cheap and be bought for less than 10 EUR (used).</li>
<li>I have plenty of Lenovo barrel plug chargers, but only one USB-C Lenovo
charger. I really didn&rsquo;t want to buy more chargers when I have plenty of
perfectly working ones.</li>
</ul>
<p>There are some downsides, though:</p>
<ul>
<li>No HDMI, I&rsquo;d need a mini-Displayport to HDMI dongle for that to work.</li>
<li>No USB-C, which might be an issue if your environment at work is optimized
for that.</li>
<li>It runs hot, but doesn&rsquo;t have the same level of on-chip thermal protections
that the T480 has, resulting in <a href="https://github.com/Hermanio/linux-cpu-manager">this awful piece of software I wrote back in 2018.</a></li>
</ul>
<p>That&rsquo;s nothing compared to the unreliability I&rsquo;ve experienced with the T480.
I&rsquo;ve witnessed the keyboard dying once and the motherboard being replaced twice,
once due to charging related issues, and the other time due to random system
crashes and screen glitching.</p>
<h2 id="verdict">
  <a class="heading-anchor" href="#verdict">Verdict<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I&rsquo;ve been using this setup for over a month now, and it has been surprisingly
adequate. Yes, opening Java projects in IntelliJ will make things slow, and to
record my desktop with OBS and acceptable performance, I had to drop my screen
resolution to 720p. I can&rsquo;t expect everything to work super well on this
machine, but for a computer that&rsquo;s released almost 10 years ago, it&rsquo;s still
holding up well.</p>
<p>I&rsquo;d like to thank Intel here for making this possible. The CPU innovation
stagnation between 2012-2017 has resulted in 4 cores still being an acceptable
low-end CPU in early 2022. Without this, my laptop would likely be obsolete by
now.</p>
<h3 id="2022-01-12-update">
  <a class="heading-anchor" href="#2022-01-12-update">2022-01-12 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This post got a lot of feedback and comments on HackerNews with people sharing
their experiences, feel free to check it out and <a href="https://news.ycombinator.com/item?id=29871693">join the discussion!</a></p>
<h3 id="2022-09-01-update">
  <a class="heading-anchor" href="#2022-09-01-update">2022-09-01 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h3>
<p>This post was translated into German and featured on golem.de,
<a href="https://www.golem.de/news/notebook-warum-ich-jetzt-wieder-ein-thinkpad-von-2012-nutze-2209-166195.html">check it out!</a></p>
]]></content:encoded></item><item><title>Tech rants: PC-s use way too much power in 2021</title><link>https://ounapuu.ee/posts/2021/11/03/tech-rants-1/</link><pubDate>Wed, 03 Nov 2021 07:00:00 +0200</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/11/03/tech-rants-1/</guid><description>Quick rant about the state of PC-s in 2021 regarding power and resource usage.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Tech rants: PC-s use way too much power in 2021" /><p>Welcome to 2021. We have:</p>
<ul>
<li>supply chain issues</li>
<li>no reasonably priced GPU-s</li>
<li><a href="https://www.anandtech.com/show/16495/intel-rocket-lake-14nm-review-11900k-11700k-11600k/5">consumer-grade CPU-s with peak power consumption at 296W</a></li>
<li><a href="https://www.notebookcheck.net/The-NVIDIA-GeForce-RTX-3090-may-have-a-350-W-TDP-but-it-can-consume-nearly-60-more.494757.0.html">GPU-s that consume 350-400W of power under normal use</a></li>
</ul>









<figure class="center">
  <a href="/posts/2021/11/03/tech-rants-1/media/intel-fieri.jpg">
    <img src="/posts/2021/11/03/tech-rants-1/media/intel-fieri_hu_d541e0e5837251dc.webp"
     width="507"
     height="676"
     loading="lazy"
     decoding="async"
     alt="Accurate representation of CPU-s in 2021.">

  </a>
  <figcaption class="center">Accurate representation of CPU-s in 2021.</figcaption>
</figure>

<p>At the same time, we have made great leaps in CPU/GPU architectures and chip manufacturing technologies, which <em>should</em>
result in faster and more efficient devices, right?</p>
<p>Well, yes. However, with some fierce competition between <em>AMD vs Intel</em>
and <em>AMD vs NVIDIA</em> all reason is thrown out the window and the power limits are raised in order to preserve the
performance crown. In the end, all that matters is &ldquo;but <em>my</em> CPU is 5% faster in this benchmark!&rdquo; or &ldquo;Oh yeah Intel has
the performance crown even if it took 290W to get there&rdquo;.</p>
<p>This all sounds absurd during a time when it&rsquo;s clear that energy usage is becoming a big problem in the near future.
Using up more power daily also makes it more difficult to rely on renewable (not necessarily green!) energy sources due
to the simple fact that building more capacity is more expensive.</p>
<h2 id="all-that-power-but-at-what-cost">
  <a class="heading-anchor" href="#all-that-power-but-at-what-cost">All that power, but at what cost?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>What is often missing from this conversation is that it&rsquo;s not only the CPU or the GPU that uses up a lot of energy
while running.</p>
<p>When you have a hungry chip in your system, you will likely need to get a bigger cooler in your system to dissipate all
that heat. Whoops, more raw materials (aluminium, copper) required.</p>
<p>The GPU is so hot that the manufacturer had to put on a giant heatsink, multiple fans and made the whole darn thing
barely fit in your case. Same story.</p>
<p>Something has to deliver all that power as well. And just like that, the required amount of electrical components
on the GPU board or the motherboard has just multiplied.</p>
<p>The hot air gets stuck in your PC case? Sounds like someone is going to need to make an investment into some PC fans.</p>
<p>And to finish it all off, you discover that your power supply cuts out during high loads, because 800W power peaks are
acceptable now I guess. Time to go to your local PC parts store to get a new power supply.</p>
<p>You might look at your monthly electricity bill and not even notice the power required to run such a machine, but the
thing is that the real cost comes from everywhere else. That cost is not low.</p>
<h2 id="okay-you-convinced-me-now-what">
  <a class="heading-anchor" href="#okay-you-convinced-me-now-what">Okay, you convinced me, now what?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>If you already have bought hardware that fits the above description, then there isn&rsquo;t much to do other than limiting the
power usage. CPU-s and GPU-s generally follow this kind of rule:</p>









<figure class="center">
  <a href="/posts/2021/11/03/tech-rants-1/media/masterpiece.png">
    <img src="/posts/2021/11/03/tech-rants-1/media/masterpiece_hu_644edb91e3812c9e.webp"
     width="1280"
     height="720"
     loading="lazy"
     decoding="async"
     alt="Rough representation of the relationship between power usage and performance of a chip.">

  </a>
  <figcaption class="center">Rough representation of the relationship between power usage and performance of a chip.</figcaption>
</figure>

<p>If you use Windows, then one example of making a positive change is to change the power limit of your GPU. For AMD
GPU-s, this is present in Radeon settings and is a simple percentage slider. For NVIDIA cards I usually opt for using
MSI Afterburner. While doing any changes, definitely have something like FurMark running in the background, that helps
measure performance and get readouts for your current power usage and the performance that you get out of it.</p>
<p>A modest reduction of the power limit will likely yield a small drop in performance, but a much bigger drop
percentage-wise in the power consumption of the GPU.</p>









<figure class="center">
  <a href="/posts/2021/11/03/tech-rants-1/media/msi-afterburner.png">
    <img src="/posts/2021/11/03/tech-rants-1/media/msi-afterburner_hu_9d85cd4050d45981.webp"
     width="568"
     height="722"
     loading="lazy"
     decoding="async"
     alt="Power limit slider present in MSI Afterburner.">

  </a>
  <figcaption class="center">Power limit slider present in MSI Afterburner.</figcaption>
</figure>

<p>For CPU-s, there are two types of options:</p>
<ul>
<li>configure power limits in UEFI settings (depends on your CPU and motherboard manufacturer)</li>
<li>limit the CPU power usage using tools available in the operating system</li>
</ul>
<p>Here are some examples of the knobs and tools that you can use to achieve this:</p>
<ul>
<li>AMD CPU-s and UEFI: <code>cTDP</code> option in UEFI settings. Just set the TDP that you want to run the CPU at and you&rsquo;re done!
Allows you to run your 105W TDP CPU at 35W, for example.</li>
<li>AMD Precision Boost Overdrive (PBO) and UEFI. Sometimes the cTDP setting is not present, which means that you&rsquo;ll have
to go to the overclock settings and input the correct parameters to set the same limit.</li>
<li>AMD and Linux: <code>cpufreq</code>. Honestly, not the best way to do it since the steps don&rsquo;t seem to be that granular, but
it&rsquo;s better than nothing.</li>
<li>Intel and UEFI: supported CPU-s likely support similar techniques to AMD, but since I don&rsquo;t have experience with
Intel, I cannot say what exactly you can change.</li>
<li>Intel and Windows/Linux: disable turbo boost. Peak performance will definitely suffer, but you end up running your
CPU at the base clock, which is likely very close to the efficiency point of the cpu.
<ul>
<li>in Linux, use the <code>intel_pstate</code> driver.</li>
<li>in Windows, you can set the &ldquo;Maximum processor state&rdquo; under the legacy power options UI to 99%, which will disable
turbo boost.</li>
</ul>
</li>
</ul>
<p>This list is not complete and there might be better options out there. Just go with the one that is easiest for you and
prefer UEFI-level settings to any OS settings as those will persist even if you change your operating system.</p>
<h2 id="i-changed-my-mind-why-should-i-care">
  <a class="heading-anchor" href="#i-changed-my-mind-why-should-i-care">I changed my mind. Why should I care?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Using less power actually comes with a lot of benefits:</p>
<ul>
<li>smaller electricity bill (just don&rsquo;t expect any dramatic changes)</li>
<li>your PC will run much cooler now, negating the need for a big and wasteful cooling setup</li>
<li>you can run your PC much quieter now as well, less heat to dissipate -&gt; fans don&rsquo;t need to run as fast now</li>
<li>you can pick cheaper (in <strong><em>price</em></strong>, not quality) options when it comes to PC components since
you don&rsquo;t need all that overbuilt capacity.</li>
</ul>
<h2 id="why-do-you-care">
  <a class="heading-anchor" href="#why-do-you-care">Why do you care?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Once you limit yourself with the amount of resources available to you, you&rsquo;ll soon discover that you can do a lot even
with a small power budget. I&rsquo;m running all my self-hosted services, gaming and work off of one decently configured PC
that is quiet and yet powerful enough to perform well at any task I throw at it. If you can do all of that with a CPU
that was originally designed for laptops and has a rated TDP of 65 watts, then why get anything more powerful?</p>
<h2 id="apple-has-joined-the-game">
  <a class="heading-anchor" href="#apple-has-joined-the-game">Apple has joined the game<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>We were in a Intel-lead stagnation, with new chips adding minor features and introducing small improvements in performance. AMD came
out with the first Zen-based CPU-s in 2017, followed soon by APU-s that were used in laptop designs as well. At that
point AMD had almost closed the performance gap in the laptop space, forcing Intel to up their core counts and the
turbo boost power limits as well. With the introduction of Ryzen 4000 and 5000 series, AMD went above and beyond and
managed to bring great CPU and GPU performance to the laptop space, with the one notable omission being Thunderbolt 3
support.</p>
<p>Then Apple came out of nowhere and provided heavy competition for both companies. The new Apple M1 chips are fast as
hell for what they really are and consume so little power that the fans in the laptop rarely have to turn on. You
also get the benefit of having an amazing battery life. That same design has also found use in the desktop lineup in the
form of the new iMac, and who knows, maybe it will also end up in a proper workstation machine at some point?</p>
<p>While I don&rsquo;t like the software stack that MacBooks ship with, and the poor repairability is a major downside for me,
I still have to admit that Apple is moving in the right direction with their chip designs. Performing well without your
laptop turning into a poor man&rsquo;s version of a jet engine is exactly what we should be striving for.</p>
<h2 id="closing-thoughts">
  <a class="heading-anchor" href="#closing-thoughts">Closing thoughts<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I understand that the reason we often end up using the latest and greatest hardware is a result from the need to perform
our work as fast as possible, because you&rsquo;ll end up using less time, and less time spent on a task should result in more
productivity. However, this has to be more sustainable, and continuing the trend that the &ldquo;big boys&rdquo; are going in goes
against that.</p>
<p>I hope that we will see more progress in this area, especially from companies other than Apple.</p>
]]></content:encoded></item><item><title>Quest towards energy efficiency part 1: the water heater</title><link>https://ounapuu.ee/posts/2021/01/25/quest-towards-energy-efficiency-part-1/</link><pubDate>Mon, 25 Jan 2021 15:00:00 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2021/01/25/quest-towards-energy-efficiency-part-1/</guid><description>Alternative title: '_Obsessing over things that nobody else cares about_'</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Quest towards energy efficiency part 1: the water heater" /><p>While listening to the <a href="https://selfhosted.show/">SelfHosted podcast</a>, one of the hosts brought up their peculiar living
arrangement multiple times. Essentially, he and his family are living in an RV that runs off of batteries, has solar
panels, utilizes Home Assistant for automation, supports multiple mobile networking providers and also has some
Raspberry Pi-s running in a homelab. In such an environment, low power usage is critical.</p>
<p>That got me thinking: how much electricity am I currently using and how low can I go?</p>
<p>Could lowering my overall power usage help transition to an off-grid setup in the future?</p>
<h2 id="initial-measurements">
  <a class="heading-anchor" href="#initial-measurements">Initial measurements<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Before making any changes, it is important to make some measurements. After all, if you don&rsquo;t get an overview of the
current situation, then how are you going to do comparisons? Your local power company is measuring the total power usage
for you, so you might as well utilize that to get an overview of daily and monthly power usage.</p>
<p>In my situation, the monthly power use would be between 200-250 kWh and daily power usage would jump between 6 kWh and
13 kWh, depending on the day. I am not sure if that is normal power usage or not, but at least it&rsquo;s a starting point.</p>









<figure class="center">
  <a href="/posts/2021/01/25/quest-towards-energy-efficiency-part-1/media/2021-01-25-19-24-35.png">
    <img src="/posts/2021/01/25/quest-towards-energy-efficiency-part-1/media/2021-01-25-19-24-35_hu_7202c3bdfde569a6.webp"
     width="1280"
     height="326"
     loading="lazy"
     decoding="async"
     alt="Example daily power usage graph. Blue parts indicate nighttime pricing (cheaper).">

  </a>
  <figcaption class="center">Example daily power usage graph. Blue parts indicate nighttime pricing (cheaper).</figcaption>
</figure>

<h2 id="whats-using-all-this-power">
  <a class="heading-anchor" href="#whats-using-all-this-power">What&rsquo;s using all this power?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>There are many candidates for appliances that use the most power: water heater, refrigerator, electrical oven,
electrical kettle etc. With some of them, it&rsquo;s quite easy to reduce the power usage: just use it less! With others, it
might not be as straightforward.</p>
<p>For example, with a refrigerator, you cannot really use it less. Sure, you can try to open the door fewer times so that
it has to do less work, but you really shouldn&rsquo;t try to limit its operating window, as that can result in food going
bad. It will probably help if you got yourself a refrigerator that has a better efficiency rating, but that&rsquo;s it.</p>
<p>However, with a water heater, you are free to limit its use significantly. After all, the worst thing that can happen is
that you might run out of hot water while showering or washing the dishes. Today we will thus focus on an old water
heater and try to see how low we can go.</p>
<h2 id="reducing-the-total-power-usage-of-a-water-heater">
  <a class="heading-anchor" href="#reducing-the-total-power-usage-of-a-water-heater">Reducing the total power usage of a water heater<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>The way that a water heater works is quite simple: if the water temperature is below a threshold, heat it. This is
usually controlled with a dial on the water heater itself. After you have used hot water for a while, you will notice
the water heater kicking in and doing its thing.</p>
<p>A water heater can use quite a lot of power. In my case, it uses 2000W while heating the water. This result was measured
by using an electronic power usage meter that you plug between the appliance and the wall socket. From the data provided
by the power company, the days with showers or other activities that used hot water spiked up to 13 kWh, which is quite
a lot when compared to the daily average of 8 kWh.</p>
<p>Water heaters also have an insulation layer to prevent the water from losing heat. Once the water is heated up to the
desired temperature, it should be able to keep it at that temperature for quite some time without having to heat it up
again.</p>
<p>With that in mind, I tried a simple approach: buy a mechanical timer, set it to run at certain times throughout the day,
test out the results and find the sweet spot. After all, why would I want it to run during the night, when nobody is
using hot water anyway?</p>
<h2 id="initial-testing">
  <a class="heading-anchor" href="#initial-testing">Initial testing<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>I picked a sensible starting point: run for about 1-2 hours in the morning and again some time in the afternoon (16-18).
By starting with that, I should be able to avoid situations where I run out of hot water at the most inconvenient time.
This worked well, but due to the water heater potentially running for up to 4 hours, it would still mean a maximum of 8
kWh power use for the water heater alone.</p>
<p>During the next week, I experimented with shorter values. I limited the evening heat cycle to 30 minutes and went as low
as 45 minutes in the morning heat cycle. At that point the water didn&rsquo;t heat up enough in the mornings and the boost in
the afternoon didn&rsquo;t really resolve the problem, either, which meant that I found the low point.</p>
<p>With more recent tests, I have found that for our use case it is perfectly viable to set the timer to run for 90 minutes
in the morning and have hot (or warm) water for the rest of the day, while also allowing for comfortable showers in the
morning and afternoon. Just make sure to set the temperature setting to the highest value so that it does not stop
heating the water while the water heater is allowed to run.</p>
<h2 id="results">
  <a class="heading-anchor" href="#results">Results<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>While looking at daily power reports, a couple of things become clear:</p>
<ul>
<li>the spikes have now been replaced with a more stable usage</li>
<li>it is possible to limit the water heater usage down to 3 kWh per day without giving up too much convenience</li>
<li>a mechanical timer allows me to use power while it is cheap (nighttime)</li>
<li>with water heater use concentrated on one specific time slot, it is easier to identify other appliances with high
power usage</li>
<li>you will suddenly find motivation to shower as fast as possible, because who knows how much hot water you have left?</li>
</ul>









<figure class="center">
  <a href="/posts/2021/01/25/quest-towards-energy-efficiency-part-1/media/2021-01-25-19-25-14.png">
    <img src="/posts/2021/01/25/quest-towards-energy-efficiency-part-1/media/2021-01-25-19-25-14_hu_cecf508a14b274e.webp"
     width="1280"
     height="331"
     loading="lazy"
     decoding="async"
     alt="Not very hard to guess when the water heater is doing its job.">

  </a>
  <figcaption class="center">Not very hard to guess when the water heater is doing its job.</figcaption>
</figure>

<h2 id="is-it-worth-it">
  <a class="heading-anchor" href="#is-it-worth-it">Is it worth it?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Not from a financial standpoint, definitely. However, it does give a good feeling when you are living in a country that
is relying on one of the most polluting energy sources.</p>
<p>To be quite fair, at this point it has become more of a game for me than anything else. It&rsquo;s fun to find out the limits
and try to push them as far as you can go.</p>
<h2 id="are-there-better-solutions">
  <a class="heading-anchor" href="#are-there-better-solutions">Are there better solutions?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Probably. My solution here is cheap (the mechanical timer only cost 4 euros), but there could be smarter solutions that
learned your daily habits and tried to optimize the water heating process using that. However, predicting when you need
the hot water becomes much more difficult if you deviate from your usual routine. Your children found the wonders of
playing in a puddle and they need to shower at an unusual time? Well, there goes all that data collection and machine
learning effort.</p>
<p>Alternatively, you could risk getting electrocuted and get an attachment that will heat up water on-demand. The downside
with that option is the hassle and upfront investment of having your kitchen sink and shower set up like that.</p>
<h2 id="what-next">
  <a class="heading-anchor" href="#what-next">What next?<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>Now that one of the big ticket items is handled, I can shift focus to my computing setup.</p>
<p>What can you do to have a more efficient homelab?</p>
<p>Do you need to sacrifice anything in your attempt to balance data hoarding and low power use cravings?</p>
<p>How much power is your desktop PC using while doing nothing?</p>
<p>Stay tuned for future installments of my quest towards energy efficiency!</p>
<h2 id="2022-01-18-update">
  <a class="heading-anchor" href="#2022-01-18-update">2022-01-18 update<svg class="heading-anchor__icon" viewBox="0 0 24 24" width="0.75em" height="0.75em" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></a>
</h2>
<p>At some point I stopped using this trick because while I was paying a bit less
on my electricity bills, I still consumed a lot of power. On a 35 EUR power bill,
that would have meant about a 5 EUR reduction in cost. You still pay to have
those electrons moved to your home. Using the water heater on a lower temperature
setting throughout the day used less power in total due to having less water to
heat up and the hot water usage being a bit unpredictable.</p>
<p>However, with the current state of the energy market, the prices have been
multiplied. I&rsquo;ve gone back to this setup to take advantage of lower rates
during nighttime, which tend to be 2-4x cheaper. At these prices, there&rsquo;s a
real benefit to trying to use the off-peak hours. Let&rsquo;s see how well this works
out.</p>
]]></content:encoded></item><item><title>Running on fumes</title><link>https://ounapuu.ee/posts/2020/08/29/running-on-fumes/</link><pubDate>Sat, 29 Aug 2020 16:42:19 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/29/running-on-fumes/</guid><description>0GB ought to be enough for anybody.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="Running on fumes" /><p>After a run-of-the-mill Windows BSOD, I was redirected to the UEFI
settings and was presented with this fun little bug:</p>









<figure class="center">
  <a href="/posts/2020/08/29/running-on-fumes/media/20-08-28-21-55-32-1970.jpg">
    <img src="/posts/2020/08/29/running-on-fumes/media/20-08-28-21-55-32-1970_hu_34633266f8b0b44d.webp"
     width="1024"
     height="768"
     loading="lazy"
     decoding="async"
     alt="0GB ought to be enough for anybody.">

  </a>
  <figcaption class="center">0GB ought to be enough for anybody.</figcaption>
</figure>

]]></content:encoded></item><item><title>This page looks better in the app</title><link>https://ounapuu.ee/posts/2020/08/02/this-page-looks-better-in-the-app/</link><pubDate>Sun, 02 Aug 2020 09:33:41 +0300</pubDate><author>ihavesomethoughtsonyourblog@ounapuu.ee (Herman Õunapuu)</author><guid>https://ounapuu.ee/posts/2020/08/02/this-page-looks-better-in-the-app/</guid><description>I'm not sure it does.</description><content:encoded><![CDATA[<img src="https://ounapuu.ee/media/cover_hu_4fe4cf2661554252.jpg" width="1200" height="630" alt="This page looks better in the app" /><p>You&rsquo;re a web developer at a social media company that has recently made a big push for
modernizing their frontend for the mobile-first era. It has taken a lot of time and effort from many people.
Countless challenges, arguments, testing.</p>
<p>The release is near. You&rsquo;re probably a bit anxious. After all, the site is visited by millions of users every day.
What if something breaks? Will the users like the redesign?</p>
<p>It&rsquo;s live.</p>
<p>You navigate to the site on your phone.</p>









<figure class="center">
  <a href="/posts/2020/08/02/this-page-looks-better-in-the-app/media/image1.png">
    <img src="/posts/2020/08/02/this-page-looks-better-in-the-app/media/image1_hu_297e4aa97a230c5.webp"
     width="466"
     height="800"
     loading="lazy"
     decoding="async"
     alt="Huh.">

  </a>
  <figcaption class="center">Huh.</figcaption>
</figure>

<p>Okay, it&rsquo;s recommending the app. That&rsquo;s fine though, you still have the option of using reddit in the browser.</p>
<p>You refresh the page.</p>









<figure class="center">
  <a href="/posts/2020/08/02/this-page-looks-better-in-the-app/media/image2.png">
    <img src="/posts/2020/08/02/this-page-looks-better-in-the-app/media/image2_hu_dab418bed295a3db.webp"
     width="464"
     height="800"
     loading="lazy"
     decoding="async"
     alt="I think it looks fine.">

  </a>
  <figcaption class="center">I think it looks fine.</figcaption>
</figure>

<p>I can&rsquo;t imagine what the web developer who had to implement this was feeling.</p>
<p>To add insult to injury, this is what happens when you try to navigate to a subreddit
on the mobile site:</p>









<figure class="center">
  <a href="/posts/2020/08/02/this-page-looks-better-in-the-app/media/image3.png">
    <img src="/posts/2020/08/02/this-page-looks-better-in-the-app/media/image3_hu_467cf0e655534400.webp"
     width="464"
     height="800"
     loading="lazy"
     decoding="async"
     alt="I think they&#39;re trying to tell me something.">

  </a>
  <figcaption class="center">I think they&#39;re trying to tell me something.</figcaption>
</figure>

<p>There is a workaround to this: navigate to the subreddit from Google and you will be fine, as long as you don&rsquo;t
navigate elsewhere.</p>
<p>Why even bother with developing the website if all it does is advertise the app everywhere?</p>
]]></content:encoded></item></channel></rss>