<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Yet Another internet Page</title>
    <subtitle>Personal musings about Unix, Android, web technology, software politics, and whatever else seems interesting</subtitle>
    <link rel="self" type="application/atom+xml" href="https://yet.anotherpage.ch/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-15T14:49:52+00:00</updated>
    <id>https://yet.anotherpage.ch/atom.xml</id>
    <entry xml:lang="en">
        <title>Age Verification is a mess</title>
        <published>2026-03-15T14:49:52+00:00</published>
        <updated>2026-03-15T14:49:52+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/age-verifi/"/>
        <id>https://yet.anotherpage.ch/posts/age-verifi/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/age-verifi/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;&lt;code&gt;init=&#x2F;bin&#x2F;bash&lt;&#x2F;code&gt;, need I say more?&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;California is having bad ideas and everyone else is likely to follow
suit — leading to a global outburst of poorly written age gating
legislation that probably does not protect children because evil people
on Discord will in fact just pretend to be children.&lt;&#x2F;p&gt;
&lt;p&gt;The number of teens that use Linux is low at best, but yet California
really wants the big distros to require age verification. Not like:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;D-Bus intentionally lets &lt;em&gt;literally anyone&lt;&#x2F;em&gt; implement an
interface — we call it «Open Standard», something MS clearly hasn’t
heard of and absolutely should, considering Windows is &lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=42241424&quot;&gt;“The most open
operating system”&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;The …3 if you squint hard enough…teens on Linux and other less
busy users are &lt;em&gt;way too obsessed&lt;&#x2F;em&gt; to use a normal distro (&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;alpinelinux.org&#x2F;&quot;&gt;I use
Alpine, by the way&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;The general concept of age gating is &lt;em&gt;utterly&lt;&#x2F;em&gt; silly, if not backed by
ID — a controversial and major violation of &lt;em&gt;various&lt;&#x2F;em&gt; places’
privacy laws.&lt;&#x2F;li&gt;
&lt;li&gt;This legislation was built with &lt;em&gt;commercial&lt;&#x2F;em&gt; and &lt;em&gt;locked-down&lt;&#x2F;em&gt; systems
in mind, two words that most definitely conflict with both “Linux” and
“Desktop”, the latter sometimes also referred to as “a pretty much
user controlled environment” by &lt;em&gt;practically no one except
me&lt;&#x2F;em&gt; — though it’s accurate, I’d say.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;aside&gt;&lt;p&gt;Yes I am &lt;strong&gt;still&lt;&#x2F;strong&gt; a flaky at best blogger. Oh well.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A Smaller Approach to Blogging</title>
        <published>2025-11-11T18:51:58+00:00</published>
        <updated>2025-11-11T18:51:58+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/microblogging/"/>
        <id>https://yet.anotherpage.ch/posts/microblogging/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/microblogging/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;An update and a pology&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;I haven’t blogged in a while. Don’t know what I did in all that time.
Probably having busier times come up and actually having to do things
for once. Expect the content rate to stay similar to this ^-^&lt;&#x2F;p&gt;
&lt;p&gt;Now, why I’m actually writing this: What if I built a private
Microblogging system to make quick and dirty posts to that either pile
up, or just might eventually become real things I said in fully written
out form. The only problem is that I have better things to do than
pressure myself even more to say things.&lt;&#x2F;p&gt;
&lt;p&gt;On an unrelated note, I’m compiling AOSP. If you plan to roll your own
boot animations, stop, it’s hard. Sometimes SEL isn’t happy about the
audio, other times &#x2F;sbin&#x2F;bootanimation segfaults, and when that doesn’t
happen, it’s Magick optimizing out your image contents because you
really wanted &lt;code&gt;dynamic_color&lt;&#x2F;code&gt;. More on that once I got somewhere.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Becoming the very thing you already destroyed</title>
        <published>2025-08-28T18:35:45+00:00</published>
        <updated>2025-08-28T18:35:45+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/becoming-t/"/>
        <id>https://yet.anotherpage.ch/posts/becoming-t/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/becoming-t/">&lt;p&gt;A rewritten version of an article where I got a little emotional&lt;&#x2F;p&gt;
&lt;p&gt;This article probably got split into three, as I tried to talk about
three things at once, and readability suffered.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-fax&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-fax&quot; aria-label=&quot;Anchor link for: the-fax&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
The Fax&lt;&#x2F;h2&gt;
&lt;p&gt;If you either scroll down sometimes or have a non-negligible memory, you
may remember that I wrote about the Play Integrity changes a
few…months(?)…ago?&lt;&#x2F;p&gt;
&lt;p&gt;If you have ever argued with an iOS user, you probably know that
Android — mostly GMS’d Android — globally runs about 70% of the
market, and I’d presume it’s in part popular due to its openness,
which Google seems to be plugging, for good — or really, for
bad — if there’s no backlash.&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;I am apparently not so great at blogging regularly :)&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;Google is &lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;www.androidauthority.com&#x2F;android-developer-verification-requirements-3590911&#x2F;&quot;&gt;restricting sideloading a
lot,&lt;&#x2F;a&gt;
dare I call this iOS-level. In case you prefer reading at the source,
it’s also written down on &lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;developer.android.com&#x2F;developer-verification&quot;&gt;Android
Developers&lt;&#x2F;a&gt;, which
may be less or more neutral about the subject, but probably more
one-sided.&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;Only on devices with GMS&#x2F;GSF, but that’s most of them&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;h2 id=&quot;the-considerations&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-considerations&quot; aria-label=&quot;Anchor link for: the-considerations&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
The Considerations&lt;&#x2F;h2&gt;
&lt;p&gt;While being able to know exactly who’s distributing malware sounds
cool, we need to remember that not everything sideloaded is malware. For
example:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;adaway.org&quot;&gt;AdAway&lt;&#x2F;a&gt;, which isn’t on Google Play because
Google wants ad revenue&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;f-droid.org&quot;&gt;F-Droid&lt;&#x2F;a&gt;, which can’t be on Google Play because
it’s an app store…and because it’s kind of silly to download an
app store that doesn’t track you over a platform that tracks you&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;topjohnwu.github.io&#x2F;Magisk&quot;&gt;Various, really&lt;&#x2F;a&gt;
&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;apatch.dev&#x2F;&quot;&gt;interesting&lt;&#x2F;a&gt; &lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;kernelsu.org&quot;&gt;root
solutions&lt;&#x2F;a&gt;, that Google will tolerate, as long
as they’re not accessible to your average Joe:anne&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;::: aside
Not a real bullet point but &lt;em&gt;how many&lt;&#x2F;em&gt; times did I link to Magisk yet?
:::&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;www.jwz.org&#x2F;xscreensaver&#x2F;download.html&quot;&gt;Projects with privacy conscious
developers&lt;&#x2F;a&gt; that
don’t really want an ad company to know their driver’s license&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;termux.dev&#x2F;en&#x2F;&quot;&gt;Termux&lt;&#x2F;a&gt;, which violates W^X by design and
thus can’t update the Google builds anymore.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;ironfox-oss&#x2F;IronFox&quot;&gt;Hardened Fenix forks&lt;&#x2F;a&gt;, which
don’t distribute there because of privacy either&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;aside&gt;&lt;p&gt;I presume this list will age like milk, esp. if I put many things in it&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;With this new policy, Google would know exactly who makes what
applications, and can choose to censor any of these from most of
Android, like they did to YouTube Vanced.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-speculation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-speculation&quot; aria-label=&quot;Anchor link for: the-speculation&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
The Speculation&lt;&#x2F;h2&gt;
&lt;p&gt;Even if Google says something along the lines of ‘You need to calm down
everyone, turns out we’re not doing that, promise’ the precedent of &lt;em&gt;we
do what we want to your phone&lt;&#x2F;em&gt; is still there.&lt;&#x2F;p&gt;
&lt;p&gt;Apple has this tight of a grip on the ecosystem, or used to, and look
what they did to my boy Firefox! They forced him to &lt;em&gt;WebKit.&lt;&#x2F;em&gt; A
&lt;em&gt;KHTML-based&lt;&#x2F;em&gt; Mozilla product, blasphemous!&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;The above is very obviously sarcasm. But Apple did use to enforce that,
until governing bodies told them to, you know, &lt;em&gt;stop&lt;&#x2F;em&gt; being
&lt;strong&gt;anticompetitive pieces of-&lt;&#x2F;strong&gt; it’s fine, there’s nobody to demonetize
me. Except my employer, maybe.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;And it’s not just internal pressure that could make Google do things.
An oppressive government could force Google to do anything, and since
Google is in it for the money, I don’t see them above bending to the
will of dictators. Or maybe they are. They &lt;em&gt;used to&lt;&#x2F;em&gt; have a motto of
‘Don’t be Evil.’&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-brainwashing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-brainwashing&quot; aria-label=&quot;Anchor link for: the-brainwashing&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
The Brainwashing&lt;&#x2F;h2&gt;
&lt;p&gt;Even if you may not use non-store apps, some people do. Maybe Google
eventually pulls some private messengers in response to the recent EU
Chat Control discussion. Maybe you use that messenger to stay connected
with friends and family. Maybe you want to sideload it. Maybe Google
banned it. Do you now wish to rely on Feta(formerly Makebook)?&lt;&#x2F;p&gt;
&lt;p&gt;Even if Google says they won’t release the data, they will still have
it. It’s about data and control. It seems harmless today, but it’s a
slippery slope. Do you want to let Google track more than they need to,
to sell you more with ads?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;I doubt it, let’s not ignore this.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;(You’ll see this one 2 more times, in regard to Chat Control and the
Steam payment processor debate.)&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Modern Laptops are really Splash-Resistant</title>
        <published>2025-06-06T20:46:11+00:00</published>
        <updated>2025-06-06T20:46:11+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/modern-lap/"/>
        <id>https://yet.anotherpage.ch/posts/modern-lap/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/modern-lap/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;I accidentally sent mine bathing in milk&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;Don’t you just hate it when you read a newspost and accidentally spill
your drink? Don’t you just hate it even more when the table isn’t set
and you have to clean it immediately? In my case, the laptop was in
splash range. Lesson learned — The hard way.&lt;&#x2F;p&gt;
&lt;p&gt;On the flip side, I am writing this post. The only broken hardware are
the touchpad click buttons. I’ll either get used to their absence or
try to fix them.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Google is tightening PI</title>
        <published>2025-05-22T15:40:13+00:00</published>
        <updated>2025-05-22T15:40:13+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/google-is/"/>
        <id>https://yet.anotherpage.ch/posts/google-is/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/google-is/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;I am &lt;strong&gt;not&lt;&#x2F;strong&gt; happy, who would’ve guessed?&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;So, who here uses rooted Android? Oh, right, literally just me,
Cloudflare says I have basically no legit visitors. If you are a legit
visitor, you’re definitely not the one-hundredth one — but since
you’re already connected to the internet — might as well drop me some
mail.&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;&lt;em&gt;did I use those em-dashes wrong?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;Back to what I was actually writing about, Play Integrity: For the
unfamiliar, Google wants to make sure apps can know if a device is in an
out-of-box state or actually usable. Tampered with, as Google likes to
call it. The former option is the 255th layer of hell in most cases. The
latter is what &lt;strong&gt;I’m&lt;&#x2F;strong&gt; using.&lt;&#x2F;p&gt;
&lt;p&gt;Google decided to bump the requirements for Android 13 and newer, as the
integrity level for older, unmodified devices was easily attained with
&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;topjohnwu&#x2F;Magisk&quot;&gt;Magisk&lt;&#x2F;a&gt; &#x2F;
&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;apatch.dev&quot;&gt;APatch&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;kernelsu.org&quot;&gt;KernelSU&lt;&#x2F;a&gt; modules
like &lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chiteroman&#x2F;PlayIntegrityFix&quot;&gt;Play Integrity
Fix&lt;&#x2F;a&gt; — PIF for short.&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;This isn’t an ad, I just like those projects.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;The new ones are pretty hard to get. I can’t even get the basic
attestation anymore, which is rather annoying. Unrooting &lt;strong&gt;would&lt;&#x2F;strong&gt; be an
option, but Magisk is just so &lt;em&gt;useful&lt;&#x2F;em&gt;…&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;Ever tried a DSP app? You either get system-wide audio effects via those
that just ask Android, or near-global support with things like
RootlessJamesDSP. The best option? Fully rooted JamesDSP — no
compromises.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;p&gt;Have I mentioned Google uses proprietary byte code running in a quite
secure environment for this? Huge props to people like
&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;chiteroman&quot;&gt;chiteroman&lt;&#x2F;a&gt; and
&lt;a rel=&quot;noreferrer external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;osm0sis&quot;&gt;osm0sis&lt;&#x2F;a&gt; for dealing with this stuff. They
may not make all of the world go round, but they sure do make mine.&lt;&#x2F;p&gt;
&lt;p&gt;I hope somebody finds a way to get just basic or device attestation
again at some point. Until then, I’m using a keybox that will get
revoked as soon as I look the wrong way — because some apps —
especially the ones that don’t need it — really want integrity,
whether I like it or not.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;PS:&lt;&#x2F;strong&gt; First blog post where I asked an LLM to proofread. Hope you
don’t mind. If you do, your problem.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Follow-Up</title>
        <published>2025-05-18T12:14:00+00:00</published>
        <updated>2025-05-18T12:14:00+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/busy-with-dd-2/"/>
        <id>https://yet.anotherpage.ch/posts/busy-with-dd-2/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/busy-with-dd-2/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;The past is r&#x2F;o&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;As hinted at, I tried &lt;code&gt;partclone&lt;&#x2F;code&gt; first, but that ended up with a
corrupted superblock, so a 1:1 &lt;code&gt;dd &amp;amp;&amp;amp; btrfstune -u&lt;&#x2F;code&gt; it is.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>No Blogpost today :(</title>
        <published>2025-05-18T12:10:00+00:00</published>
        <updated>2025-05-18T12:10:00+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/busy-with-dd/"/>
        <id>https://yet.anotherpage.ch/posts/busy-with-dd/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/busy-with-dd/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;Partclone won’t work on my Btrfs&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately can’t do a proper blogpost today, my main machine is
really busy copying a partition to a bigger drive — Problem is that
it’s copying my rootfs, which means booting from a thumbdrive, so I
can’t use my shellscript to add timestamps and wrap my post in
&lt;code&gt;&amp;lt;article&amp;gt;&lt;&#x2F;code&gt; tags. QoL thing, and I won’t write a full-blown post
without it now.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A Quick and Dirty List of Shell-Scriptable Tools You&#x27;ll Rarely Ever Need</title>
        <published>2025-05-12T20:10:03+00:00</published>
        <updated>2025-05-12T20:10:03+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/a-quick-an/"/>
        <id>https://yet.anotherpage.ch/posts/a-quick-an/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/a-quick-an/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;…and indicate you should’ve used Python&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jq-json-processing-as-a-cli&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jq-json-processing-as-a-cli&quot; aria-label=&quot;Anchor link for: jq-json-processing-as-a-cli&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
jq - JSON processing as a CLI&lt;&#x2F;h2&gt;
&lt;p&gt;Grepping and cutting within minified JSON APIs is…not fun, to say the
least. What if you had a way to parse it &lt;em&gt;properly?&lt;&#x2F;em&gt; &lt;code&gt;jq&lt;&#x2F;code&gt; lets you do
just that — and everything else you could possibly want to do to
arbitrary structured data — by either vibe coding with your LLM of
choice, querying a search engine you still haven’t decided on, or by
reading the man page, &lt;em&gt;like a nerd.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;From my experience it can be a little quirky regarding piped output. Put
a &lt;code&gt;while read&lt;&#x2F;code&gt; loop around it, if you really need to stream the data.
Should work if the input is minified.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;time datetime=&quot;2026-07-21T18:30:07Z&quot;&gt;2026-07-21 18:30:07 +00:00&lt;&#x2F;time&gt;
: So basically if you pass &lt;code&gt;--stream&lt;&#x2F;code&gt; it’ll actually line buffer by itself…&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;h2 id=&quot;xmlstarlet-doing-absolutely-everything-you-can-imagine-to-well-formed-xml&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#xmlstarlet-doing-absolutely-everything-you-can-imagine-to-well-formed-xml&quot; aria-label=&quot;Anchor link for: xmlstarlet-doing-absolutely-everything-you-can-imagine-to-well-formed-xml&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
XMLStarlet - Doing absolutely everything you can imagine to well-formed XML&lt;&#x2F;h2&gt;
&lt;p&gt;Similarly to jq, &lt;code&gt;xmlstarlet&lt;&#x2F;code&gt; also deals with structured data —
Because apparently we can’t agree on a one-size-fits all standard.&lt;&#x2F;p&gt;
&lt;p&gt;Aside from escaping and unescaping streamed data, it can also edit,
beautify (format, as it calls it), extract data from, list the
filesystem as, canonicalize — an euphemism for ‘fix your weird
misuses of insignificant whitespace’ — validate and do magic on
pretty much arbitrary XML, as long as it’s valid…enough.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zopflipng-for-when-you-have-too-much-time-and-a-high-fidelity-scan&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#zopflipng-for-when-you-have-too-much-time-and-a-high-fidelity-scan&quot; aria-label=&quot;Anchor link for: zopflipng-for-when-you-have-too-much-time-and-a-high-fidelity-scan&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
zopflipng - For when you have too much time and a high-fidelity scan&lt;&#x2F;h2&gt;
&lt;p&gt;Don’t you just &lt;em&gt;hate&lt;&#x2F;em&gt; when you have to downscale the document you
scanned at 1200dpi — for no reason at all — to something sane
because it’s over five megabytes? Then &lt;code&gt;zopflipng&lt;&#x2F;code&gt; can’t help you,
unless you &lt;em&gt;actually&lt;&#x2F;em&gt; have way, &lt;strong&gt;way&lt;&#x2F;strong&gt; too much time on your hands. If
you don’t, it’s still useful for shaving off a few bits from
lower-resolution icons. (Of course, you can still waste time by spamming
-m enough times.)&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;With great power comes great responsibility, and — if overdone —
great electricity bill. You can probably get away with the defaults.
Bumping up the settings is just candy on top.&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
&lt;h2 id=&quot;imagemagick-graphicsmagick-when-gimp-is-too-heavy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#imagemagick-graphicsmagick-when-gimp-is-too-heavy&quot; aria-label=&quot;Anchor link for: imagemagick-graphicsmagick-when-gimp-is-too-heavy&quot;&gt;&amp;rarr;&lt;&#x2F;a&gt;
ImageMagick&#x2F;Graphicsmagick - when GIMP is too heavy&lt;&#x2F;h2&gt;
&lt;p&gt;Two related tools for image conversion and procedural(?) editing. &lt;code&gt;gm&lt;&#x2F;code&gt;
is slightly less powerful but should be nicer on licensing, while
&lt;code&gt;magick&lt;&#x2F;code&gt; is the upstream and has a less stable interface. Use what
you prefer, or use neither.&lt;&#x2F;p&gt;
&lt;p&gt;I primarily use it for when I need to operate on a ton of images —
&lt;code&gt;mogrify&lt;&#x2F;code&gt; is your friend, although nowadays it should be invoked as
&lt;code&gt;(magick|gm) mogrify&lt;&#x2F;code&gt; — I’m sure they’re not deprecating the legacy
variant any time soon, though, too much breakage.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Site Maps</title>
        <published>2025-05-11T00:00:00+00:00</published>
        <updated>2025-05-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/site-maps/"/>
        <id>https://yet.anotherpage.ch/posts/site-maps/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/site-maps/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;Or “Why I solve everything with shellscripts”&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;Sometime ago I started doing Search Engine Optimization — and before
anybody flames me for it, I won’t add analytics beyond what Cloudflare
ships, those are helpful for preventing bot spam. — which also meant
making my &amp;lt;head&amp;gt; much bigger by including a lot of metadata. Another
fun thing was adding a humans- and a robots.txt file. Spent the last
thirty-or-something minutes writing a sitemap generator in bash, with a
little help from ChatGPT for finding the right tools for the job. Is
&lt;code&gt;XMLStarlet&lt;&#x2F;code&gt; overkill? …Probably. Does it work? Until you try to
change something. Am I running it way too often? Arguably. But hey, the
only dependency on Starlet is a single function that can be replaced
quite easily. Feel free to look at the output yourself under
&lt;a href=&quot;&#x2F;sitemap.xml&quot;&gt;sitemap.xml&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As for why everything I do involves way too many shell scripts, I only
know Python, Bash, that weird scripting language Plymouth uses and
traces of C, but I’ve almost perfected the second one to the extent of
an art form, so I’ll just use it until I have to do things properly.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;files&#x2F;sitemapper.sh&quot;&gt;Permanently borrow my code&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;I forgot to write down when exactly I wrote this. Oh well&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rest in peace, my unifying receiver</title>
        <published>2025-05-09T12:39:00+00:00</published>
        <updated>2025-05-09T12:39:00+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/rip-unifying-receiver/"/>
        <id>https://yet.anotherpage.ch/posts/rip-unifying-receiver/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/rip-unifying-receiver/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;The older ones were better&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;Today is a tragic day. One of my permanently borrowed &lt;em&gt;Unifying
Receivers&lt;&#x2F;em&gt; died — I now have one left that went bathing. I think it’s
been jammed too hard into my laptop when putting it in its case. That
USB port is fine, so at least the damage kept itself to a receiver…&lt;&#x2F;p&gt;
&lt;p&gt;…for a deprecated protocol replaced by Logi Bolt. This is where
Logitech went downhill, killing off support for older mice on newer
receivers. I know that supporting old protocols is &lt;em&gt;annoying,&lt;&#x2F;em&gt; but
Unifying devices are still pretty popular&lt;&#x2F;p&gt;
&lt;aside&gt;&lt;p&gt;One can argue about the correctness of mice as a plural of computer mouse,
but you know what I mean. And besides, &lt;em&gt;mouses&lt;&#x2F;em&gt; sounds horrible&lt;&#x2F;p&gt;
&lt;&#x2F;aside&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Another day, another debugging session</title>
        <published>2025-05-07T19:33:00+00:00</published>
        <updated>2025-05-07T19:33:00+00:00</updated>
        
        <author>
          <name>
            
              Fish
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://yet.anotherpage.ch/posts/debugging-session/"/>
        <id>https://yet.anotherpage.ch/posts/debugging-session/</id>
        
        <content type="html" xml:base="https://yet.anotherpage.ch/posts/debugging-session/">&lt;p class=&quot;subtitle&quot;&gt;
    &lt;i&gt;Not the best way to start a blog, really&lt;&#x2F;i&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;Having a working page is cool. Having Cloudflare error out isn’t.
That’s why one should listen on the right port, with the right protocol,
and with a proper cert.&lt;&#x2F;p&gt;
&lt;p&gt;I was going to put a blogpost here, but a problem with the web is that you need
content if you want to make pages. And &lt;em&gt;a lorem ipsum&lt;&#x2F;em&gt; is not the answer. So, I
guess this will have to do for today.&lt;&#x2F;p&gt;
&lt;p&gt;Building for the web is annoying, but at least I have something like a
portfolio now.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
