<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Think before you push the button</title>
        <link>https://stingr.net/post/</link>
        <description>Recent content in Posts on Think before you push the button</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Sun, 08 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://stingr.net/post/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Vibe coding in Rust</title>
        <link>https://stingr.net/p/vibe-coding-in-rust/</link>
        <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/vibe-coding-in-rust/</guid>
        <description>&lt;p&gt;While my machines are still down I am trying to use claude to convert one of my old projects to Rust.&lt;/p&gt;
&lt;p&gt;It was originally written in Go (I think I started it on go 1.2). Well, &lt;em&gt;originally&lt;/em&gt; it was in C++, on boost::asio, and it was glorious piece of shit.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t really have any problems with runlib in Go, except it was a bit awkward around the edges where I needed to lock goroutine to a system thread on windows to prevent win32.GetThreadDesktop from exploding. And on linux I needed to do massive cgo abuse plus &lt;a class=&#34;link&#34; href=&#34;https://chromium.googlesource.com/linux-syscall-support/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know if it&amp;rsquo;s possible to do better with Rust but the ability to convert the thing at once is valuable - now I can try focusing on rearranging individual pieces to be simpler and to use more of the features of Rust.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Happy HW Failure day</title>
        <link>https://stingr.net/p/happy-hw-failure-day/</link>
        <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/happy-hw-failure-day/</guid>
        <description>&lt;p&gt;The server which hosted this website and a bunch of my data-hoarding and data-intensive operations has decided to fuck off, with roughly this failure&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611236] {1}[Hardware Error]: Hardware error from APEI Generic Hardware Error Source: 32992
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611245] {1}[Hardware Error]: event severity: fatal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611261] {1}[Hardware Error]:  Error 0, type: fatal
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611266] {1}[Hardware Error]:   section_type: PCIe error
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611269] {1}[Hardware Error]:   port_type: 4, root port
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611272] {1}[Hardware Error]:   version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611275] {1}[Hardware Error]:   command: 0x0547, status: 0x4010
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611279] {1}[Hardware Error]:   device_id: 0000:00:01.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611284] {1}[Hardware Error]:   slot: 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611286] {1}[Hardware Error]:   secondary_bus: 0x01
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611289] {1}[Hardware Error]:   vendor_id: 0x8086, device_id: 0x3c02
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611291] {1}[Hardware Error]:   class_code: 060400
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611294] {1}[Hardware Error]:   bridge: secondary_status: 0x0000, control: 0x0003
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611297] {1}[Hardware Error]:   aer_cor_status: 0x00000001, aer_cor_mask: 0x000031c1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611300] {1}[Hardware Error]:   aer_uncor_status: 0x00000020, aer_uncor_mask: 0x00318000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611304] {1}[Hardware Error]:   aer_uncor_severity: 0x00067030
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611306] {1}[Hardware Error]:   TLP Header: 00000000 00000000 00000000 00000000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611312] GHES: Fatal hardware error but panic disabled
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[  134.611315] Kernel panic - not syncing: GHES: Fatal hardware error
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Backups exist, but not for all crap that I ran there. So I&amp;rsquo;m on a data diet until we attempt a replacement 2 weeks from now.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Daily WTF: AOOSTAR WTR Pro Power Edition</title>
        <link>https://stingr.net/p/daily-wtf-aoostar-wtr-pro-power-edition/</link>
        <pubDate>Wed, 25 Feb 2026 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/daily-wtf-aoostar-wtr-pro-power-edition/</guid>
        <description>&lt;p&gt;I want this to be an optimistic happy post, I really do. However it just doesn&amp;rsquo;t work that way isn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;Given that everything is going to shit quickly, including the hardware prices, I thought I&amp;rsquo;ll stock up on hard drives and populate my storage unit with newer disks. Namely, factory recertified HAMR Seagate drives, of which I&amp;rsquo;ve got 2x24T and 2x28T. During the course of this forklift I finally managed to put together a working ATA LPM configuration which does not wreck ata port 3 on Aoostar WTR Pro (I mentioned it in one of the previous posts).&lt;/p&gt;
&lt;p&gt;However.&lt;/p&gt;
&lt;p&gt;What happens instead is, when I insert all 4 disks, the machine doesn&amp;rsquo;t start properly. It starts spinning up, but power cuts off. If you allow it to suffer, it&amp;rsquo;ll restart and spin again about 10 times, eventually for drives to gain enough momentum and spin without power fizzling out. And at this point the machine actually proceeds to boot up and everything is grand. But! If for some reason you spin down all the drives, and then try to spin them up, you lose power and have yourself an outage.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t imagine nobody tried to put 4 HAMR drives into this thing. Anyway, there are 2 options - either it&amp;rsquo;s the PSU and using 200w one will help, or it&amp;rsquo;s a 12v rail limit and then I need to throw this thing out and put together a new nas - and now it&amp;rsquo;s the worst time to do that.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>RFC9580 and you</title>
        <link>https://stingr.net/p/rfc9580-and-you/</link>
        <pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/rfc9580-and-you/</guid>
        <description>&lt;p&gt;I have created my original GPG key more than 20 years ago and in the beginning
I have used it extensively, but then kind of didn&amp;rsquo;t. That said, I have a feeling
that I&amp;rsquo;d need to use public crypto a bit more often in the days ahead. To make it
easier, I decided to migrate to Sequoia-PGP, rfc9580, etc.&lt;/p&gt;
&lt;p&gt;Well it turns out that while I can generate so-called v6 key (rfc9580), I can&amp;rsquo;t
host it on any of the keyservers, because neither hagrid nor hockeypuck support
this shit. Now I&amp;rsquo;ve stored it in DNS, but that doesn&amp;rsquo;t work for everyone?&lt;/p&gt;
&lt;p&gt;In any case, new key&amp;rsquo;s fingerprint is 693A7DA72B998E1507AE847E394E12F648187357F023A0D7304F9A6570CCCB69&lt;/p&gt;
</description>
        </item>
        <item>
        <title>How to prepare for ... what, exactly</title>
        <link>https://stingr.net/p/how-to-prepare-for-...-what-exactly/</link>
        <pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/how-to-prepare-for-...-what-exactly/</guid>
        <description>&lt;p&gt;In my final post for 2025 I theorised that is was the worst year yet. So the coming year (of which we already had a few days) is quickly doing the &amp;ldquo;yet&amp;rdquo; bit, starting with the Special Military Trumperation in which &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/The_Fort_Bragg_Cartel&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Fort Bragg Cartel&lt;/a&gt; actually managed to not completely fuck it up (unlike &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/2019_SEAL_Team_Six_operation_in_North_Korea&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;that time in North Korea&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I actually thought this&amp;rsquo;ll happen before the end of February. But what does it mean exactly, except for the bragging part that I was right? I could probably &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=Gq3v-Y6cvLI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bet on it&lt;/a&gt;, like &lt;a class=&#34;link&#34; href=&#34;https://polymarket.com/@0x31a56e9E690c621eD21De08Cb559e9524Cdb8eD9-1766730765984&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;this dude&lt;/a&gt; who is seemingly clairvoyant because they bought Venezuela war bets right before the invasion? Or was this an alt for Pete Kegsbreath?&lt;/p&gt;
&lt;p&gt;I think this year we&amp;rsquo;ll finally see the effects of the shitshow on the global and US-dependent economy; this is the first year in my career when I am genuinely uneasy (that&amp;rsquo;s an euphemism for &lt;em&gt;scared shitless&lt;/em&gt;) about the prospects of the continued employment - it doesn&amp;rsquo;t matter if you&amp;rsquo;re doing a good timely work when the pressure happens, &lt;a class=&#34;link&#34; href=&#34;https://www.psychologytoday.com/ie/blog/reaching-across-the-divide/202105/thinking-through-perceived-scarcity&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;perceived scarcity&lt;/a&gt; leads to suboptimal outcomes. After all, AI doesn&amp;rsquo;t really need to be capable of replacing workers - their bosses need to be convinced that AI is capable of doing so.&lt;/p&gt;
&lt;p&gt;And, speaking of convincing, I&amp;rsquo;m genuinely afraid that comunist party will convince themselves that their &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Import_substitution_industrialization&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;импортозамещение&lt;/a&gt; of ASML is successful enough, so they can wreck taiwan together with their chip manufacturing, sabotage ASML and fabs elsewhere, and become the world&amp;rsquo;s sole source of high performance computing.&lt;/p&gt;
&lt;p&gt;The US has already surpassed most of the authoritarian countries on authoritarian scale. I don&amp;rsquo;t see any way for that to reverse. Some people genuinely think that midterm elections will be a factor. These are the same people who told me about institutions, checks and balances, etc.&lt;/p&gt;
&lt;p&gt;And to finish this pointless rant - an answer to the question &amp;ldquo;why do you care so much&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;There are lots of very public people who confidently tell their audience that they know how the world works. What follow is, frankly, absolute garbage. Either it&amp;rsquo;s some stupid conspiracy theory about jews, or soros, or if we go back in time some rotschilds and lizard people. Or it&amp;rsquo;s some lopsided ideological bullshit like geopolitics, or evangelical eternal battle between angels and demons. Unfortunately most of these people didn&amp;rsquo;t actually try to manage even the simplest logistical chain for a factory. Or a construction of a datacenter. It is actually funny to read when somebody tries to explain to me how easily Intel can start fabbing 5nm in the US, like, in a month or so.&lt;/p&gt;
&lt;p&gt;Unlike these conspiracy theorists, I don&amp;rsquo;t know how the world works. I know how &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=MiUHjLxm3V0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;parts of it work&lt;/a&gt;, and I know &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Thinking_In_Systems:_A_Primer&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;some of the connections within and between&lt;/a&gt; these parts. And some of these connections depend on the rules, stability, predictability, and free global supply chain. And I am scared shitless of these bulls in china shop accidentally breaking a connection which we can no longer replace.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>The worst year</title>
        <link>https://stingr.net/p/the-worst-year/</link>
        <pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/the-worst-year/</guid>
        <description>&lt;p&gt;Of course it could be worse. The problem is - there&amp;rsquo;s always &lt;em&gt;could be worse&lt;/em&gt;, but there&amp;rsquo;s also &lt;em&gt;could be better&lt;/em&gt;. It&amp;rsquo;s hard to operate in hypotheticals but sometimes it is blatantly clear that &lt;strong&gt;it could be better&lt;/strong&gt;, damn it.&lt;/p&gt;
&lt;p&gt;I participate in a few chat groups, most of them just people who know each other for a while (20 years or so). And I was surprisingly horrified to see some of these people go full moral nihilism this year, quote &amp;ldquo;if ICE would offer a 350k salary, I&amp;rsquo;ll go there&amp;rdquo;. And no moral qualms against working at certain companies, which names are withheld because they index the internet and make a list of future targets for drones.&lt;/p&gt;
&lt;p&gt;My resolution for the next year would be to avoid working for ICE and similar companies.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Hoarding useful stuff</title>
        <link>https://stingr.net/p/hoarding-useful-stuff/</link>
        <pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/hoarding-useful-stuff/</guid>
        <description>&lt;p&gt;I hope you enjoyed my stupid take yesterday, let&amp;rsquo;s try if I can make a less stupid one.&lt;/p&gt;
&lt;p&gt;When you start trying to do something useful, like DIY electronics, or furniture, or art&amp;amp;craft (&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=IuYiAhDanY8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;with uncle rob&lt;/a&gt;), at the beginning of the journey you won&amp;rsquo;t get proper organization with shelves and boxes and categories (unless you&amp;rsquo;re made of money, have spare room and someone competent set it up for you). As your hobby progresses, you will likely end in a situation when you have many medium-sized containers with completely unorganized contents - like, one part of each type in each of the containers. And there could be &lt;em&gt;many&lt;/em&gt; kinds of parts, so it&amp;rsquo;ll be completely disorganized mess without any way of finding any of that.&lt;/p&gt;
&lt;p&gt;I am saying this for a long time that the most critical application for &lt;em&gt;AI&lt;/em&gt; now is a machine which can sort garbage. You know, all that stuff you dump into recycle bin, which then gets to some real people who basically do slave labor and sort that shit out into categories. That is the real problem to solve, not any of this vibe science bullshit (which will not work anyway, but try telling that to people peddling it - it&amp;rsquo;s like trying to tell a jehova&amp;rsquo;s witness that no, your bible-themed fanfic doesn&amp;rsquo;t contain all the answers to everything).&lt;/p&gt;
&lt;p&gt;Anyway, once that problem is solved, it should be a short hop to solving functional hoarding described above. Just when you release a part, it gets sorted into a bucket! We can even have dynamically printed &lt;a class=&#34;link&#34; href=&#34;http://gridfinity.xyz&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;gridfinity&lt;/a&gt;-style buckets! How cool is that!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Originalism as poor design doc hygiene</title>
        <link>https://stingr.net/p/originalism-as-poor-design-doc-hygiene/</link>
        <pubDate>Mon, 29 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/originalism-as-poor-design-doc-hygiene/</guid>
        <description>&lt;p&gt;I was listening to another pointless politics-adjacent podcast today, and they were discussing this concept that some people would know only through conservative politics lens - &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Originalism&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;originalism&lt;/a&gt;. Wikipedia tells us that it&amp;rsquo;s a legal theory in the United States which bases constitutional, judicial, and statutory interpretation of text on the original understanding at the time of its adoption. Originalism consists of a family of different theories of constitutional interpretation and can refer to original intent or original meaning.&lt;/p&gt;
&lt;p&gt;As you&amp;rsquo;d immediately see this paragraph is also a perfect example of another concept - &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/American_exceptionalism&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;american exceptionalism&lt;/a&gt;. I can assure you, this idiocy about reading the old, outdated text and trying to govern the current modern state is not unique to the US, and it predates US by large margin. But that&amp;rsquo;s not what I wanted to write about.&lt;/p&gt;
&lt;p&gt;In our industry we have this idea and concept of a &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Software_design_description&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;design document&lt;/a&gt;, which is sometimes used to describe the system as it should be implemented, and this is the text which will likely be reviewed and debated upon. It&amp;rsquo;s a useful concept, even though it gets abused a lot. Unfortunately in most cases design documents don&amp;rsquo;t include the concept of ongoing maintenance, and, what&amp;rsquo;s worse, they lack reasoning for choices taken. For example, the design doc could describe the API calls or a data structure chosen to hold some elements, but it would omit the reasons behind that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As the number of active users of the system is assumed to be below 100000, and the pinned state of a single user doesn&amp;rsquo;t exceed 10 kilobytes, let&amp;rsquo;s just hold all state in memory on a single machine, in a map.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most of the design docs actually don&amp;rsquo;t have that. They would only contain &amp;ldquo;the user state is stored in memory, in a map&amp;rdquo; and that&amp;rsquo;s it. But if we&amp;rsquo;re lucky, the software actually gets used and these original assumptions become invalid with time. Now we actually have a problem when we try to maintain the system - do we treat the original design as a gospel and never try changing it? What is going to break if we do? What is going to break if we don&amp;rsquo;t?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve actually encountered so many bad variations of this. The classic &amp;ldquo;layers&amp;rdquo; example would be some sophisticated layer next to the original map, the original map changed to hold pointers or IDs into that second layer, etc. And the change would have its own design doc with one of the main selling point be &amp;ldquo;we didn&amp;rsquo;t change the original design!&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You are supposed to change parts of the original design if they no longer fit for the purpose.&lt;/strong&gt; But to do that, you need to understand the intent and the assumptions behind each of the design choices. Then you would be able to switch to modern technology, or to simplify the system if something is not needed anymore.&lt;/p&gt;
&lt;p&gt;And to understand the intent, you need to have it written down somewhere.&lt;/p&gt;
&lt;p&gt;So when you write design documents of any kind, please include reasoning for your choices, and assumptions that reasoning is based upon. Things change.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Daily WTF: USB-C PD Edition</title>
        <link>https://stingr.net/p/daily-wtf-usb-c-pd-edition/</link>
        <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/daily-wtf-usb-c-pd-edition/</guid>
        <description>&lt;p&gt;About a year ago I&amp;rsquo;ve upgraded my home server setup to &lt;a class=&#34;link&#34; href=&#34;https://aoostar.com/products/aoostar-wtr-pro-4-bay-90t-storage-amd-ryzen-7-5825u-nas-mini-pc-support-2-5-3-5-hdd-%E5%A4%8D%E5%88%B6&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;AOOSTAR WTR PRO&lt;/a&gt;. It had its share of problems at the start, which sadly included sata instability on port 3. I had an email conversation with aoostar support, and they even sent me a replacement backplane which did not fix the problem. Eventually they&amp;rsquo;ve sent a new firmware, which kind of helped to the extent. For lack of the better hypothesis I&amp;rsquo;m now of the opinion that &lt;a class=&#34;link&#34; href=&#34;https://www.thomas-krenn.com/en/wiki/SATA_Link_Power_Management&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ATA LPM&lt;/a&gt; is to blame.&lt;/p&gt;
&lt;p&gt;One thing I haven&amp;rsquo;t tried then is to run this thing from an USB-C power supply. The documentation claims it&amp;rsquo;s possible, I briefly tried plugging it into Apple&amp;rsquo;s USB-C brick (heavy version), but the server would not start properly - it looks like it&amp;rsquo;s running out of power mid-startup, on repeat. I stopped experimenting and forgot about it.&lt;/p&gt;
&lt;p&gt;Now I&amp;rsquo;ve decided to upgrade my UPS setup, and for that I went with &lt;a class=&#34;link&#34; href=&#34;https://www.bluettipower.eu/products/elite-30-v2-portable-power-station?variant=55236137517432&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;BLUETTI Elite 30 V2 Portable Power Station&lt;/a&gt;. It was on sale (still is), there&amp;rsquo;s some content on the internet on &lt;a class=&#34;link&#34; href=&#34;https://github.com/Patrick762/hassio-bluetti-bt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;how to integrate it with the rest of the stuff&lt;/a&gt;, so I thought why not. And it has the USB-C PD output ports.&lt;/p&gt;
&lt;p&gt;You can guess where it&amp;rsquo;s going.&lt;/p&gt;
&lt;p&gt;These USB ports don&amp;rsquo;t do shit with the server. It loses power 3 seconds into boot and starts again. I tried plugging it through power-z but I don&amp;rsquo;t see anything wrong, it negotiates for 20V and tries dutifully to pull less than 100W, which is the same it does over AC. But still it doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty sure a more lengthy debug session is in order. Maybe it&amp;rsquo;s because the port is wonky? Or maybe it&amp;rsquo;ll start working if I eject all the hard drives? Or there&amp;rsquo;s something wrong with Bluetti&amp;rsquo;s implementation, although my phones work fine with it.&lt;/p&gt;
&lt;p&gt;Bottom line is, I just want things to work properly, I don&amp;rsquo;t want every fucking interaction to require a debugging session.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Vibeless coding: modularization and function calls</title>
        <link>https://stingr.net/p/vibeless-coding-modularization-and-function-calls/</link>
        <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/vibeless-coding-modularization-and-function-calls/</guid>
        <description>&lt;p&gt;Sometimes I think our industry is pretty unique for having constant inflow of people reinventing the square wheels all the time. Or, to be a bit more specific, some new fad appears and newcomers flock in just learning this new fad, without bothering to learn basics or fundamentals, or even to figure out when and where this fad is applicable. The most recent and egregious example of that is, of course, vibe coding subreddit which has a ton of people who claim to not know anything about programming, but they are very proficient in vibe coding! In most cases it goes as well as you’d expect, with vibes of a pickup-focused FIDO conference from 1990-s, in which men who don’t know how to not scare a woman away are teaching other men how to not scare a woman away.&lt;/p&gt;
&lt;p&gt;That was a clickbait, now that I have your attention, let’s do some boring stuff. Specifically let’s try to figure out how to build reliable distributed systems, using zero AI! You might have noticed how it’s now the norm in our world that systems just go bad, and you need to reboot or reset them, and nobody knows how to fix stuff? Right.&lt;/p&gt;
&lt;p&gt;Before we start I highly suggest reading just one book: &lt;a class=&#34;link&#34; href=&#34;https://web.stanford.edu/~ouster/cgi-bin/book.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Philosophy of software design&lt;/a&gt; by John Ousterhout.&lt;/p&gt;
&lt;h2 id=&#34;the-need-for-modularization&#34;&gt;The need for modularization
&lt;/h2&gt;&lt;p&gt;As it appears, there’s only one way to write software which you can understand and modify - to make it modular. It’s true because Ousterhout says so! Why are you not believing me now???&lt;/p&gt;
&lt;p&gt;Consider this simple mathematical expression:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is what you’d write in most of the modern programming languages, and then it’ll be the job of the programming language to figure out which are the correct sets of instructions for the given type of x, on which CPU hardware, etc. This is the simplest to express (but not simplest internally) form of modularization and it is also the simplest example to show that it is the only way to make programs maintainable by humans. If we don’t have this, then I’d need to write all these different types of divide by hand, and then how I’m supposed to change it or even understand that I’m dividing? I’d had to write a comment somewhere saying what this mess of assembly is doing.&lt;/p&gt;
&lt;p&gt;Same goes to the higher forms of modularization as well - which is everything upwards of functions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CopyFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;file:///etc/passwd&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;s3://public-bucket&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example we let &lt;code&gt;CopyFile&lt;/code&gt; figure out how to handle different URLs - and it’ll probably do it by subclassing URL handler and using interfaces etc.&lt;/p&gt;
&lt;p&gt;So it is obvious that we need modularization to make it possible to write things with adequate velocity. We also need correct modularization which hides unnecessary stuff and exposes required stuff, and you can read all about it in a book referenced above. But that is just for interfacing between human and machine.&lt;/p&gt;
&lt;p&gt;What if I told you we need modularization for machines as well?&lt;/p&gt;
&lt;p&gt;Before we do so, let’s do a refresher on how modularization basically works (on modern hardware, with compiled languages, most of the time).&lt;/p&gt;
&lt;h2 id=&#34;local-function-calls&#34;&gt;Local function calls
&lt;/h2&gt;&lt;p&gt;Modern CPUs, when you look at them from the “consumer” point of view, eat code instructions from memory and execute them. The instructions could be primitive (data copying, math) after which the execution pointer (usually a CPU register) will move to point at the next instruction in line. Or it could be control flow instructions which will modify execution pointer (JUMP or B code), sometimes they can be combined or used in conjunction with conditionals (for example, JNZ - jump if not zero). And, because the only way to do modules is to do function calls, all modern CPUs have an equivalent of a CALL instruction, which saves the address of a (normally) next instruction somewhere and then jumps into destination, so then destination at some point can execute RET and return the control. Now if you don’t know what stack buffer overrun yet, go read about it but please return.&lt;/p&gt;
&lt;p&gt;So with all that in mind, in the example with &lt;code&gt;x/2&lt;/code&gt; when, for example, CPU doesn’t support the floating point operations the compiler could have a function &lt;code&gt;fp_div&lt;/code&gt; somewhere in standard library and then call it. Or, if &lt;code&gt;x&lt;/code&gt; is of a custom type and we’re using &lt;code&gt;c++&lt;/code&gt;, the compiler could call our &lt;code&gt;operator/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But we’re not done yet with this control flow. What is happening now is &lt;strong&gt;blocking call&lt;/strong&gt; - the execution of a linear, imperative program is blocked until the control is returned. In provided example with &lt;code&gt;c++&lt;/code&gt; and division our execution core is a CPU core and the contents of the function are executed on the same core. But it doesn’t have to be - other function can launch calculations on other CPU cores, or sleep for 1 second - from the point of view of the function caller we are blocked until the function returns.&lt;/p&gt;
&lt;p&gt;Why does it have to be blocking? Actually it doesn’t, we just defined it poorly. Imagine this code fragment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Calculate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;value1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Calculate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;value2&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value3&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Together&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;value2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In this example, we don’t need &lt;code&gt;value1&lt;/code&gt; until we start computing &lt;code&gt;value3&lt;/code&gt;. We can write a framework or a language which would automatically handle such cases and spawn calculations in parallel in background. But our primitive imperative languages can’t do it by themselves, and even if we have such a framework we need to know what we’re doing.&lt;/p&gt;
&lt;p&gt;So, to summarize:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The only thing we need for making software is ability to define functions and call them.&lt;/li&gt;
&lt;li&gt;Most primitive way to do that is implemented in hardware on most modern CPUs.&lt;/li&gt;
&lt;li&gt;Function calls in imperative program are blocking the execution of a said program, until they return with a result.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;wtf-is-an-api&#34;&gt;WTF is an API
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;As we learned, it’s only with modular systems and abstractions we can build something great, because we’ll be building it standing on the shoulders of&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Strictly speaking, even the bare CPU with no operating system or library support has an API. It consists of the CPU instruction set which you can use, possibly, to write more complex functions, which in turn will be used to write more complex functions. The SOCs we get today usually come with an SDK which includes at least a compiler and a library to control various embedded things in that CPU, without resorting to assembly (functions like “go to deep sleep” or “initialize wifi” for esp32). But, on top of that, the operating system will offer you APIs to read/write files, do things with network, write things on the screen, etc. And your language will have a standard library which will usually plug into these OS APIs. It’s APIs all the way down and it’s pretty neat, until it doesn’t. And when it doesn’t it means we have an error somewhere which we need to handle. And if the error happens during long-running operation, we need to make sure our long-running operations are designed and implemented correctly. And that’s what we are going to cover next - errors and long-running operations.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Personal note organizers, how do they work</title>
        <link>https://stingr.net/p/personal-note-organizers-how-do-they-work/</link>
        <pubDate>Sat, 18 Oct 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/personal-note-organizers-how-do-they-work/</guid>
        <description>&lt;p&gt;I actually have this &lt;em&gt;very&lt;/em&gt; thorough post in the works about replacing old Nest doorbell with a new &lt;a class=&#34;link&#34; href=&#34;https://ui.com/us/en/physical-security/special-devices/doorbells&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Unifi Doorbell Pro 4&lt;/a&gt;. But putting it all together is not easy! I am trying to make it ring a digital chime, reliably and without wi-fi in the path, and nothing works; I think what should work is a relay trigger, but now I need a relay which accepts AC control input.&lt;/p&gt;
&lt;p&gt;So while that is not ready, what is the topic anyone (including me) can write on without any preparation and even without knowing shit about? Politics of course.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Not today.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today I am trying to start using personal data organizers (or whatever this thing is called nowadays) in a way which works? How is this supposed to work at all, if I’m lazy and disorganized? So far I tried:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://logseq.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Logseq&lt;/a&gt; then realized the android app is just an apk and it needs full permissions to all files.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://obsidian.md/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Obsidian&lt;/a&gt; - I spent a day setting up livesync (not the official one), mostly fighting with couchdb. It kind of works now, but then I found the one below.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://silverbullet.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Silverbullet&lt;/a&gt; which is the current favorite, just because I did set it up quickly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have no idea which one I’m going to stick with long term, but currently all my notes are in a silverbullet instance; I’m trying to actively use it for organizing travel, taxes, and of course for shitposting! What I don’t want to do yet is make my entire website a silverbullet, like the &lt;a class=&#34;link&#34; href=&#34;https://silverbullet.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;silverbullet.md&lt;/a&gt; itself.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cheap Yellow Displays</title>
        <link>https://stingr.net/p/cheap-yellow-displays/</link>
        <pubDate>Thu, 19 Jun 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/cheap-yellow-displays/</guid>
        <description>&lt;p&gt;I&amp;rsquo;m trying to decorate my house with Cheap Yellow Displays, buying a bunch of different models from aliexpress, with different levels of success. And I&amp;rsquo;m gonna tell you - why is the hardware so bad? So far I found that on the USB-C variant with capacitive screen (2432s024) usb-c isn&amp;rsquo;t a real one, it doesn&amp;rsquo;t work with usb-c power but only with A-to-C power (most likely, lack of proper CC resistors).&lt;/p&gt;
&lt;p&gt;Anyway, reason I&amp;rsquo;m posting this is so the internet (which is full of AI garbage) will contain at least 2 copies of this code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;i2c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# required for touchscreen&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sda&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;GPIO33&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;scl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;GPIO32&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;scan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;touchscreen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;cst816&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# interrupt_pin: 21&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;50ms&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reset_pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;GPIO25&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;on_touch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;logger.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Touch event!&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;on_release&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;logger.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Touch release!&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;condition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;lvgl.is_paused&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;then&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;logger.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;LVGL resuming&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;lvgl.resume&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;lvgl.widget.redraw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;light.turn_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;backlight&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Yeah, interrupt_pin didn&amp;rsquo;t work for me, only polling with update_interval. Also, scan:true but it will not show anything on boot, screen is reacting to touch but invisible on scan, how cool is that.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll have a properly sized post about it at some point.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>The plot thickens with MAX31865</title>
        <link>https://stingr.net/p/the-plot-thickens-with-max31865/</link>
        <pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/the-plot-thickens-with-max31865/</guid>
        <description>&lt;p&gt;My max31865 story is still ongoing. I managed to find a PT100 sensor to pair with my &lt;a class=&#34;link&#34; href=&#34;2025-04-20-max31865-conspiracy.md&#34; &gt;accidentally obtained boards&lt;/a&gt;. It worked in testing, but once I hooked up to the power supply I was using for my solar interface board all along, it doesn&amp;rsquo;t work! It complains about &amp;ldquo;over/under voltage&amp;rdquo; and can&amp;rsquo;t calculate the resistance. I thought it&amp;rsquo;s because the power supply is weak, so I added a 6300uf capacitor to the 5v line. It didn&amp;rsquo;t help. I still haven&amp;rsquo;t figured out what is happening, in the meantime I just powered it from USB-C 5v PSU. At least I have some temperature measurements; also, there&amp;rsquo;s apparently a PT1000 variant of the breakout somewhere in the mail, destined for my postbox. We&amp;rsquo;ll see if that one will be twitchy too.&lt;/p&gt;
&lt;p&gt;On a completely unrelated note I find it increasingly hard to do anything useful nowadays. I don&amp;rsquo;t know if that&amp;rsquo;s some new form of burnout, but I&amp;rsquo;m trying to find an interesting project to do and can&amp;rsquo;t. Everything is no fun. I should try what always helps - making a list of things to do.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Reinstalling old machine over the network</title>
        <link>https://stingr.net/p/reinstalling-old-machine-over-the-network/</link>
        <pubDate>Fri, 25 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/reinstalling-old-machine-over-the-network/</guid>
        <description>&lt;p&gt;I have an old machine in an undisclosed location which I use as one of the offsite archives. Unfortunately there was something with power there, and then I hit one or two bugs in f2fs so it died. No big deal, I asked the person who takes care of it to plug another SSD. But.&lt;/p&gt;
&lt;p&gt;The machine in question is &lt;strong&gt;HP ProLiant ML110 G6&lt;/strong&gt;. It has IPMI in it (well, HP&amp;rsquo;s own iLO to be precise). And it has a java applet which you can use for virtual console, if you nerf your JVM enough so it will allow ALL the unsecure protocols. Within this applet, you can attach a virtual CD rom which then can be used to boot the machine and install it. But unfortunately, fedora&amp;rsquo;s netinst images are too large for it. The reads are slow but also the applet fails after some time (or after a number of sectors read).&lt;/p&gt;
&lt;p&gt;So, how did I solve the problem? With the help of &lt;a class=&#34;link&#34; href=&#34;https://ipxe.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ipxe&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I used ipxe before but mostly to implement the automated software install - as opposed to classic pxelinux, ipxe can be scripted to download things over http which is much better than tftp, especially if you want to time reinstall 100 machines at once.&lt;/p&gt;
&lt;p&gt;Ipxe can be made into 1 megabyte ISO image. So that&amp;rsquo;s what I did - tried to boot into it, then fooled around in ipxe console to confirm that it can see the network card, then wrote a bootstrap script and ran &lt;code&gt;make bin/ipxe.iso EMBED=/home/stingray/script.kpxe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And this is what was in &lt;code&gt;script.kpxe&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#!ipxe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;net0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;192.168&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;net0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;netmask&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;255.255&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;255.192&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;net0&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gateway&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;192.168&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dns&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;8.8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;8.8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;iflinkwait&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;net0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ifstat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# The following is from https://ipxe.org/howto/fedora&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Set source URI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mirror&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;download&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fedoraproject&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pub&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fedora&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;linux&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;releases&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Detect CPU architecture and calculate repository URI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;cpuid&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ext&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;29&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x86_64&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i386&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mirror&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Everything&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Start installer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;kernel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;images&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pxeboot&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vmlinuz&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;initrd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;initrd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;192.168&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.13&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;92.168&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;26&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;myhostname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;enp30s0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;none&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rdp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rdp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;INSTALLER&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rdp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FREELUIGI&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nameserver&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;8.8&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;8.8&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inst&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;geoloc&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;initrd&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;images&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pxeboot&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;initrd&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;img&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Of course this would look much simpler if you have working DHCP on the network. I didn&amp;rsquo;t.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>MAX31865 conspiracy</title>
        <link>https://stingr.net/p/max31865-conspiracy/</link>
        <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://stingr.net/p/max31865-conspiracy/</guid>
        <description>&lt;p&gt;I&amp;rsquo;ve finally decided to install solare electrical (&lt;em&gt;photovoltaic&lt;/em&gt;) system. Unfortunately this means I need to get rid of existing solar heating system. Not a big deal, except I&amp;rsquo;ve used the data from the controller to &lt;a class=&#34;link&#34; href=&#34;https://badrpc.net/20231014-connect-deltasol-controller-to-esphome/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;track the hot water temperature&lt;/a&gt;. So, naturally, the idea was to put together something which can take existing PT1000 leads in.&lt;/p&gt;
&lt;p&gt;ESPHome has a &lt;a class=&#34;link&#34; href=&#34;https://esphome.io/components/sensor/max31865.html#max31865-platinum-rtd-temperature-sensor&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;component&lt;/a&gt;, so naturally I went to aliexpress.com and ordered 2 breakouts which look the part. Unfortunately, these ended up having 430 ohm ref resistor, which means that they can only be used with PT100. Now, it doesn&amp;rsquo;t seem to be possible to know if the breakout offered on aliexpress has 430 or 4300 ohm resistor in it. So I ether need to find 4300-ohm breakout, or I need to unsolder the resistor and solder another one in place.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Small and Meaningless things for small people</title>
        <link>https://stingr.net/p/small-and-meaningless-things-for-small-people/</link>
        <pubDate>Sun, 09 Mar 2025 22:25:55 +0100</pubDate>
        
        <guid>https://stingr.net/p/small-and-meaningless-things-for-small-people/</guid>
        <description>&lt;p&gt;For a while now I&amp;rsquo;m working (slowly) on a monumental series of articles about function calls, RPC protocols and arrangements, APIs - all in line to present best and worst practices of modern software engineering. I would like to do it faster, but:&lt;/p&gt;
&lt;blockquote class=&#34;bluesky-embed&#34; data-bluesky-uri=&#34;at://did:plc:t6ubj2wlhc34awzcymh3qpur/app.bsky.feed.post/3ljxk7izke223&#34; data-bluesky-cid=&#34;bafyreiewof6cbmfdj6t5hawofzf2gcb7yx2dfi224b2bnzlbaz4fc5fbpu&#34;&gt;&lt;p lang=&#34;en&#34;&gt;Any country, corp, org, or individual that uses Starlink is subject to the whims, wishes, demands and insults of The Owner. Do so at your peril.&lt;br&gt;&lt;br&gt;&lt;a href=&#34;https://bsky.app/profile/did:plc:t6ubj2wlhc34awzcymh3qpur/post/3ljxk7izke223?ref_src=embed&#34;&gt;[image or embed]&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ron Filipkowski (&lt;a href=&#34;https://bsky.app/profile/did:plc:t6ubj2wlhc34awzcymh3qpur?ref_src=embed&#34;&gt;@ronfilipkowski.bsky.social&lt;/a&gt;) &lt;a href=&#34;https://bsky.app/profile/did:plc:t6ubj2wlhc34awzcymh3qpur/post/3ljxk7izke223?ref_src=embed&#34;&gt;March 9, 2025 at 5:18 PM&lt;/a&gt;&lt;/blockquote&gt;&lt;script async src=&#34;https://embed.bsky.app/static/embed.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;
&lt;p&gt;That&amp;rsquo;s the new reality, folks. Apparently we are all small men, exist at the whim of the new &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Louis_XIV&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;sun king&lt;/a&gt;. &lt;a class=&#34;link&#34; href=&#34;https://sarahkendzior.substack.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Who fucking knew&lt;/a&gt; we will end up here.&lt;/p&gt;
&lt;p&gt;Well, nothing matters anymore, so let&amp;rsquo;s try doing some completely meaningless things instead! For example, systemd service hardening!&lt;/p&gt;
&lt;h2 id=&#34;systemd-analyze-security&#34;&gt;systemd-analyze security
&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s a starting point for y&amp;rsquo;all. Run &lt;code&gt;systemd-analyze security sshd&lt;/code&gt;. Looks funny, isn&amp;rsquo;t it. All right, to bleach the console run &lt;code&gt;systemd-analyze security irqbalance&lt;/code&gt; (all commands assume fedora 41). But for one &lt;code&gt;irqbalance&lt;/code&gt; we&amp;rsquo;ve got a hundred services which say &amp;ldquo;AAAA UNSAFE&amp;rdquo;. What&amp;rsquo;s going on?&lt;/p&gt;
&lt;p&gt;Same thing as always - it is hard to add security as an afterthought. Historically, all the services were barely protected - before systemd and selinux, best in class was &amp;ldquo;run as a different user&amp;rdquo;. With selinux, it became possible to control all aspects of what the service does - except that almost nobody is capable of doing it, because you need to understand in the greatest detail what the service does and how, and the prevailing culture in our industry is such as the author of the service will rarely bother with that.&lt;/p&gt;
&lt;p&gt;Systemd services brought massive quality of life increase in terms of service configuration, but also provided a few options to improve service security, which are less heavy than selinux. Except even this easy mode is too hard for everyone.&lt;/p&gt;
&lt;p&gt;Anyway, supposedly I care. With selinux, technically I can run things in permissive and use &lt;code&gt;audit2allow&lt;/code&gt; to produce or fine-tune a policy. It&amp;rsquo;d be nice if similar things existed for systemd? Well, it does, it has an unsurprising name &lt;a class=&#34;link&#34; href=&#34;https://www.synacktiv.com/publications/systemd-hardening-made-easy-with-shh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Systemd Hardening Helper&lt;/a&gt; and it works! To an extent. There are a bunch of todos and not all hardening options are implemented.&lt;/p&gt;
&lt;p&gt;The basic idea is the same as audit2allow - run the service under strace and parse it. That&amp;rsquo;s it, the UX is reasonably good, and while - as mentioned - not all options are covered, it provides a good starting point for further improvements.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s written in Rust, so here&amp;rsquo;s a chance to learn more of it and improve the security of everyday services. And with all the shitshow going on, we need all the security we can get.&lt;/p&gt;
&lt;p&gt;Until the next time, folks. Please try shielding yourselves from &lt;a class=&#34;link&#34; href=&#34;https://www.space.com/space-exploration/launches-spacecraft/spacex-falcon-9-rocket-debris-creates-dramatic-fireball-over-europe-crashes-in-poland&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;orbital bombardment&lt;/a&gt; in the meantime.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Rustic vs Restic</title>
        <link>https://stingr.net/p/rustic-vs-restic/</link>
        <pubDate>Fri, 10 Jan 2025 22:18:06 +0100</pubDate>
        
        <guid>https://stingr.net/p/rustic-vs-restic/</guid>
        <description>&lt;p&gt;As always, I promised more updates and then immediately disappeared. This is a common pattern - or at least it&amp;rsquo;s something I do regularly. We have this tool at work called &amp;ldquo;snippets&amp;rdquo;, and I usually start writing there but then it&amp;rsquo;s kind of hard to maintain consistent schedule. I should probably write a dedicated rant about this at some point.&lt;/p&gt;
&lt;p&gt;Anyway, today it&amp;rsquo;s going to be short and pointless.&lt;/p&gt;
&lt;h2 id=&#34;a-story-of-some-backups&#34;&gt;A story of some backups
&lt;/h2&gt;&lt;p&gt;For a long time I was using &lt;a class=&#34;link&#34; href=&#34;https://borgbackup.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;borg-backup&lt;/a&gt; for my personal backup needs and it was dire. It was painful to manage and work with (I wrote a custom wrapper so it could work over https), the performance was awful. Then &lt;a class=&#34;link&#34; href=&#34;https://restic.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;restic&lt;/a&gt; appeared, and I almost jumped on it full speed. Then I realized that without compression my backups are 5x bigger than they should be.&lt;/p&gt;
&lt;p&gt;Anyway, at some point restic finally added compression, so this time I&amp;rsquo;m definitely going to do it! However, it just so happened that &lt;a class=&#34;link&#34; href=&#34;https://restic.readthedocs.io/en/stable/100_references.html#pack-format&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pack size&lt;/a&gt; was capped at 16 megabytes or so, and when writing to the filesystem it produces a gazillion of files. Which is not &lt;code&gt;du&lt;/code&gt;-friendly, or any fs-friendly at all.&lt;/p&gt;
&lt;p&gt;At that time I was experimenting with haystack-type storages (specifically, I wanted to write a library which gives you an append-only haystack with leveldb-based index on the side), so naturally I wrote a rest-server on top of it. And it was great! It just, you know, takes more backups and that&amp;rsquo;s it. Shiny!&lt;/p&gt;
&lt;p&gt;This xmas I decided to shuffle things around, including with the backups (which reached 3T). So I started digging some threads and stumbled upon a post by some dude who was saying that in &lt;code&gt;rustic&lt;/code&gt; packsize is a function of the reposize. At first, I thought &amp;ldquo;huh weird typo&amp;rdquo;. But then - well, there&amp;rsquo;s the &lt;a class=&#34;link&#34; href=&#34;https://rustic.cli.rs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;whole restic rewrite in rust&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s it, folks. I&amp;rsquo;m moving to rustic. Repacking all my backups in the process. I hope I&amp;rsquo;ll still have at least some of my data.&lt;/p&gt;
&lt;p&gt;Next up: how to replace a backplane in Aoostar WTR Pro (and why).&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Comments via Bluesky</title>
        <link>https://stingr.net/p/comments-via-bluesky/</link>
        <pubDate>Sat, 28 Dec 2024 22:38:47 +0100</pubDate>
        
        <guid>https://stingr.net/p/comments-via-bluesky/</guid>
        <description>&lt;p&gt;In my new year&amp;rsquo;s &amp;ldquo;resolution&amp;rdquo; I have &amp;ldquo;resolved&amp;rdquo; to add comments to this site via bluesky. That was definitely fun but only to an extent; next time I shall pledge to use unreal engine 5 for comments or something.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;UPDATE: That was a bad idea. While bluesky looks nice as a replacement to
xwitter, without direct posting box and styling which I can&amp;rsquo;t do it doesn&amp;rsquo;t
look good at all as a comment engine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anyway, there seems to be no &amp;ldquo;official&amp;rdquo; social options for bluesky in any of the themes I tried (but I tried only a few), but there&amp;rsquo;s a ton of specific recipes on the internet, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/czue/bluesky-comments&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This&lt;/a&gt; seems to have the most
features, but it infects your computer with &lt;code&gt;node_modules&lt;/code&gt;, and we all know it
doesn&amp;rsquo;t end well for human civilization.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.brycewray.com/posts/2024/11/simple-hugo-shortcode-embedding-bluesky-posts/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This&lt;/a&gt;
just embeds the entire bsky post in your page. If I do that, it&amp;rsquo;ll be the most
good looking part of the website, and I can&amp;rsquo;t allow that. People who elected
to read this must suffer.&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/nsideras/bluesky-js-comments/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This&lt;/a&gt; looks simple enough,
I&amp;rsquo;m going to try it here now.
&lt;ul&gt;
&lt;li&gt;This doesn&amp;rsquo;t add an edit box, only &amp;ldquo;Reply to this post on Bluesky to leave a comment&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;It looks like shit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.xvrc.net/posts/how-to-add-bluesky-comments-to-your-hugo-blog-a-step-by-step-guide/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;This&lt;/a&gt;
is supposedly a version of the first option without &lt;code&gt;node_modules&lt;/code&gt;. It also
looks like shit and that is what I ended up using &lt;strong&gt;for the whole day&lt;/strong&gt;! Then got rid of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It appears that everything except embedding the entire post looks like shit. And
all of this is read-only - that is, there&amp;rsquo;s no &amp;ldquo;enter comment here&amp;rdquo; box. If you
want to leave a comment, go to &lt;a class=&#34;link&#34; href=&#34;https://bsky.app&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;bsky.app&lt;/a&gt; and post there.&lt;/p&gt;
&lt;p&gt;And after fiddling with it for a day I&amp;rsquo;ve decided that UX is terrible. We&amp;rsquo;ll get back to it again in a few months.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Useful technical content begins now</title>
        <link>https://stingr.net/p/useful-technical-content-begins-now/</link>
        <pubDate>Sat, 28 Dec 2024 01:35:24 +0100</pubDate>
        
        <guid>https://stingr.net/p/useful-technical-content-begins-now/</guid>
        <description>&lt;p&gt;It&amp;rsquo;s this time of the year when people are trying to make a summary of
achievements and make &amp;ldquo;resolutions&amp;rdquo; for the new year. Usually none of that is
useful, especially the resolutions part. But it&amp;rsquo;s definitely entertaining to
watch and especially to participate. The part I like the most is when it&amp;rsquo;s
around March, and you look at the list of your resolutions, and you haven&amp;rsquo;t done
a single thing. But I digress.&lt;/p&gt;
&lt;p&gt;My resolution for the new year would be to waste less time and finally produce
some more useful content. Specifically that would be code and documentation,
which other people (including, but not limited to, you, dear reader) can use to
make the world less shitty place.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s one problem which plays into this whole &amp;ldquo;resolutions are never done&amp;rdquo;
trope. I think most of the content I can produce is trivial and isn&amp;rsquo;t worth it.
Nobody will learn anything useful from it and nothing will be done with the
world, it&amp;rsquo;ll remain at least as shitty as it is. This mindset really cripples my
motivation and as the result - nothing in done.&lt;/p&gt;
&lt;p&gt;But in reality this is false. To prove this I&amp;rsquo;m going to undraft an incomplete
post I was sitting on for 2 years about institutional knowledge, which I haven&amp;rsquo;t
finished because I wasn&amp;rsquo;t able to find a good punchline. The fact is, while I
think some of the things I know are trivial, unfortunately most of the people in
our industry don&amp;rsquo;t have a clue, and others (and their users) are suffering
because of it. And this is why I&amp;rsquo;m going to make much more of the effort this
year to share my rants with you.&lt;/p&gt;
&lt;p&gt;The real problem with this will be not that it&amp;rsquo;s too trivial, but the opposite.
For some of the topics to accept the conclusion you need to be well-versed in
the prerequisites, which we also need to cover. This is going to be fun. I shall
enable comments in which you&amp;rsquo;ll be able to tell me how much sense I am making
and hopefully that&amp;rsquo;ll direct me to the most efficient approach. I think I saw
the way to do it with bluesky? But first I need to move this page to cloudflare
for more flexibility (this is done!), and to protect you against occasional IPv6 hiccups (TODO:
write about IPv6 hiccups, troubleshooting, and the &amp;ldquo;root cause&amp;rdquo;; also TODO:
write about why there&amp;rsquo;s no such thing as root cause and what is, in my opinion,
the shitty state of our industry wrt postmortems).&lt;/p&gt;
&lt;p&gt;So in no particular order I shall have a:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Story about replacing my old HP Microserver Gen8 with new Aoostar WTR Pro
(not without problems! still ongoing!)&lt;/li&gt;
&lt;li&gt;Rant about rootless podman&lt;/li&gt;
&lt;li&gt;Story about replacing old ikea tradfri gateway with HomeAssistant +
Zigbee2mqtt&lt;/li&gt;
&lt;li&gt;Story about Ubiquiti and sad state of home networking.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s all for now! Stay safe these days!&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Kubernetes at home</title>
        <link>https://stingr.net/p/kubernetes-at-home/</link>
        <pubDate>Sat, 11 Mar 2023 23:25:00 +0100</pubDate>
        
        <guid>https://stingr.net/p/kubernetes-at-home/</guid>
        <description>&lt;p&gt;I decided to finally try installing kubernetes at home. This is the collection of rants and random thoughts I have about it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I used k3s - works on 1 host so far, don’t know how much I can scale it? Default settings. I Haven&amp;rsquo;t tried dual-stack/ipv6 yet. I will soon.&lt;/li&gt;
&lt;li&gt;Longhorn as storage. Again, hard to give it meaningful testing with one raspberry pi 4 node. I expect abysmal performance all the way through.&lt;/li&gt;
&lt;li&gt;Setting up a private registry for the bootstrap shouldn’t require me to run it in containers. Should I write a self-contained single-binary trivial registry because nobody bothered - it’s either docker-registry, quay, or harbor?&lt;/li&gt;
&lt;li&gt;My hello world works but I’m guessing I need to make it docker-aware. At least it needs to manage the local space in mounted volume correctly.&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Institutional Knowledge</title>
        <link>https://stingr.net/p/institutional-knowledge/</link>
        <pubDate>Sun, 29 Jan 2023 21:40:21 +0100</pubDate>
        
        <guid>https://stingr.net/p/institutional-knowledge/</guid>
        <description>&lt;p&gt;I was talking to a bunch of friends the other day, and one of them started
telling a story how in a startup they&amp;rsquo;re working at production postgres instance
was slow, and there was some deliberation on making it a bit bigger (ordering a
bigger, more expensive virtual machine), so this was going on for a while and he
asks the other guy - &amp;ldquo;do you know why it is slow? did you run &lt;code&gt;explain&lt;/code&gt; on it?&amp;rdquo;.
So the other guy was confused, turns out they didn&amp;rsquo;t know what &lt;code&gt;EXPLAIN&lt;/code&gt; is, and
they didn&amp;rsquo;t have the correct indexes and once they added the correct index
they&amp;rsquo;ve had a &lt;strong&gt;600x speedup&lt;/strong&gt; without changing the shape of the VM.&lt;/p&gt;
&lt;p&gt;I pointed out this was nothing new, as I did exactly the same with out common
acquaintance back in year 2000, where that person was complaining that their
database is slow and they need a new server, and I asked if their queries are
using the correct indexes (&amp;ldquo;what is an index&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;Another friend in the call joined the party and told a story of the application
which fetches the entire contents of the database and then filters out a few
rows that&amp;rsquo;s needed in the app, and the lead developer (who used to be a CTO of a
startup) wasn&amp;rsquo;t able to speed it up no matter what they did! Except one thing
that they didn&amp;rsquo;t, is to write a correct database query which only fetches the
records they need. Again, the concept known at least for past 20 years, but
suddenly unavailable.&lt;/p&gt;
&lt;p&gt;What all of these cases have in common, you&amp;rsquo;d ask? They all prove the point that
our industry is consistently failing to solve well-known problems and keeps
cycling around them in weird self-repeating nonsense loops. It should be basic
common sense to use indexes (and, in general, use data structures and access
methods adequate to the task at hand). But no, everyone is self-taught and
because they were learning their databases building &lt;a class=&#34;link&#34; href=&#34;https://stingr.net&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;their joke of a
website&lt;/a&gt; with barely 3 visitors per day, they never needed
the performance so they never learned.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>A short guide for choosing a local file system</title>
        <link>https://stingr.net/p/a-short-guide-for-choosing-a-local-file-system/</link>
        <pubDate>Sun, 29 Jan 2023 01:20:36 +0100</pubDate>
        
        <guid>https://stingr.net/p/a-short-guide-for-choosing-a-local-file-system/</guid>
        <description>&lt;p&gt;So we have a linux machine and couple of new &amp;ldquo;drives&amp;rdquo; (block devices), and we want to put a few (millions of) files on these. Local drives, nothing fancy or distributed - which means normal, regular linux filesystems.&lt;/p&gt;
&lt;p&gt;We may or may not have SSDs, and we may or may not have a hardware RAID already.&lt;/p&gt;
&lt;h2 id=&#34;why-its-never-ext4&#34;&gt;Why it&amp;rsquo;s never Ext4?
&lt;/h2&gt;&lt;p&gt;Pretty much the only place you&amp;rsquo;d want to use ext4 now is /boot. It is not the best choice anywhere else. For regular flat partitions (if we don&amp;rsquo;t care about the integrity, or there&amp;rsquo;s a hardware RAID underneath) please use XFS. For lone small-ish SSDs please use F2FS.&lt;/p&gt;
&lt;p&gt;For a long time the best way to handle many spinning disks was a stack of MD+LVM+XFS. Now BTRFS gives you the best in terms of managing it, so you&amp;rsquo;re able to both add and remove disks, and run periodic scrubs. It is probably not the worst option for handling multiple SSDs in a mirror (but this may not be accurate - XFS + md with a bitmap may be a better choice as it may avoid Copy-on-write amplification).&lt;/p&gt;
&lt;h2 id=&#34;btrfs-pros-and-cons&#34;&gt;BTRFS pros and cons
&lt;/h2&gt;&lt;p&gt;Pros first:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BTRFS stores block/extent/metadata checksums. Traditional MD/RAID in a mirrored mode doesn&amp;rsquo;t store the checksum, so if there&amp;rsquo;s an error which results in data bits changed (and it evades the hard disk&amp;rsquo;s checksumming mechanism itself) it&amp;rsquo;s impossible to know which of the 2 copies is correct. BTRFS doesn&amp;rsquo;t have this problem.&lt;/li&gt;
&lt;li&gt;You can add and remove disks, one by one, mixing disk sizes and utilizing the maximum of those, with data moved between disks on &amp;ldquo;what&amp;rsquo;s occupied and what isn&amp;rsquo;t&amp;rdquo; basis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cons next:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy-on-write nature of btrfs makes it the worst medium for storing databases. Postgresql, mysql, you name it - all of these will produce crazily fragmented files and insane amounts of write amplification.&lt;/li&gt;
&lt;li&gt;The performance of raid5-6 configurations is laughably low. Of course, this is true for any implementation of raid5 (also, almost any implementation of raid5 has the write hole).&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        
    </channel>
</rss>
