<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<title>zunzuncito</title>
	<subtitle>Wolf&#x27;s humming microblog</subtitle>
	<link href="https://zunzuncito.oriole.systems/atom.xml" rel="self" type="application/atom+xml"/>
	<link href="https://zunzuncito.oriole.systems"/>
	<generator uri="https://www.getzola.org/">Zola</generator>
	<updated>2025-08-10T17:22:10+02:00</updated>
	<id>https://zunzuncito.oriole.systems/atom.xml</id>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Upgrading Dovecot&#x27;s configuration from 2.3 to 2.4</title>
		<published>2025-08-10T17:22:10+02:00</published>
		<updated>2025-08-10T17:22:10+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/28/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/28/</id>
		<content type="html">&lt;p&gt;Dovecot 2.4 &lt;a href=&quot;https:&#x2F;&#x2F;dovecot.org&#x2F;mailman3&#x2F;archives&#x2F;list&#x2F;dovecot-news@dovecot.org&#x2F;thread&#x2F;UYNR6GBP25XEGFCS633SWPR4HXV3NSS3&#x2F;&quot;&gt;was released&lt;&#x2F;a&gt;
earlier this year in January and it brings along several breaking changes to
its configuration format, requiring manual intervention in basically all cases.&lt;&#x2F;p&gt;
&lt;p&gt;I was alerted to this via a &lt;a href=&quot;https:&#x2F;&#x2F;www.gentoo.org&#x2F;support&#x2F;news-items&#x2F;2025-05-23-dovecot-2_4-upgrade.html&quot;&gt;Gentoo news item&lt;&#x2F;a&gt;
in May but didn’t immediately take the plunge back then because the conversion
seemed a bit daunting at first glance. I had some extra time on my hands today,
however, and decided to go for it. What follows are some notes on the process
that are hopefully helpful to people who are in the same situation.&lt;&#x2F;p&gt;
&lt;p&gt;First of all, I recommend reading the &lt;a href=&quot;https:&#x2F;&#x2F;doc.dovecot.org&#x2F;main&#x2F;installation&#x2F;upgrade&#x2F;2.3-to-2.4.html&quot;&gt;official
document&lt;&#x2F;a&gt; to
get a rough understanding of the changes. It is highly likely that your previous
configuration file contains settings that have been changed in some way. The
document does point out those changes, but does not provide a comparison on a
case-by-case basis and sometimes only points out &lt;em&gt;that&lt;&#x2F;em&gt; settings have been split
into multiple others.&lt;&#x2F;p&gt;
&lt;p&gt;For example, the &lt;code&gt;mail_location&lt;&#x2F;code&gt; setting has been split in such a way and the
documentation expects you to find all relevant new settings on your own. So make
sure to take extra care when reading through the section on &lt;a href=&quot;https:&#x2F;&#x2F;doc.dovecot.org&#x2F;main&#x2F;installation&#x2F;upgrade&#x2F;2.3-to-2.4.html#converted-settings&quot;&gt;converted
settings&lt;&#x2F;a&gt;.
Most likely you’ll also need to change old one-letter variables to their &lt;a href=&quot;https:&#x2F;&#x2F;doc.dovecot.org&#x2F;main&#x2F;installation&#x2F;upgrade&#x2F;2.3-to-2.4.html#variable-expansion&quot;&gt;new
syntax&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For me, therefore, the following two lines…&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;mail_home = &amp;#x2F;var&amp;#x2F;vmail&amp;#x2F;%d&amp;#x2F;%n
mail_location = maildir:~&amp;#x2F;Maildir:LAYOUT=fs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…changed into:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;mail_home = &amp;#x2F;var&amp;#x2F;vmail&amp;#x2F;${user | domain}&amp;#x2F;%{user | username}
mail_driver = maildir
mail_path = ~&amp;#x2F;Maildir
mailbox_list_layout = fs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If previously you provided certificate and key files like so:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ssl_cert = &amp;lt;&amp;#x2F;etc&amp;#x2F;ssl&amp;#x2F;dovecot.crt
ssl_key = &amp;lt;&amp;#x2F;etc&amp;#x2F;ssl&amp;#x2F;dovecot.key
ssl_dh = &amp;lt;&amp;#x2F;etc&amp;#x2F;dovecot&amp;#x2F;dh.pem
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now you do the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ssl_server_cert_file = &amp;#x2F;etc&amp;#x2F;ssl&amp;#x2F;dovecot.crt
ssl_server_key_file = &amp;#x2F;etc&amp;#x2F;ssl&amp;#x2F;dovecot.key
ssl_server_dh_file = &amp;#x2F;etc&amp;#x2F;dovecot&amp;#x2F;dh.pem
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;passdb&lt;&#x2F;code&gt; and &lt;code&gt;userdb&lt;&#x2F;code&gt; sections have also changed significantly. Previously
you had…&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;passdb {
  driver = passwd-file
  args = &amp;#x2F;etc&amp;#x2F;dovecot&amp;#x2F;passdb
}

userdb {
  driver = static
  args = uid=vmail gid=vmail
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;…which now becomes:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;passdb passwd-file {
  passwd_file_path = &amp;#x2F;etc&amp;#x2F;dovecot&amp;#x2F;passdb
}

userdb static {
  fields {
    uid = vmail
    gid = vmail
  }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The part that was most painful for me was getting sieve scripts to behave like
before. I have a collection of global scripts that may be imported by personal
scripts, which previously required the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;protocol lmtp {
  mail_plugins = $mail_plugins quota sieve
}

plugin {
  sieve_global = &amp;#x2F;etc&amp;#x2F;dovecot&amp;#x2F;sieve&amp;#x2F;
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Since now you need to maintain &lt;code&gt;sieve_script&lt;&#x2F;code&gt; sections manually, only the
following worked for me:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;protocol lmtp {
  mail_plugins {
    quota = yes
    sieve = yes
  }
}

sieve_script personal {
  driver = file
  path = ~&amp;#x2F;sieve
  active_path = ~&amp;#x2F;.dovecot.sieve
}

sieve_script global {
  sieve_script_type = global
  path = &amp;#x2F;etc&amp;#x2F;dovecot&amp;#x2F;sieve
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Crucially, it is important to realize that the new section names for &lt;code&gt;passdb&lt;&#x2F;code&gt;,
&lt;code&gt;userdb&lt;&#x2F;code&gt;, and &lt;code&gt;sieve_script&lt;&#x2F;code&gt; are identifiers only: &lt;code&gt;sieve_script_type&lt;&#x2F;code&gt; is only
set to &lt;code&gt;global&lt;&#x2F;code&gt; if explicitly given, a section name of &lt;code&gt;global&lt;&#x2F;code&gt; will not
suffice. The setting is missing from the &lt;code&gt;personal&lt;&#x2F;code&gt; section because a type of
&lt;code&gt;personal&lt;&#x2F;code&gt; is the default.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, after the migration to 2.4 I started getting the following error in my
logs:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;net_connect_unix(&amp;#x2F;run&amp;#x2F;dovecot&amp;#x2F;anvil) failed: Permission denied
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I’m not exactly sure why this happens, but it seems to be a &lt;a href=&quot;https:&#x2F;&#x2F;dovecot.org&#x2F;mailman3&#x2F;archives&#x2F;list&#x2F;dovecot@dovecot.org&#x2F;message&#x2F;AG5NIVI6ZUHOWMRSGGV4NVVZLFFN7MRI&#x2F;&quot;&gt;known
issue&lt;&#x2F;a&gt; - I could work around it doing the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;service anvil {
  unix_listener anvil {
    group = vmail
    mode = 0660
    user = dovecot
  }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You will most likely have to adjust the &lt;code&gt;vmail&lt;&#x2F;code&gt; group according to your setup.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Adding Zero RPM controls to the RX 7000 series</title>
		<published>2024-11-05T23:39:57+01:00</published>
		<updated>2024-11-05T23:39:57+01:00</updated>
		<link href="https://zunzuncito.oriole.systems/27/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/27/</id>
		<content type="html">&lt;p&gt;Last year I upgraded to an AMD RX 7900XTX, mainly to play Alan Wake II. Just
like my previous card the XTX has a “Zero RPM” feature: it turns off its fans
fully if the junction temperature, the hottest part of the GPU, is below a
certain threshold. With the fans off, the GPU relies on its massive heatsink for
passive cooling. Even in a very well-ventilated case, however, this will mean
that the area around the GPU will heat up considerably. For me the fans turn off
at around 55°C; the component closest to the GPU, an NVMe M.2 SSD, will usually
slowly heat up to around 48°C whilst idling.&lt;&#x2F;p&gt;
&lt;p&gt;Even under load the SSD never exceeds any temperature threshold, so
realistically it should be fine, but I’m simply not happy with the amount of
thermal energy sitting around in there if it could be expelled easily by turning
on the fans. Worse still, the logic for toggling the fans is not very well
thought-out, and in the worst case the fans are on for one minute only to be off
for the next one, ad nauseam.&lt;&#x2F;p&gt;
&lt;p&gt;With my previous GPU turning off “Zero RPM” was pretty simple. Using the
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sibradzic&#x2F;upp&quot;&gt;upp(1)&lt;&#x2F;a&gt; tool you could toggle the feature in
the GPU’s so-called PowerPlay tables. It’s a simple job, then, to write a
systemd service to turn off “Zero RPM” on system boot.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly this is no longer possible on 7000 series cards as there is no more direct
access to the PowerPlay tables. Instead a new framework using
&lt;a href=&quot;https:&#x2F;&#x2F;www.kernel.org&#x2F;doc&#x2F;html&#x2F;latest&#x2F;filesystems&#x2F;sysfs.html&quot;&gt;sysfs&lt;&#x2F;a&gt; for
managing PowerPlay features was introduced. &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;drm&#x2F;amd&#x2F;-&#x2F;issues&#x2F;2402&quot;&gt;Fan
curve&lt;&#x2F;a&gt; controls were added
after a while (and a lot of moaning by users), but there was no such knob for
the “Zero RPM” feature. A couple of months ago a &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;drm&#x2F;amd&#x2F;-&#x2F;issues&#x2F;3489&quot;&gt;feature
request&lt;&#x2F;a&gt; was opened for
it, but nothing much happened on AMD’s side.&lt;&#x2F;p&gt;
&lt;p&gt;Initially hopeful for a reasonably quick resolution, I was getting more and more
annoyed after a while by the lack of this seemingly simple toggle, so I finally
caved and proceeded to have a look at it myself. The hardest part was getting
started with reading
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;agd5f&#x2F;linux&#x2F;-&#x2F;tree&#x2F;amd-staging-drm-next&#x2F;drivers&#x2F;gpu&#x2F;drm&#x2F;amd?ref_type=heads&quot;&gt;amdgpu&lt;&#x2F;a&gt;
code. The code base is absolutely massive and I had no real idea where to start.
Since fan curve controls already existed I thought it best to find the commit
that introduced them. After a quick search I found &lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;agd5f&#x2F;linux&#x2F;-&#x2F;commit&#x2F;eedd5a343d22&quot;&gt;the relevant
commit&lt;&#x2F;a&gt; and
had a better understanding of which parts of the code to change.&lt;&#x2F;p&gt;
&lt;p&gt;So, after a while of tweaking and twiddling I had a working prototype and I
could finally have my GPU run its fans at all times. I knew a lot of people were
also waiting for this feature, so I &lt;a href=&quot;https:&#x2F;&#x2F;lists.freedesktop.org&#x2F;archives&#x2F;amd-gfx&#x2F;2024-October&#x2F;115857.html&quot;&gt;sent a
patch&lt;&#x2F;a&gt;
upstream. After some short feedback and &lt;a href=&quot;https:&#x2F;&#x2F;lists.freedesktop.org&#x2F;archives&#x2F;amd-gfx&#x2F;2024-October&#x2F;116274.html&quot;&gt;the addition of another
feature&lt;&#x2F;a&gt;
the series was accepted, and is going to be part of the kernel sometime soon.&lt;&#x2F;p&gt;
&lt;p&gt;With the fans now running at all times I can happily report that ambient
temperatures have dropped by more than 10°C and the SSD usually does not exceed
40°C when idling. Even better I do feel quite proud to have finally contributed
code to the kernel.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Night-time icons for Plasma&#x27;s DWD backend</title>
		<published>2024-10-19T20:02:17+02:00</published>
		<updated>2024-10-19T20:02:17+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/26/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/26/</id>
		<content type="html">&lt;p&gt;For a couple of weeks now I have been using Plasma’s built-in weather report
system. It supports various different sources for weather observations and
forecasts, one of which is my preferred service, &lt;a href=&quot;https:&#x2F;&#x2F;www.dwd.de&quot;&gt;Deutscher
Wetterdienst&lt;&#x2F;a&gt; (DWD). Once the report location is set up, Plasma
displays the current conditions in the tray - clicking on it gives you an
overview of the next 7 days.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve been quite pleased with this; a quick glance at the icon tells you
everything you need to know and the forecast is only one click away. It even
supports DWD’s official warning system. There is one small problem with the tray
icon, however. See if you can spot it:&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;26&amp;#x2F;icon-day.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;icon-day.3653d063dc07f77c.png&quot; alt=&quot;A screenshot of Plasma&amp;#x27;s tray
showing a clipboard icon, a media control icon, and a weather icon. The weather
icon is displaying a sun with few clouds in front. The tray is also showing the
time. It is 23:57.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;Something’s not quite right…&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;That’s right, I couldn’t have possibly taken this image given this post’s
timestamp is before 23:57! Good catch. More importantly, however, the icon is
showing the sun when realistically it’s going to be dark outside. This has been
annoying me to no end, so a couple of days ago I decided to fix it.&lt;&#x2F;p&gt;
&lt;p&gt;Since Plasma already comes with weather icons suited for night-time use, I
really only needed a reliable way to tell when to switch to those. After some
spelunking in DWD’s &lt;a href=&quot;https:&#x2F;&#x2F;dwd.api.bund.dev&#x2F;&quot;&gt;two&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;listed.to&#x2F;@DieSieben&#x2F;7851&#x2F;api-des-deutschen-wetterdienstes&quot;&gt;APIs&lt;&#x2F;a&gt;, I
found that the latter contains sunrise and sunset times for its forecast
endpoint. The weather report system was already using this endpoint to fetch
forecast data, so it was a rather simple lookup of two values in the API and
then comparing the current observation time to those.&lt;&#x2F;p&gt;
&lt;p&gt;So, after some preparatory work to make date parsing more robust, I sent a
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-workspace&#x2F;-&#x2F;merge_requests&#x2F;4848&quot;&gt;merge
request&lt;&#x2F;a&gt;
upstream which was promptly approved and merged. Finally I could rest easy after
dusk, not having to worry about a sun chasing me around.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;26&amp;#x2F;icon-night.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;icon-night.2bcdb9f7fca2c925.png&quot; alt=&quot;A screenshot of Plasma&amp;#x27;s tray
showing a clipboard icon, a media control icon, and a weather icon. The weather
icon is displaying a crescent moon with few clouds in front. The tray is also
showing the time. It is 18:57.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;… much better!&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;There’s some more stuff that could be improved in the DWD backend, like station
availability. As far as I can tell, when using the open API, DWD limits access
to weather data depending on whether or not they have the full rights to it. The
API might therefore simply deny access to a station even though it is listed in
in &lt;a href=&quot;https:&#x2F;&#x2F;www.dwd.de&#x2F;DE&#x2F;leistungen&#x2F;klimadatendeutschland&#x2F;statliste&#x2F;statlex_html.html?view=nasPublication&amp;amp;nn=16102&quot;&gt;the official index&lt;&#x2F;a&gt;.
There’s no way to find out which station is accessible except to try them all.
To get around this, the DWD backend uses a &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-workspace&#x2F;-&#x2F;blob&#x2F;69a52cd6fbde80b087f59a633b4ff216c27ddff0&#x2F;dataengines&#x2F;weather&#x2F;ions&#x2F;dwd&#x2F;ion_dwd.cpp#L396-403&quot;&gt;very simple
heuristic&lt;&#x2F;a&gt;
based on the first digit of the station ID, since all stations starting with 0
or 1 seem to work. However, this ignores a number of other, still accessible,
stations.&lt;&#x2F;p&gt;
&lt;p&gt;I’m planning to look into this further, hopefully finding a better solution so
that users of the DWD backend have access to as many stations as possible.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Understanding recent files on KDE Plasma 6</title>
		<published>2024-10-18T17:46:30+02:00</published>
		<updated>2024-10-18T17:46:30+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/25/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/25/</id>
		<content type="html">&lt;p&gt;Today, prompted by a question on the &lt;code&gt;#kde&lt;&#x2F;code&gt; channel on
&lt;a href=&quot;https:&#x2F;&#x2F;libera.chat&#x2F;&quot;&gt;libera&lt;&#x2F;a&gt;, I looked into how Plasma handles its registry of
recently used folders and documents. Turns out it’s way more complicated than I
first thought.&lt;&#x2F;p&gt;
&lt;p&gt;The question specifically was whether there was a way to programmatically add
files to &lt;a href=&quot;https:&#x2F;&#x2F;okular.kde.org&#x2F;&quot;&gt;Okular’s&lt;&#x2F;a&gt; recently opened documents, so
that’s where I started looking. I was already aware that some apps like Okular
and &lt;a href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;gwenview&#x2F;&quot;&gt;Gwenview&lt;&#x2F;a&gt; keep their own history
independently from the system, and I quickly found out that Okular simply keeps
a list of recently opened files in its configuration file &lt;code&gt;~&#x2F;.config&#x2F;okularrc&lt;&#x2F;code&gt;
of all places.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;25&amp;#x2F;recent-okular.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;recent-okular.027f08aef7f3b49b.png&quot; alt=&quot;A screenshot of Okular,
KDE&amp;#x27;s PDF document viewer. The application shows its welcome page, with a button
to open a new document beside a list of recently opened documents. The latter
contains an entry for a PDF of the POSIX Base Specifications.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;Okular’s welcome page, with recent documents listed.&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;This got me thinking. Maybe it would be a decent idea to instead have Okular
interact with the system history directly. For that I first had to understand
how exactly it worked.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-standard&quot;&gt;The Standard&lt;&#x2F;h3&gt;
&lt;p&gt;The way that I &lt;em&gt;thought&lt;&#x2F;em&gt; Plasma’s system history worked was through
freedesktop.org’s &lt;a href=&quot;https:&#x2F;&#x2F;www.freedesktop.org&#x2F;wiki&#x2F;Specifications&#x2F;desktop-bookmark-spec&#x2F;&quot;&gt;Desktop Bookmark
Specification&lt;&#x2F;a&gt;
. The gist of it is that applications read from and write to a well-known file
&lt;code&gt;$XDG_DATA_DIR&#x2F;recently-used.xbel&lt;&#x2F;code&gt;. Indeed that file existed and it even
contained the relevant entry:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;xml&quot; class=&quot;language-xml &quot;&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;bookmark href=&amp;quot;IEEE%20Standard%20-%20POSIX%20Base%20Specifications,%20Issue%208,%202024.pdf&amp;quot;&amp;gt;
&amp;lt;info&amp;gt;
  &amp;lt;metadata owner=&amp;quot;http:&amp;#x2F;&amp;#x2F;freedesktop.org&amp;quot;&amp;gt;
    &amp;lt;mime:mime-type type=&amp;quot;application&amp;#x2F;pdf&amp;quot;&amp;#x2F;&amp;gt;
    &amp;lt;bookmark:applications&amp;gt;
      &amp;lt;bookmark:application name=&amp;quot;org.kde.okular&amp;quot; exec=&amp;quot;okular %u&amp;quot; count=&amp;quot;1&amp;quot;&amp;#x2F;&amp;gt;
    &amp;lt;&amp;#x2F;bookmark:applications&amp;gt;
  &amp;lt;&amp;#x2F;metadata&amp;gt;
&amp;lt;&amp;#x2F;info&amp;gt;
&amp;lt;&amp;#x2F;bookmark&amp;gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Okular then seemed to write to both &lt;code&gt;recently-used.xbel&lt;&#x2F;code&gt; and &lt;code&gt;okularrc&lt;&#x2F;code&gt; when
instead it could simply access the former directly and keep all history entries
out of its configuration file. What’s more, having Okular forget its history
would only clear the entry in &lt;code&gt;okularrc&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The most prominent place in which system history is displayed is in
&lt;a href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;dolphin&#x2F;&quot;&gt;Dolphin’s&lt;&#x2F;a&gt; “Recent Files” panel. After clearing
Okular’s history entry I still found the document there, so it seemed obvious to
assume that it uses &lt;code&gt;recently-used.xbel&lt;&#x2F;code&gt;. Dolphin lets you forget specific
entries from history, so I confidently deleted the entry there and re-checked
the file. Weirdly, the entry was still there even though Dolphin didn’t show it
anymore…&lt;&#x2F;p&gt;
&lt;p&gt;It was time to delve into the code. Untangling all the interconnected parts took
a while, but after a good 10 minutes, I finally knew what was going on: &lt;strong&gt;There
was another history provider.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-other-standard&quot;&gt;The Other “Standard”&lt;&#x2F;h3&gt;
&lt;p&gt;This is where I have to mention KDE’s activities. Activities are a
&lt;a href=&quot;https:&#x2F;&#x2F;pointieststick.com&#x2F;2024&#x2F;02&#x2F;06&#x2F;whats-going-on-with-activities-in-plasma-6&#x2F;&quot;&gt;somewhat&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;kactivitymanagerd&#x2F;-&#x2F;issues&#x2F;6&quot;&gt;ill-defined&lt;&#x2F;a&gt;
concept but they basically boil down to the idea of providing a different
computing space depending on what you are doing at the moment. In reality the
most obvious user-facing activity feature in Plasma 6 is that you can customize
your task bar and wallpaper per activity so you could consider it an extension
of virtual desktops - applications open on one activity won’t be shown once you
switch to another.&lt;&#x2F;p&gt;
&lt;p&gt;Crucially, however, the activity subsystem
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;kactivitymanagerd&#x2F;&quot;&gt;&lt;code&gt;kactivitymanagerd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is
also used to manage recently opened files. I imagine the plan is (or was) to
enable tracking file history per activity, but in all my testing I could not get
this to work - history seems to be global. So what this essentially means is
that an application might, and most probably will:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Keep its own history, most of the time through
&lt;a href=&quot;https:&#x2F;&#x2F;api.kde.org&#x2F;frameworks&#x2F;kconfigwidgets&#x2F;html&#x2F;classKRecentFilesAction.html&quot;&gt;KRecentFilesAction&lt;&#x2F;a&gt;
and a simplistic history implementation. The data here is exclusively accessed
by the application itself.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Keep its history in the desktop-agnostic &lt;code&gt;recently-used.xbel&lt;&#x2F;code&gt; file. In KDE’s
case this usually does not happen in the application itself but instead through
its &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&quot;&gt;KIO&lt;&#x2F;a&gt; framework. Other desktop
systems might read and display this data, but KDE seems to be write-only:
history is appended, but never shown to the user.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Keep its history in an &lt;a href=&quot;https:&#x2F;&#x2F;www.sqlite.org&#x2F;&quot;&gt;SQLite&lt;&#x2F;a&gt; database under
&lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;kactivitymanagerd&lt;&#x2F;code&gt;, managed by a daemon. This is what you see in
Dolphin and what you can manage under “Recent Files” in the system settings.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;It also means that if you want to tweak history management, forget documents or
folders, or turn the thing(s) off, you have to look in a multitude of places:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If the application provides a setting to manage or disable its own history,
use that. If that’s not available (like in Okular) you’re out of luck. Disabling
an application’s own history will not impact the other two history providers -
you will still see recent files in Dolphin and elsewhere in the system.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;There’s been
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;merge_requests&#x2F;1670&quot;&gt;ongoing&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-workspace&#x2F;-&#x2F;merge_requests&#x2F;4560&quot;&gt;work&lt;&#x2F;a&gt; to
streamline management of entries in &lt;code&gt;recently-used.xbel&lt;&#x2F;code&gt;, spurred by &lt;a href=&quot;https:&#x2F;&#x2F;bugs.kde.org&#x2F;show_bug.cgi?id=480276&quot;&gt;this
bug&lt;&#x2F;a&gt;. You may also use the
undocumented &lt;code&gt;UseRecent&lt;&#x2F;code&gt;, &lt;code&gt;MaxEntries&lt;&#x2F;code&gt;, and &lt;code&gt;IgnoreHidden&lt;&#x2F;code&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;blob&#x2F;57342c46bf3789cd6f7b07ec33086a24f26223ad&#x2F;src&#x2F;core&#x2F;krecentdocument.cpp#L512-515&quot;&gt;options&lt;&#x2F;a&gt;
read from &lt;code&gt;~&#x2F;.config&#x2F;kdeglobals&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Tweak &lt;code&gt;kactivitymanagerd&lt;&#x2F;code&gt; history in system settings under “Recent Files”.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;forgetting-history&quot;&gt;Forgetting History&lt;&#x2F;h3&gt;
&lt;p&gt;With all this in mind my immediate reaction is to shy away from the whole
endeavour to have Okular interface with the system history - there’s too many
moving parts, some of which aren’t even yet well-defined on KDE’s side.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>A plethora of bug fixes</title>
		<published>2024-10-14T20:33:27+02:00</published>
		<updated>2024-10-14T20:33:27+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/24/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/24/</id>
		<content type="html">&lt;p&gt;For whatever reason I’ve been uncovering software bugs at an unprecedented rate
in the past 10 days. This is by no means a bad thing, I enjoy hunting down and
fixing bugs, but it does mean that the additional overhead of drafting a post
about each bug becomes a bit too much. So instead here’s a quick overview - the
linked patches and merge requests will have more information, if you are
interested.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;trash-size-calculation-in-kio&quot;&gt;Trash size calculation in KIO&lt;&#x2F;h3&gt;
&lt;p&gt;I noticed this one pretty much right after starting to use
&lt;a href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;dolphin&#x2F;&quot;&gt;Dolphin&lt;&#x2F;a&gt; but did not end up looking into it
until quite a bit later: when displaying the size of the items in the trash, the
application would always show 0 bytes. This would also cause the automated
cleanup of items to fail - Dolphin simply believed that the trash was empty.&lt;&#x2F;p&gt;
&lt;p&gt;KDE uses the &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&quot;&gt;KIO&lt;&#x2F;a&gt; framework to provide
management of the trash. A &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;commit&#x2F;0ab81b6bac953b12b454bef4874946bb7fc8db85&quot;&gt;recent
commit&lt;&#x2F;a&gt;
had changed the construction of a
&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-6&#x2F;qdiriterator.html&quot;&gt;QDirIterator&lt;&#x2F;a&gt; in a way that would
make it ignore all items when iterating over the trash directory. Thankfully the
fix was straightforward and it was &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&#x2F;-&#x2F;merge_requests&#x2F;1729&quot;&gt;merged
quickly&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-shortlog-1-segfaults-outside-of-a-git-repository&quot;&gt;git-shortlog(1) segfaults outside of a git repository&lt;&#x2F;h3&gt;
&lt;p&gt;This one I uncovered as I was writing a small script to give me an overview of
commit authors in all the git repositories I had cloned locally. I was happily
scanning through my source directory using the
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-shortlog#Documentation&#x2F;git-shortlog.txt---authorltpatterngt&quot;&gt;&lt;code&gt;--author&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
flag for &lt;code&gt;git-shortlog(1)&lt;&#x2F;code&gt; to generate this, fully expecting git to complain
about the few non-git directories I had. Instead of complaints, however, I got a
segfault.&lt;&#x2F;p&gt;
&lt;p&gt;Turns out that a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;git&#x2F;git&#x2F;commit&#x2F;ab274909d4&quot;&gt;change back in
May&lt;&#x2F;a&gt; stopped setting SHA1 as the
default object hash. This was done to progress the slow-moving &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;hash-function-transition&quot;&gt;transition to
stronger hash functions&lt;&#x2F;a&gt; but
inadvertently broke &lt;code&gt;git-shortlog(1)&lt;&#x2F;code&gt; whose argument parsing machinery expected
a default hash algorithm to be set. I sent &lt;a href=&quot;https:&#x2F;&#x2F;public-inbox.org&#x2F;git&#x2F;20241011183445.229228-1-wolf@oriole.systems&#x2F;T&#x2F;#u&quot;&gt;a
patch&lt;&#x2F;a&gt;
upstream.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;an-infinite-loop-in-plasmashell&quot;&gt;An infinite loop in plasmashell&lt;&#x2F;h3&gt;
&lt;p&gt;I regularly use the
&lt;a href=&quot;https:&#x2F;&#x2F;docs.kde.org&#x2F;stable5&#x2F;en&#x2F;plasma-desktop&#x2F;plasma-desktop&#x2F;activities-interface.html&quot;&gt;Activities&lt;&#x2F;a&gt;
functionality in Plasma 6 and switch through my activities using Plasma’s
built-in activity manager. A couple of days ago I managed to make &lt;code&gt;plasmashell&lt;&#x2F;code&gt;,
the provider for Plasma’s desktop and task bar, freeze - I had hit the “up
arrow” key in the activity filter text box when there were no results visible.
This was perfectly reproducible, so I went to investigate.&lt;&#x2F;p&gt;
&lt;p&gt;The cause of the issue was a do-while construct not handling a specific sentinel
value, making it loop infinitely. For this one I also opened a &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-desktop&#x2F;-&#x2F;merge_requests&#x2F;2574&quot;&gt;merge
request&lt;&#x2F;a&gt;
upstream.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>musl and a curious Rust segfault</title>
		<published>2024-10-02T18:42:07+02:00</published>
		<updated>2024-10-02T18:42:07+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/23/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/23/</id>
		<content type="html">&lt;p&gt;About a week ago I noticed that &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;fd&quot;&gt;&lt;code&gt;fd(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, a
Rust-based alternative to &lt;a href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;findutils&#x2F;&quot;&gt;&lt;code&gt;find(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
would suddenly segfault on my &lt;a href=&quot;https:&#x2F;&#x2F;www.musl-libc.org&#x2F;&quot;&gt;musl&lt;&#x2F;a&gt;-based server
system. Usually a segfault is nothing particularly special to my eyes, but this
one was different. Even just having &lt;code&gt;fd(1)&lt;&#x2F;code&gt; attempt to print its help text was
enough to trigger it, and when I attempted to debug it with
&lt;a href=&quot;https:&#x2F;&#x2F;www.sourceware.org&#x2F;gdb&#x2F;&quot;&gt;&lt;code&gt;gdb(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, I saw the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;(gdb) run
Starting program: &amp;#x2F;usr&amp;#x2F;bin&amp;#x2F;fd

Program received signal SIGSEGV, Segmentation fault.
memcpy () at ..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;string&amp;#x2F;x86_64&amp;#x2F;memcpy.s:18
warning: 18	..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;string&amp;#x2F;x86_64&amp;#x2F;memcpy.s: No such file or directory
(gdb) bt
#0  memcpy () at ..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;string&amp;#x2F;x86_64&amp;#x2F;memcpy.s:18
#1  0x00007ffff7ab7177 in __copy_tls () at ..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;env&amp;#x2F;__init_tls.c:66
#2  0x00007ffff7ab730d in static_init_tls () at ..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;env&amp;#x2F;__init_tls.c:149
#3  0x00007ffff7aae89d in __init_libc () at ..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;env&amp;#x2F;__libc_start_main.c:39
#4  0x00007ffff7aae9c0 in __libc_start_main () at ..&amp;#x2F;src_musl&amp;#x2F;src&amp;#x2F;env&amp;#x2F;__libc_start_main.c:80
#5  0x00007ffff74107f6 in _start ()
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So… the segfault is in musl, not in &lt;code&gt;fd&lt;&#x2F;code&gt;!?&lt;&#x2F;p&gt;
&lt;p&gt;I immediately checked whether other basic programs on the system worked. &lt;em&gt;They
did.&lt;&#x2F;em&gt; I checked when I last updated musl. &lt;em&gt;A couple of months ago, so that can’t
be it.&lt;&#x2F;em&gt; I checked specifically whether another Rust-based program worked. &lt;em&gt;It
did.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;fd(1)&lt;&#x2F;code&gt; had been updated pretty recently, and I remembered it working correctly
about a month ago, so maybe something specific to &lt;code&gt;fd(1)&lt;&#x2F;code&gt;’s usage of Rust
triggered this segfault in musl? I wanted to make sure I could reproduce this in
a development environment, so I cloned the &lt;code&gt;fd(1)&lt;&#x2F;code&gt; repository, built a debug
release, and ran it…&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;It worked.&lt;&#x2F;em&gt; Huh!?&lt;&#x2F;p&gt;
&lt;p&gt;I decided it was likely that &lt;a href=&quot;https:&#x2F;&#x2F;wiki.gentoo.org&#x2F;wiki&#x2F;Portage&quot;&gt;&lt;code&gt;portage&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
Gentoo’s package manager, was building the program differently, so I took care
to apply the same build flags to the development build. And what can I say:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;error: failed to run custom build command for `crossbeam-utils v0.8.20`

Caused by:
  process didn&amp;#x27;t exit successfully: `fd&amp;#x2F;target&amp;#x2F;[...]&amp;#x2F;build-script-build`
      (signal: 11, SIGSEGV: invalid memory reference)

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;… it didn’t even get to build the &lt;code&gt;fd&lt;&#x2F;code&gt; binary proper. A segfault again, too.
What on earth was going on? Why didn’t this also happen in the &lt;code&gt;portage&lt;&#x2F;code&gt; build?&lt;&#x2F;p&gt;
&lt;p&gt;Thankfully I now had a reproducer, so I did the only sensible thing and started
removing random build flags until I got &lt;code&gt;fd&lt;&#x2F;code&gt; to build again. This was our
culprit:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;-Wl,-z,pack-relative-relocs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Already pretty out of my depth considering the fact that I couldn’t fathom how
&lt;code&gt;fd(1)&lt;&#x2F;code&gt; got musl to segfault on &lt;code&gt;memcpy&lt;&#x2F;code&gt;, I now also found that a piece of the
puzzle required me to understand specific linker flags. &lt;em&gt;Oof.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Unsure what to do next I decided on a whim to compare the working and the
broken binary with &lt;code&gt;readelf(1)&lt;&#x2F;code&gt;. The most obvious difference was that the
working binary had its &lt;code&gt;.rela.dyn&lt;&#x2F;code&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Relocation_(computing)&quot;&gt;relocation&lt;&#x2F;a&gt; section
populated with entries whilst the broken one was missing &lt;code&gt;.rela.dyn&lt;&#x2F;code&gt; but had
&lt;code&gt;.relr.dyn&lt;&#x2F;code&gt; instead. At a loss, I stopped and went to do something else.&lt;&#x2F;p&gt;
&lt;p&gt;The story would probably have ended here had I not mentioned this conundrum to
&lt;a href=&quot;https:&#x2F;&#x2F;ahti.space&#x2F;~nortti&#x2F;&quot;&gt;my partner&lt;&#x2F;a&gt; later in the day. We decided to have
another look at the binaries. After some discussion we determined that the
working binary was dynamically linked whilst the broken one wasn’t. The other
working Rust-based program, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;ripgrep&quot;&gt;&lt;code&gt;rg(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
was also dynamically linked and had been built a while ago, so &lt;strong&gt;at some point
&lt;code&gt;portage&lt;&#x2F;code&gt; must have stopped producing Rust executables that were dynamically
linked&lt;&#x2F;strong&gt;. Finally some progress!&lt;&#x2F;p&gt;
&lt;p&gt;At this point we need some background. Early on, Rust decided to use the
&lt;code&gt;x86_64-unknown-linux-musl&lt;&#x2F;code&gt; target to provide statically-linked binaries that
would run on a wide range of systems. Whilst support for dynamically linked
executables on musl systems was &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;pull&#x2F;40113&quot;&gt;added back in
2017&lt;&#x2F;a&gt;, the default behaviour was
never changed, so Gentoo has to make sure to disable static linking by passing
the &lt;code&gt;target-feature=-crt-static&lt;&#x2F;code&gt; flag.&lt;&#x2F;p&gt;
&lt;p&gt;It does this in a system-wide fashion by setting an environment variable in
&lt;a href=&quot;https:&#x2F;&#x2F;wiki.gentoo.org&#x2F;wiki&#x2F;&#x2F;etc&#x2F;env.d&quot;&gt;&lt;code&gt;&#x2F;etc&#x2F;env.d&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ cat &amp;#x2F;etc&amp;#x2F;env.d&amp;#x2F;50rust-bin-1.80.1
LDPATH=&amp;quot;&amp;#x2F;usr&amp;#x2F;lib&amp;#x2F;rust&amp;#x2F;lib&amp;quot;
MANPATH=&amp;quot;&amp;#x2F;usr&amp;#x2F;lib&amp;#x2F;rust&amp;#x2F;man&amp;quot;
CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUSTFLAGS=&amp;quot;-C target-feature=-crt-static&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This setting should therefore be picked up by &lt;code&gt;portage&lt;&#x2F;code&gt; as well, but when I
examined its build environment it was simply not there. So finally we come to
the last piece of the puzzle: a &lt;a href=&quot;https:&#x2F;&#x2F;gitweb.gentoo.org&#x2F;repo&#x2F;gentoo.git&#x2F;commit&#x2F;eclass&#x2F;cargo.eclass?id=27d469a2114b4ad0b3e682854c50c806753eb472&quot;&gt;recent
change&lt;&#x2F;a&gt;
in how &lt;code&gt;RUSTFLAGS&lt;&#x2F;code&gt; are set within &lt;code&gt;portage&lt;&#x2F;code&gt;. Here’s the important part:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;local -x CARGO_TARGET_&amp;quot;${TRIPLE}&amp;quot;_RUSTFLAGS=&amp;quot;-C strip=none -C linker=${LD_A[0]}&amp;quot;
[[ ${#LD_A[@]} -gt 1 ]] &amp;amp;&amp;amp; local CARGO_TARGET_&amp;quot;${TRIPLE}&amp;quot;_RUSTFLAGS+=&amp;quot;$(printf -- &amp;#x27; -C link-arg=%s&amp;#x27; &amp;quot;${LD_A[@]:1}&amp;quot;)&amp;quot;
local CARGO_TARGET_&amp;quot;${TRIPLE}&amp;quot;_RUSTFLAGS+=&amp;quot; ${RUSTFLAGS}&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Quoth the &lt;code&gt;bash(1)&lt;&#x2F;code&gt; manual:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Local variables “shadow” variables with the same name declared at previous
scopes.  For instance, a local variable declared in a function hides a global
variable of the same name: references and assignments refer to the local
variable, leaving the global variable unmodified.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;When previously the &lt;code&gt;RUSTFLAGS&lt;&#x2F;code&gt; environment variable was only touched when
cross-compiling, it was now overridden. To confirm, I edited the file in
question to include the previous value, and both &lt;code&gt;fd(1)&lt;&#x2F;code&gt; and &lt;code&gt;rg(1)&lt;&#x2F;code&gt; worked
again. Success!&lt;&#x2F;p&gt;
&lt;p&gt;This whole saga was also &lt;a href=&quot;https:&#x2F;&#x2F;bugs.gentoo.org&#x2F;940197&quot;&gt;reported&lt;&#x2F;a&gt; to the
Gentoo bug tracker and promptly fixed. A project for another day is figuring out
exactly how a change from static linking to dynamic linking causes segfaults
like this, because I sure would love to know the details.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>MIME type subclassing and its consequences</title>
		<published>2024-09-28T18:23:12+02:00</published>
		<updated>2024-09-28T18:23:12+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/22/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/22/</id>
		<content type="html">&lt;p&gt;The freedesktop.org &lt;a href=&quot;https:&#x2F;&#x2F;specifications.freedesktop.org&#x2F;shared-mime-info-spec&#x2F;latest&quot;&gt;shared MIME-info database
spec&lt;&#x2F;a&gt; says
the following in &lt;a href=&quot;https:&#x2F;&#x2F;specifications.freedesktop.org&#x2F;shared-mime-info-spec&#x2F;latest&#x2F;ar01s02.html#subclassing&quot;&gt;section
2.11&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A type is a subclass of another type if any instance of the first type is
also an instance of the second. For example, all &lt;code&gt;image&#x2F;svg+xml&lt;&#x2F;code&gt; files are
also &lt;code&gt;application&#x2F;xml&lt;&#x2F;code&gt;, &lt;code&gt;text&#x2F;plain&lt;&#x2F;code&gt; and &lt;code&gt;application&#x2F;octet-stream&lt;&#x2F;code&gt; files.
Subclassing is about the format, rather than the category of the data (for
example, there is no ‘generic spreadsheet’ class that all spreadsheets
inherit from).&lt;&#x2F;p&gt;
&lt;p&gt;Some subclass rules are implicit:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;All &lt;code&gt;text&#x2F;*&lt;&#x2F;code&gt; types are subclasses of &lt;code&gt;text&#x2F;plain&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;All streamable types (ie, everything except the &lt;code&gt;inode&#x2F;*&lt;&#x2F;code&gt; types) are subclasses of application&#x2F;octet-stream.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;So far so good; this makes intuitive sense and seems sensible enough. There is
an interesting consequence of this rule when the MIME-info database is used by
desktop systems for file associations, however: &lt;strong&gt;An application associated with
&lt;code&gt;application&#x2F;octet-stream&lt;&#x2F;code&gt; will automatically be associated with all streamable
types as well.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This means that if you associate &lt;code&gt;application&#x2F;octet-stream&lt;&#x2F;code&gt; with your text
editor, your desktop system will also suggest you open video and audio files
with that same text editor. This behaviour can be quite surprising, especially
if the association was added automatically when a file was opened through the
“Open with…” dialog.&lt;&#x2F;p&gt;
&lt;p&gt;What is even more confusing if you don’t happen to know the subclassing rule is
the fact that &lt;code&gt;~&#x2F;.config&#x2F;mimeapps.list&lt;&#x2F;code&gt; and applications interfacing with this
file will not even list the editor as associated with any audio or video files.
You might just skip over the entry it has for &lt;code&gt;application&#x2F;octet-stream&lt;&#x2F;code&gt;, not
realizing its significance. Perhaps you even assume (understandably) that
&lt;code&gt;application&#x2F;octet-stream&lt;&#x2F;code&gt; only specifies any file of “unknown” type.
User-facing documentation on desktop systems (if it even exists) does not
discuss this behaviour.&lt;&#x2F;p&gt;
&lt;p&gt;Whilst looking into this I found an older KDE bug report with some &lt;a href=&quot;https:&#x2F;&#x2F;bugs.kde.org&#x2F;show_bug.cgi?id=425154#c2&quot;&gt;interesting
thoughts&lt;&#x2F;a&gt; on how to explain this
behaviour to the end user, but sadly as far as I have seen none of these have
made it into the system setting’s file association dialog.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Pretty names for mount points in &#x2F;etc&#x2F;fstab</title>
		<published>2024-09-26T19:27:54+02:00</published>
		<updated>2024-09-26T19:27:54+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/21/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/21/</id>
		<content type="html">&lt;p&gt;The file manager I’m using on my Plasma 6 system,
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;system&#x2F;dolphin&quot;&gt;Dolphin&lt;&#x2F;a&gt;, has built-in support for
remote folders via the &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;frameworks&#x2F;kio&quot;&gt;KIO&lt;&#x2F;a&gt; framework.
Where before I was relying on &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libfuse&#x2F;sshfs&quot;&gt;sshfs&lt;&#x2F;a&gt; mount
points in &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;, I decided to try out the Dolphin way and set up my
remote devices using its &lt;code&gt;sftp&lt;&#x2F;code&gt; backend.&lt;&#x2F;p&gt;
&lt;p&gt;After a couple of days now I can say that this works beautifully… until you
want to access the remote device on something that does not interface with KIO.
This is especially important for me (and
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;plasma&#x2F;plasma-desktop&#x2F;-&#x2F;issues&#x2F;71#note_640907&quot;&gt;others&lt;&#x2F;a&gt;)
since I want to be able to browse networked filesystems via my terminal and have
the ability to directly open a terminal in that location through Dolphin,
something which is not possible with the KIO backend.&lt;&#x2F;p&gt;
&lt;p&gt;So in the end I went back to mount points in &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;. One small problem
remained, however, and that was the way those mount points were displayed
within Dolphin. There seemed to be no way to customize a mount point’s name or
icon, leading to an annoyingly long &lt;code&gt;&#x2F;home&#x2F;wolf&#x2F;net&#x2F;hosts&#x2F;coleridge&lt;&#x2F;code&gt; entry in
the &lt;em&gt;Devices&lt;&#x2F;em&gt; section of Dolphin’s places panel.&lt;&#x2F;p&gt;
&lt;p&gt;I couldn’t find any help in &lt;code&gt;fstab(5)&lt;&#x2F;code&gt;, and indeed I had never heard of a way
to give a mount point a “pretty name”. However, after a bit of searching, I
found people offhandedly mentioning the &lt;code&gt;x-gvfs-name&lt;&#x2F;code&gt; option. Some more
searching revealed that nobody seems to care about documenting these features,
but I was finally able to find an authoritative source within &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;GNOME&#x2F;gvfs&#x2F;blob&#x2F;989d746ed771fc5e5bf134677cf8d571170b262e&#x2F;monitor&#x2F;udisks2&#x2F;what-is-shown.txt#L29-L35&quot;&gt;gvfs
itself&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Happily there’s not only &lt;code&gt;x-gvfs-name&lt;&#x2F;code&gt; but also support for custom icons
through &lt;code&gt;x-gvfs-icon&lt;&#x2F;code&gt;. So, if you want your file manager to display a pretty
name and icon for one of your mount points, simply add the following to the
relevant entry in &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;x-gvfs-name=My%20Device,x-gvfs-icon=network-server
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This should be possible at least on GNOME and KDE desktops. I imagine a bunch
of other environments and programs silently support this behaviour as well.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;21&amp;#x2F;places.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;places.6ef5ef79aa6dfdb4.png&quot; alt=&quot;A screenshot of Dolphin, KDE&amp;#x27;s
file manager, showing the user&amp;#x27;s home directory with the places panel on the
left side containing various categorized entries. The entries below the Devices
category read flood, demeter, coleridge, and OnePlus 12, each with its own
pretty name and relevant icon.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;Dolphin displaying pretty names and
icons in the &lt;em&gt;Devices&lt;&#x2F;em&gt; category&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>List mpv(1)&#x27;s watch_later entries with later(1)</title>
		<published>2024-09-19T22:45:36+02:00</published>
		<updated>2024-09-19T22:45:36+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/20/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/20/</id>
		<content type="html">&lt;p&gt;If you are like me then you have a basically never-ending backlog of videos to
watch. Perhaps sometimes you even watch videos so long that they’re basically
impossible to finish in one sitting. Or you have about an hour left on a video,
but you should really go to sleep.&lt;&#x2F;p&gt;
&lt;p&gt;All of these require some way to remember the timestamp where you left off. I
use &lt;a href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;&quot;&gt;&lt;code&gt;mpv(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to watch my videos and thankfully there is a
built-in way to do this. By default, hitting &lt;code&gt;Q&lt;&#x2F;code&gt; will quit the video and
remember the timestamp (&lt;a href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;manual&#x2F;stable&#x2F;#resuming-playback&quot;&gt;among other
settings&lt;&#x2F;a&gt;) for next time you
open the file. This works regardless of whether the video exists on your
filesystem or is streamed from a URL.&lt;&#x2F;p&gt;
&lt;p&gt;After a while of using this you might amass more than a couple of unfinished
videos that &lt;code&gt;mpv(1)&lt;&#x2F;code&gt; knows about, but what it sadly does not provide is an easy
way to show you which videos those are…&lt;&#x2F;p&gt;
&lt;p&gt;Whilst you can set
&lt;a href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;manual&#x2F;stable&#x2F;#options-write-filename-in-watch-later-config&quot;&gt;&lt;code&gt;write-filename-in-watch-later-config&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
and have &lt;code&gt;mpv(1)&lt;&#x2F;code&gt; save filenames and URLs in its watch later entries, quickly
finding them is another story.&lt;&#x2F;p&gt;
&lt;p&gt;This is where a shared effort between my partner
&lt;a href=&quot;https:&#x2F;&#x2F;ahti.space&#x2F;~nortti&#x2F;&quot;&gt;nortti&lt;&#x2F;a&gt; and me comes in:
&lt;a href=&quot;https:&#x2F;&#x2F;git.oriole.systems&#x2F;later&#x2F;about&#x2F;&quot;&gt;&lt;code&gt;later(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. It is a small Python
script that parses &lt;code&gt;mpv(1)&lt;&#x2F;code&gt;’s &lt;a href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;manual&#x2F;stable&#x2F;#watch-later&quot;&gt;watch
later&lt;&#x2F;a&gt; entries and displays them in a
human-readable and pretty manner:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;albatross ~$ later
Sep 19 19:50	https:&amp;#x2F;&amp;#x2F;www.youtube.com&amp;#x2F;watch?v=VKGtMK4CGV4	# The 2 Hour Hunt for Light Arrows - OoT Randomizer
Sep 19 22:30	&amp;#x2F;home&amp;#x2F;wolf&amp;#x2F;Mall Grab - Understand feat. Brendan Yates.webm
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;From here it is easy to open up the video you want to continue watching: simply
paste the path or URL printed by &lt;code&gt;later(1)&lt;&#x2F;code&gt; into &lt;code&gt;mpv(1)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;You might notice that the YouTube video is commented with its title. This is not
information that &lt;code&gt;mpv(1)&lt;&#x2F;code&gt; saves, but &lt;code&gt;later(1)&lt;&#x2F;code&gt; can help here too. Using the
&lt;code&gt;-u&lt;&#x2F;code&gt; or &lt;code&gt;--update-titles&lt;&#x2F;code&gt; flag, it will extract video titles using
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yt-dlp&#x2F;yt-dlp&quot;&gt;&lt;code&gt;yt-dlp(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and save them in its cache for
subsequent retrieval. This should work for any site that &lt;code&gt;yt-dlp(1)&lt;&#x2F;code&gt; itself
supports.&lt;&#x2F;p&gt;
&lt;p&gt;If you have a Python available, setting up and using &lt;code&gt;later(1)&lt;&#x2F;code&gt; is trivial:
simply copy the script into a directory in your &lt;code&gt;$PATH&lt;&#x2F;code&gt; (and the manual into
&lt;code&gt;$MANPATH&lt;&#x2F;code&gt;) or use the &lt;code&gt;Makefile&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ PREFIX=~&amp;#x2F;.local make install
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Do note that for &lt;code&gt;later(1)&lt;&#x2F;code&gt; to work correctly, the aforementioned
&lt;code&gt;write-filename-in-watch-later-config&lt;&#x2F;code&gt; setting needs to be set.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>KDE Plasma 6 and two bugs</title>
		<published>2024-09-18T21:16:12+02:00</published>
		<updated>2024-09-18T21:16:12+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/19/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/19/</id>
		<content type="html">&lt;p&gt;For the last couple of months I have been running &lt;a href=&quot;https:&#x2F;&#x2F;swaywm.org&#x2F;&quot;&gt;sway&lt;&#x2F;a&gt; on
my main desktop system after having been forced away from
&lt;a href=&quot;https:&#x2F;&#x2F;hub.darcs.net&#x2F;raichoo&#x2F;hikari&quot;&gt;hikari&lt;&#x2F;a&gt; because of its practically halted
development and incompatibility with newer
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.freedesktop.org&#x2F;wlroots&#x2F;wlroots&#x2F;&quot;&gt;wlroots&lt;&#x2F;a&gt; versions.&lt;&#x2F;p&gt;
&lt;p&gt;I never felt completely satisfied with it and the whole experience was rather
joyless, so about a week ago I decided to give &lt;a href=&quot;https:&#x2F;&#x2F;kde.org&#x2F;announcements&#x2F;megarelease&#x2F;6&#x2F;&quot;&gt;KDE Plasma
6&lt;&#x2F;a&gt; a try after a surprisingly
decent experience on the &lt;a href=&quot;https:&#x2F;&#x2F;neon.kde.org&#x2F;&quot;&gt;KDE Neon&lt;&#x2F;a&gt; live image.&lt;&#x2F;p&gt;
&lt;p&gt;Whilst undoubtedly greater in its complexity and code size than sway, to me
Plasma 6 seems like one of the last decent desktop environments still remaining.
It’s incredibly customisable (but still comes with good defaults), looks nice
out of the box, and most importantly seems to care about providing a nicely
integrated and featureful experience. This even includes a companion app on
Android, &lt;a href=&quot;https:&#x2F;&#x2F;kdeconnect.kde.org&#x2F;&quot;&gt;KDE Connect&lt;&#x2F;a&gt;. It remains to be seen
whether it will fully convince me in the long run, but for now I am very
satisfied with it.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;19&amp;#x2F;kde-plasma.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;kde-plasma.67631c40d6568bd3.jpg&quot; alt=&quot;A picture of the KDE Plasma 6 desktop
environment, with a browser window, a terminal, and an instance of Dolphin, a
file manager.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;KDE Plasma 6 with a few windows open&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;This last week was mostly spent learning about the desktop environment and
setting everything up exactly how I want it to be, but there were two notable
bugs to squash as well.&lt;&#x2F;p&gt;
&lt;p&gt;The first one reared its ugly head once I enabled backwards-compatibility with
Qt5-based apps. I have a couple of such apps still, most prominently
&lt;a href=&quot;https:&#x2F;&#x2F;www.mumble.info&#x2F;&quot;&gt;Mumble&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;quassel-irc.org&#x2F;&quot;&gt;Quassel IRC&lt;&#x2F;a&gt;.
Once the latter was built against the KFramework libraries, no more
notifications were shown…&lt;&#x2F;p&gt;
&lt;p&gt;Fixing this ended up taking about two days, most of which were spent discovering
exactly how
&lt;a href=&quot;https:&#x2F;&#x2F;api.kde.org&#x2F;frameworks&#x2F;knotifications&#x2F;html&#x2F;index.html&quot;&gt;KNotifications&lt;&#x2F;a&gt;
work. KDE provides apps with a tighter integration to the notification service,
allowing users to specify which types of notifications to show, and how.
Applications specify their notifications by shipping an &lt;code&gt;&amp;lt;app&amp;gt;.notifyrc&lt;&#x2F;code&gt; file.
KDE ties this file to the application by matching its base name to the name
given to the application (usually through a call to
&lt;code&gt;QCoreApplication::applicationName&lt;&#x2F;code&gt; or when creating
&lt;a href=&quot;https:&#x2F;&#x2F;api.kde.org&#x2F;frameworks&#x2F;kcoreaddons&#x2F;html&#x2F;classKAboutData.html&quot;&gt;KAboutData&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;It turns out that Quassel had recently been
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quassel&#x2F;quassel&#x2F;commit&#x2F;020c163421691fa37330826df92ac0a248721290&quot;&gt;patched&lt;&#x2F;a&gt;
to fix an issue where desktop environments did not show its icon correctly. This
required a call to &lt;code&gt;setDesktopFileName&lt;&#x2F;code&gt; in &lt;code&gt;KAboutData&lt;&#x2F;code&gt; to make environments
aware of the connection. However, Quassel’s application name was
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quassel&#x2F;quassel&#x2F;commit&#x2F;020c163421691fa37330826df92ac0a248721290#diff-c72daad7d2269a2ee21584002ef1f30f4415335358a6c6f7e7296d3290a51a91R117&quot;&gt;changed in the same commit&lt;&#x2F;a&gt;,
severing its link with the name given through its &lt;code&gt;quassel.notifyrc&lt;&#x2F;code&gt; file. This
seems to have been done in addition to the &lt;code&gt;setDesktopFileName&lt;&#x2F;code&gt; call and was not
necessary to solve the issue the commit was trying to address.&lt;&#x2F;p&gt;
&lt;p&gt;I prepared a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quassel&#x2F;quassel&#x2F;pull&#x2F;619&quot;&gt;pull request&lt;&#x2F;a&gt; fixing
this issue by reverting part of the offending commit.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;19&amp;#x2F;notification.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;notification.061a2c93574b054b.png&quot; alt=&quot;A picture of a
notification from Quassel IRC saying &amp;#x27;yay for notifications&amp;#x27;.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;Glad to
have these back&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;The second bug I randomly came across whilst perusing &lt;code&gt;journalctl&lt;&#x2F;code&gt; and seeing
the following error from &lt;a href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;dolphin&#x2F;&quot;&gt;Dolphin&lt;&#x2F;a&gt;, KDE’s file
manager:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;QString(View)::contains(): called on an invalid QRegularExpression object
(pattern is &amp;#x27;\A(?:file:&amp;#x2F;&amp;#x2F;&amp;#x2F;home&amp;#x2F;wolf&amp;#x2F;[Z-A]&amp;#x2F;?)\z&amp;#x27;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Seeing this immediately made me wonder whether Dolphin plugs a URL straight into
a regular expression without escaping it, and the answer, of course,
&lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;system&#x2F;dolphin&#x2F;-&#x2F;blob&#x2F;5c069471fccc41051b967be69f95655b3e0b73ef&#x2F;src&#x2F;dolphinviewcontainer.cpp#L554-557&quot;&gt;is yes&lt;&#x2F;a&gt;.
I spent most of today’s afternoon hunting this issue down and preparing a &lt;a href=&quot;https:&#x2F;&#x2F;invent.kde.org&#x2F;system&#x2F;dolphin&#x2F;-&#x2F;merge_requests&#x2F;831&quot;&gt;merge
request&lt;&#x2F;a&gt; that fixes
it in an elegant way.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Thoughts on: Biosphere&#x27;s Microgravity, Substrata</title>
		<published>2022-04-09T18:24:20+02:00</published>
		<updated>2022-04-09T18:24:20+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/18/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/18/</id>
		<content type="html">&lt;figure class=&quot;float-right&quot;&gt;
&lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;biosphere.bandcamp.com&amp;#x2F;album&amp;#x2F;microgravity-reissue-with-bonus-album&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;microgravity.84af8465f741fd75.jpg&quot; alt=&quot;Cover art for Microgravity&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;Microgravity&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;strong&gt;Biosphere&lt;&#x2F;strong&gt;, Geir Jenssen’s moniker, is one you often see featured in various
ambient music best-of lists. For some reason it has taken me until this last
month to finally check out his early (and most well-regarded) work, prompted by
a recommendation on Spotify of all places.&lt;&#x2F;p&gt;
&lt;p&gt;Beginning with 1991’s
&lt;a href=&quot;https:&#x2F;&#x2F;biosphere.bandcamp.com&#x2F;album&#x2F;microgravity-reissue-with-bonus-album&quot;&gt;&lt;em&gt;Microgravity&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;
I was quite surprised to find a more beat- and loop-heavy album. Jenssen
interweaves simple and repetitive melodies with bass-heavy backing and unique
samples from nature and science-fiction. The titular first track &lt;em&gt;Microgravity&lt;&#x2F;em&gt;,
for example, pits a ringing phone against an icy howling wind, all whilst
accompanied by a deep bass track that contrasts rather cold and industrial
instrumentation.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Baby Satellite&lt;&#x2F;em&gt; and &lt;em&gt;Tranquilizer&lt;&#x2F;em&gt; pick up the pace a bit and get a bit more
sample-heavy, the latter containing a lovely vocal sample from &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Space:_1999&quot;&gt;Space:
1999&lt;&#x2F;a&gt;. Listening to the album I
couldn’t help being reminded of &lt;a href=&quot;https:&#x2F;&#x2F;woob.bandcamp.com&#x2F;&quot;&gt;&lt;strong&gt;Woob&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;’s early
albums as &lt;strong&gt;Journeyman&lt;&#x2F;strong&gt;, &lt;em&gt;Mama 6&lt;&#x2F;em&gt; and &lt;em&gt;National Hijinx&lt;&#x2F;em&gt;, which are similarly
heavy on samples from pop fiction.&lt;&#x2F;p&gt;
&lt;p&gt;The album’s penultimate track &lt;em&gt;Baby Interphase&lt;&#x2F;em&gt; is probably my favourite one off
of the original album. Its use of klaxons and the sound of what I can only
describe as a “science-fiction beacon” in the main mix are refreshingly silly,
whilst the rest of the instrumentation has a great space-y and floaty feel.&lt;&#x2F;p&gt;
&lt;p&gt;The album as linked above contains a second CD with unreleased tracks from the
era, and those are not to be missed. Especially the upbeat &lt;em&gt;Search&lt;&#x2F;em&gt; with its
unrelenting repetition of a vocal sample and &lt;em&gt;Dewy Fields&lt;&#x2F;em&gt; with its haunting
trumpet-like cries.&lt;&#x2F;p&gt;
&lt;figure class=&quot;float-left&quot;&gt;
&lt;a href=&quot;https:&amp;#x2F;&amp;#x2F;biosphere.bandcamp.com&amp;#x2F;album&amp;#x2F;substrata&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;substrata.99ec5607368ced0b.jpg&quot; alt=&quot;Cover art for Substrata&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;Substrata&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;Jenssen’s third studio album,
&lt;a href=&quot;https:&#x2F;&#x2F;biosphere.bandcamp.com&#x2F;album&#x2F;substrata&quot;&gt;&lt;em&gt;Substrata&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;, was released in
1997. This is the first genuinely ambient album by &lt;strong&gt;Biosphere&lt;&#x2F;strong&gt; and one that
usually ends up on best-of lists.&lt;&#x2F;p&gt;
&lt;p&gt;Right off the bat I do not have trouble seeing why. &lt;em&gt;As the Sun Kissed the
Horizon&lt;&#x2F;em&gt; opens the album with field recordings of a far-away airplane contrasted
against the frolicking of children in the background. It then seamlessly fades
into the ambient tour de force which is &lt;em&gt;Poa Alpina&lt;&#x2F;em&gt;, an achingly beautiful
composition of strums and thick almost foglike drone. Ended by sounds of
downpour the track dissolves into &lt;em&gt;Chukhung&lt;&#x2F;em&gt;, a more alien and inquisitive
experience that has a main sample endlessly rotate around the listener’s ears,
as if searching for someone.&lt;&#x2F;p&gt;
&lt;p&gt;Vocal samples are present again as well, with &lt;em&gt;The Things I Tell You&lt;&#x2F;em&gt; containing
an excerpt from The Giant’s speech in Season 2 of Twin Peaks and &lt;em&gt;Hyperborea&lt;&#x2F;em&gt;
featuring Major Briggs from the same episode talking to his son, Bobby.
&lt;em&gt;Kobresia&lt;&#x2F;em&gt; samples a radio broadcast of a documentary about Karl Nikolaev, a
purported telepath trying to guess the nature of an item lying two floors away.&lt;&#x2F;p&gt;
&lt;p&gt;The album ends with &lt;em&gt;Silene&lt;&#x2F;em&gt;, an eerie and strangely nostalgic track that
reminded me a bit of &lt;strong&gt;The Caretaker&lt;&#x2F;strong&gt;’s &lt;em&gt;An Empty Bliss Beyond This World&lt;&#x2F;em&gt;.
There’s lots to love in this album, but I personally keep coming back to &lt;em&gt;Poa
Alpina&lt;&#x2F;em&gt; as my favourite. I just can’t get enough of how painfully lonely it
feels.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Getting MPD to parse TIT1 in MP3 files</title>
		<published>2022-02-13T18:25:11+01:00</published>
		<updated>2022-02-13T18:25:11+01:00</updated>
		<link href="https://zunzuncito.oriole.systems/17/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/17/</id>
		<content type="html">&lt;p&gt;I have a pretty extensive music library that I manage with MPD, the &lt;a href=&quot;https:&#x2F;&#x2F;www.musicpd.org&#x2F;&quot;&gt;Music
Player Daemon&lt;&#x2F;a&gt;. For the longest time now I have also
been aware of &lt;a href=&quot;https:&#x2F;&#x2F;beets.readthedocs.io&#x2F;en&#x2F;stable&#x2F;&quot;&gt;&lt;code&gt;beets&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, another
management system for music libraries. I played around with it a few times but
never took the plunge to have it organize my entire collection.&lt;&#x2F;p&gt;
&lt;p&gt;A few days ago, whilst looking up a particularly obscure recording, I ended up
finding it on &lt;a href=&quot;https:&#x2F;&#x2F;musicbrainz.org&#x2F;&quot;&gt;MusicBrainz&lt;&#x2F;a&gt; and decided to give beets,
which integrates very tightly with that service, another serious try.&lt;&#x2F;p&gt;
&lt;p&gt;Yesterday I finally completed a first rough import of my entire library (which
encompasses about 20,000 songs in 1400 albums). Given the integration with
MusicBrainz, I now try to map every album to a release in their database. If I
can’t find it there, I instead fall back to an old favourite of mine,
&lt;a href=&quot;https:&#x2F;&#x2F;www.discogs.com&#x2F;&quot;&gt;Discogs&lt;&#x2F;a&gt;. &lt;code&gt;beets&lt;&#x2F;code&gt; will automatically update and
correct any tags once I select the right release.&lt;&#x2F;p&gt;
&lt;p&gt;Whilst importing I decided that I should make more use of the “Grouping” tag as
a way to organize albums into an arbitrary group. This is useful if a series of
media features music that was composed by multiple artists. By matching on the
&lt;em&gt;Haibane Renmei&lt;&#x2F;em&gt; grouping, for example, I can find all music that was made for
that show, without having to keep artist names in mind.&lt;&#x2F;p&gt;
&lt;p&gt;“Grouping” seemed well-supported in MPD, but whilst updating some albums that I
(sadly) only have in MP3 format, I found that MPD would not add the grouping
information to its database.&lt;&#x2F;p&gt;
&lt;p&gt;As per the &lt;a href=&quot;https:&#x2F;&#x2F;id3.org&#x2F;id3v2.4.0-frames&quot;&gt;ID3v2.4 standard&lt;&#x2F;a&gt;, the &lt;code&gt;TIT1&lt;&#x2F;code&gt;
frame is used for this kind of information in MP3 files. Sure enough, that tag
was set correctly by &lt;code&gt;beets&lt;&#x2F;code&gt;, and both &lt;code&gt;mutagen-inspect&lt;&#x2F;code&gt; and &lt;code&gt;ffprobe&lt;&#x2F;code&gt; found it.
MPD, however, even though
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MusicPlayerDaemon&#x2F;MPD&#x2F;issues&#x2F;563&quot;&gt;this PR&lt;&#x2F;a&gt; had been merged almost
3 years ago, refused to pick it up.&lt;&#x2F;p&gt;
&lt;p&gt;After having the &lt;code&gt;#mpd&lt;&#x2F;code&gt; IRC channel sanity-check my configuration, I
investigated some more. Perhaps my version of &lt;code&gt;libid3tag&lt;&#x2F;code&gt; was outdated. It
wasn’t. Perhaps there were some encoding issues, but then why would other tags
from the same file work fine? Couldn’t be that either. I hooked up GDB and found
that
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MusicPlayerDaemon&#x2F;MPD&#x2F;commit&#x2F;319c9699fb09e7c35e2aafa022ff8e1f0dcfcd8b#diff-740cf5f8b0a6d5c79ba81c3c4325726dbac10a838f5f704b630f6a8967574b60R320&quot;&gt;this line from the PR&lt;&#x2F;a&gt;
was never actually reached at all!&lt;&#x2F;p&gt;
&lt;p&gt;I decided to look a bit closer at how exactly MPD reads tags. The specific
&lt;code&gt;scan_id3_tag&lt;&#x2F;code&gt; function that the PR modified is only called in two places,
&lt;code&gt;plugins&#x2F;DsdLib.cxx&lt;&#x2F;code&gt; and (indirectly) in &lt;code&gt;plugins&#x2F;MadDecoderPlugin.cxx&lt;&#x2F;code&gt;. I had
neither of these decoders installed, so… MPD just never got to read anything.&lt;&#x2F;p&gt;
&lt;p&gt;Yet how was I getting &lt;em&gt;any&lt;&#x2F;em&gt; tags, then?&lt;&#x2F;p&gt;
&lt;p&gt;After some spelunking in the decoder plugin folders and with the fact on my mind
that the only decoder I had actually compiled in was
&lt;a href=&quot;https:&#x2F;&#x2F;ffmpeg.org&#x2F;&quot;&gt;FFmpeg&lt;&#x2F;a&gt;, something dawned on me. Perhaps it was FFmpeg
that was reading the tags.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MusicPlayerDaemon&#x2F;MPD&#x2F;blob&#x2F;ad4cf79cc967f973f264efe1024f5be1c9a962ec&#x2F;src&#x2F;decoder&#x2F;plugins&#x2F;FfmpegMetaData.cxx#L75-L94&quot;&gt;Indeed it was&lt;&#x2F;a&gt;.
Turns out that FFmpeg does all of the heavy lifting here, and MPD really just
asks it for any metadata and &lt;strong&gt;parses the ones it understands&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;MPD uses “grouping” as a cross-format identifier for grouping information. It
expects that particular string to be a key in the &lt;code&gt;AVDictionary&lt;&#x2F;code&gt; returned by
FFmpeg
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MusicPlayerDaemon&#x2F;MPD&#x2F;blob&#x2F;ad4cf79cc967f973f264efe1024f5be1c9a962ec&#x2F;src&#x2F;decoder&#x2F;plugins&#x2F;FfmpegMetaData.cxx#L61-L62&quot;&gt;here&lt;&#x2F;a&gt;.
Crucially, FFmpeg
&lt;a href=&quot;https:&#x2F;&#x2F;git.ffmpeg.org&#x2F;gitweb&#x2F;ffmpeg.git&#x2F;blob&#x2F;68595b46cb374658432fff998e82e5ff434557ac:&#x2F;libavformat&#x2F;id3v2.c#l64&quot;&gt;does not expose&lt;&#x2F;a&gt;
&lt;code&gt;TIT1&lt;&#x2F;code&gt; as “grouping” in its metadata conversion table, having MPD drop &lt;code&gt;TIT1&lt;&#x2F;code&gt; on
the floor like a hot potato.&lt;&#x2F;p&gt;
&lt;p&gt;It is debatable where this particular bug should be fixed. I decided to send
&lt;a href=&quot;https:&#x2F;&#x2F;ffmpeg.org&#x2F;pipermail&#x2F;ffmpeg-devel&#x2F;2022-February&#x2F;292948.html&quot;&gt;a patch&lt;&#x2F;a&gt;
upstream to FFmpeg, given that more than just MPD can benefit from a fix there.
For the next poor soul I also prepared
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MusicPlayerDaemon&#x2F;MPD&#x2F;pull&#x2F;1439&quot;&gt;a PR&lt;&#x2F;a&gt;
that clarifies how exactly MPD reads metadata.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Building the Linux kernel with clang and full LTO</title>
		<published>2022-02-05T19:29:44+01:00</published>
		<updated>2022-02-05T19:29:44+01:00</updated>
		<link href="https://zunzuncito.oriole.systems/16/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/16/</id>
		<content type="html">&lt;p&gt;My main desktop PC tracks the latest LTS &lt;a href=&quot;https:&#x2F;&#x2F;kernel.org&#x2F;&quot;&gt;release&lt;&#x2F;a&gt; of the
Linux kernel which very recently switched to the 5.15 line. Along with neat new
features like the
&lt;a href=&quot;https:&#x2F;&#x2F;lore.kernel.org&#x2F;all&#x2F;aa4aa155-b9b2-9099-b7a2-349d8d9d8fbd@paragon-software.com&#x2F;&quot;&gt;NTFS3 driver&lt;&#x2F;a&gt;
it also includes experimental support for
&lt;a href=&quot;https:&#x2F;&#x2F;llvm.org&#x2F;docs&#x2F;LinkTimeOptimization.html&quot;&gt;Link Time Optimization&lt;&#x2F;a&gt;
through LLVM’s
&lt;a href=&quot;https:&#x2F;&#x2F;clang.llvm.org&#x2F;&quot;&gt;&lt;code&gt;clang&lt;&#x2F;code&gt; compiler&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I’m not really one to shy away from weird experiments, so I decided to run a
full LTO kernel for a while. If you have a recent version of &lt;code&gt;clang&lt;&#x2F;code&gt; and the
&lt;a href=&quot;https:&#x2F;&#x2F;lld.llvm.org&#x2F;&quot;&gt;&lt;code&gt;lld&lt;&#x2F;code&gt; linker&lt;&#x2F;a&gt;, building one is as easy as toggling
&lt;code&gt;CONFIG_LTO_CLANG_FULL&lt;&#x2F;code&gt; and exporting the right flags to &lt;code&gt;make&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;make CC=clang LLVM=1 menuconfig
	# CONFIG_LTO_CLANG_FULL=y
make CC=clang LLVM=1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Subsequent steps are the same as with a normal build:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo make install
sudo make modules_install
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Keep in mind, however, that any out-of-tree modules such as ZFS must also be
built with &lt;code&gt;clang&lt;&#x2F;code&gt;. Here I ran into
&lt;a href=&quot;https:&#x2F;&#x2F;bugs.gentoo.org&#x2F;show_bug.cgi?id=814194&quot;&gt;this bug&lt;&#x2F;a&gt; which should soon be
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openzfs&#x2F;zfs&#x2F;pull&#x2F;13046&quot;&gt;fixed upstream&lt;&#x2F;a&gt;. For now I
backported that fix locally to ZFS 2.1.2 and am building it like so:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo CC=clang LLVM=1 emerge zfs-kmod
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Build times and memory usage when building are increased dramatically with full
LTO. Optimizing &lt;code&gt;vmlinux.o&lt;&#x2F;code&gt; alone allocates about 3 to 4 GiB of memory. If you
rely a lot on incremental builds, thin LTO might be the better option here.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Minecraft on syys</title>
		<published>2021-12-29T19:14:15+02:00</published>
		<updated>2021-12-29T19:14:15+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/15/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/15/</id>
		<content type="html">&lt;p&gt;I didn’t expect this to actually work, but as half-jokingly mentioned in the &lt;a class=&quot;internal&quot; href=&quot;&#x2F;14&quot;&gt;previous post&lt;&#x2F;a&gt;
, here’s a Minecraft server running on a
machine from around 25 years ago. Pretty much worked out of the box with
&lt;code&gt;icedtea&lt;&#x2F;code&gt; assembled by the build VM and a 512MiB swapfile (of which only around
50MiB was actually used).&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;15&amp;#x2F;minecraft-syys-1.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;minecraft-syys-1.09387cd79b4ef26d.jpg&quot; alt=&quot;nortti in the overworld on the syys
Minecraft server&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;nortti in the overworld on the syys Minecraft
server&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;The game was surprisingly playable, and we made it all the way to finding
diamonds.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;15&amp;#x2F;minecraft-syys-2.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;minecraft-syys-2.e345a90abeffbbaa.jpg&quot; alt=&quot;nortti in the Minecraft on syys
looking at a diamond deposit in the ceiling&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;We found diamonds!&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>A post from syys</title>
		<published>2021-12-29T14:30:36+02:00</published>
		<updated>2021-12-29T14:30:36+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/14/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/14/</id>
		<content type="html">&lt;p&gt;I spent the last few days building a &lt;a href=&quot;https:&#x2F;&#x2F;syys.nortti.org&quot;&gt;cursed Gentoo
system&lt;&#x2F;a&gt; with my &lt;a href=&quot;https:&#x2F;&#x2F;nortti.org&quot;&gt;partner&lt;&#x2F;a&gt;. We
named it “syys”, after “syyskuu” - the Finnish word for September.&lt;&#x2F;p&gt;
&lt;p&gt;This post was written, committed, and pushed on that system, using only
software that was built on it natively. For some heavier parts that were not
involved in the making of this post (&lt;code&gt;links&lt;&#x2F;code&gt;, &lt;code&gt;fish&lt;&#x2F;code&gt;, both of which need
&lt;code&gt;cmake&lt;&#x2F;code&gt;, which would take hours to build) we set up a portage binary host on a
VM that is nearly identical to the actual Pentium II system.&lt;&#x2F;p&gt;
&lt;p&gt;The next logical step, of course, is to try and get Minecraft running on it…&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Filtering files in Thunar</title>
		<published>2021-11-27T17:51:10+01:00</published>
		<updated>2021-11-27T17:51:10+01:00</updated>
		<link href="https://zunzuncito.oriole.systems/13/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/13/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;docs.xfce.org&#x2F;xfce&#x2F;thunar&#x2F;start&quot;&gt;Thunar&lt;&#x2F;a&gt;, XFCE’s file manager, was a
pretty late addition to my core set of tools that I rely on to accomplish
day-to-day tasks. I started using it heavily maybe 2 or 3 years ago. For the
longest time before that I had been using &lt;a href=&quot;https:&#x2F;&#x2F;ranger.github.io&#x2F;&quot;&gt;ranger&lt;&#x2F;a&gt;, a
console file manager.&lt;&#x2F;p&gt;
&lt;p&gt;The ability to move and copy files around between multiple directories using
drag-and-drop is basically Thunar’s killer feature for me. I’m often faster
using the mouse to select a bunch of files and then quickly dragging them
someplace else. In comparison, ranger’s select-then-yank-and-paste workflow
feels very cumbersome.&lt;&#x2F;p&gt;
&lt;p&gt;However, there’s always been a feature in ranger that Thunar did not have - the
very simple but powerful ability to filter the current directory listing by
showing only files matching a given pattern. There’s a more or less hidden way
to have Thunar select files matching a wildcard with &lt;code&gt;CTRL-S&lt;&#x2F;code&gt;, but that relies
on popping up an extra dialogue, and doesn’t play well with interactive use.&lt;&#x2F;p&gt;
&lt;p&gt;Very early on I found
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.xfce.org&#x2F;xfce&#x2F;thunar&#x2F;-&#x2F;issues&#x2F;2&quot;&gt;a feature request&lt;&#x2F;a&gt;
for this, but it looked largely abandoned and I forgot about it until today
when, to my extreme surprise, I discovered that it was implemented just 3 months
ago.  There does not seem to have been any large fanfare around it; the
changelog
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.xfce.org&#x2F;xfce&#x2F;thunar&#x2F;-&#x2F;blob&#x2F;eb2b1b284d08d045cf393bcbf2045965f263d781&#x2F;NEWS#L65&quot;&gt;buries it&lt;&#x2F;a&gt;
in more miscellaneous changes. Not a big deal.&lt;&#x2F;p&gt;
&lt;p&gt;Way more worrisome, however, is that the
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.xfce.org&#x2F;xfce&#x2F;thunar&#x2F;-&#x2F;merge_requests&#x2F;136&#x2F;diffs?commit_id=d6f916eb2b478a49c5b3ba453e773f81154dbd74&quot;&gt;commit&lt;&#x2F;a&gt;
implementing the feature does not introduce any user-facing documentation.
Nowhere is explained how the new feature works and what its limitations are. I
had to go read
&lt;a href=&quot;https:&#x2F;&#x2F;gitlab.xfce.org&#x2F;xfce&#x2F;thunar&#x2F;-&#x2F;blob&#x2F;d6f916eb2b478a49c5b3ba453e773f81154dbd74&#x2F;thunar&#x2F;thunar-list-model.c#L2113&quot;&gt;the
code&lt;&#x2F;a&gt;
to find out why my search results were littered with seemingly random files in
other directories. Turns out that it consults files in &lt;code&gt;GtkRecent&lt;&#x2F;code&gt; too, merging
results in the current directory with matches of files you had recently opened,
regardless of their location.&lt;&#x2F;p&gt;
&lt;p&gt;A terrible default in my opinion, so I immediately turned it off by disabling
the
&lt;a href=&quot;https:&#x2F;&#x2F;gnome.pages.gitlab.gnome.org&#x2F;gtk&#x2F;gtk4&#x2F;property.Settings.gtk-recent-files-enabled.html&quot;&gt;&lt;code&gt;gtk-recent-files-enabled&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
property in my GTK config. Thankfully you can still do that, albeit in a
system-wide fashion, but I don’t care about recent files.&lt;&#x2F;p&gt;
&lt;p&gt;Still, it’s really sad I had to go out of my way to find that out. A less
tech-savvy user could not have done that so easily. It would lower the bar
tremendously here to &lt;strong&gt;describe&lt;&#x2F;strong&gt; what a new feature does and point out &lt;strong&gt;how to
configure it&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A failure to do so makes software intransparent and hostile, furthers the notion
that the user experience is inherently bad, and very quickly leads to
resignation in the common user base.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>proc(5) hidepid=2 and systemd</title>
		<published>2021-10-27T12:46:24+02:00</published>
		<updated>2021-10-27T12:46:24+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/12/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/12/</id>
		<content type="html">&lt;p&gt;A couple of days ago I turned on
&lt;a href=&quot;https:&#x2F;&#x2F;manpages.debian.org&#x2F;bullseye&#x2F;manpages&#x2F;proc.5.en.html#hidepid&quot;&gt;&lt;code&gt;hidepid=2&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
for the &lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt; mount on my desktop PC. Today I saw the &lt;code&gt;systemd-userdbd&lt;&#x2F;code&gt;
service failing on bootup, and realized that it had been failing to start for a
few days. Aside from the fact that there really should be a well-supported and
easy way to notify administrators of failing units, this obviously needed some
investigation.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;systemctl status systemd-userdbd.service&lt;&#x2F;code&gt; wasn’t very helpful, but &lt;code&gt;journalctl&lt;&#x2F;code&gt;
had the specific error:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;[..] spawning &amp;#x2F;lib&amp;#x2F;systemd&amp;#x2F;systemd-userdbd: Read-only file system
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I didn’t immediately jump to the conclusion that this had to do with enabling
&lt;code&gt;hidepid=2&lt;&#x2F;code&gt;. After all, why would that result in a read-only file system?
Investigating a failure very early on in boot is a pain, so instead of wasting
my time on that I took to GitHub issues.&lt;&#x2F;p&gt;
&lt;p&gt;As it turns out, &lt;code&gt;hidepid=&lt;&#x2F;code&gt; is just
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;systemd&#x2F;systemd&#x2F;issues&#x2F;12955#issuecomment-508490893&quot;&gt;not supported&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;systemd&#x2F;systemd&#x2F;issues&#x2F;20848#issuecomment-930185888&quot;&gt;at all&lt;&#x2F;a&gt;
in systemd. This doesn’t seem to be pointed out anywhere, and I certainly was
not aware of it before. Services can set
&lt;a href=&quot;https:&#x2F;&#x2F;www.freedesktop.org&#x2F;software&#x2F;systemd&#x2F;man&#x2F;systemd.exec.html#ProtectProc=&quot;&gt;&lt;code&gt;ProtectProc=&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
but there doesn’t seem to be a clean way of restricting &#x2F;proc for unprivileged
users like a global &lt;code&gt;hidepid=2&lt;&#x2F;code&gt; did. I’ve removed the option for now.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Better hunk headers with gitattributes(5)</title>
		<published>2021-08-11T16:41:49+02:00</published>
		<updated>2021-08-11T16:41:49+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/11/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/11/</id>
		<content type="html">&lt;p&gt;Yesterday whilst catching up on the Git mailing list I stumbled upon this
&lt;a href=&quot;https:&#x2F;&#x2F;public-inbox.org&#x2F;git&#x2F;20210810190937.305765-1-tsdh@gnu.org&#x2F;&quot;&gt;patch&lt;&#x2F;a&gt;
proposing to improve the hunk header regex for Java. I had never paid much
attention to how &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-diff&quot;&gt;&lt;code&gt;git-diff(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; finds the
right method signature to show in the headers though I was vaguely aware of a
bunch of regexes for different languages.&lt;&#x2F;p&gt;
&lt;p&gt;Turns out that by default, as explained in the manual for
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;gitattributes#_defining_a_custom_hunk_header&quot;&gt;&lt;code&gt;gitattributes(5)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;code&gt;git-diff(1)&lt;&#x2F;code&gt; emulates the behaviour of GNU &lt;code&gt;diff -p&lt;&#x2F;code&gt; and does &lt;strong&gt;not&lt;&#x2F;strong&gt; consult
any of the language-specific regular expressions. This came as a bit of a
surprise to me, as Git usually has relatively sane and extensive defaults. Why
define all these regexes and then not use them by default?&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps one reason is that it is hard to tell when to use which. Git can only
look at the filename, and not all shell scripts share the &lt;code&gt;.sh&lt;&#x2F;code&gt; ending, for
example. Surely it would not be too invasive, however, to define sensible
defaults for, say, files ending in &lt;code&gt;.py&lt;&#x2F;code&gt; or &lt;code&gt;.rs&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In any case I updated my &lt;code&gt;~&#x2F;.config&#x2F;git&#x2F;attributes&lt;&#x2F;code&gt; with the following, and am
now enjoying better hunk headers across the board:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;*.c	diff=cpp
*.cpp	diff=cpp
*.go	diff=go
*.md	diff=markdown
*.pl	diff=perl
*.py	diff=python
*.rs	diff=rust
*.sh	diff=bash
*.tex	diff=tex
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The markdown setting is especially neat since it will now display the nearest
section right in the diff, like so:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;diff&quot; class=&quot;language-diff &quot;&gt;&lt;code class=&quot;language-diff&quot; data-lang=&quot;diff&quot;&gt;--- a&amp;#x2F;posts&amp;#x2F;weltschmerz.md
+++ b&amp;#x2F;posts&amp;#x2F;weltschmerz.md
@@ -24,6 +24,10 @@ ## Download
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Trying out the Nikon D5200</title>
		<published>2021-08-09T18:58:29+02:00</published>
		<updated>2021-08-09T18:58:29+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/10/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/10/</id>
		<content type="html">&lt;p&gt;I’ve been out and about a lot the past few days, on more or less extensive walks
around the countryside. I usually only have my Nexus 6 with me, whose camera,
being a 2013 device, is really not the best anymore.&lt;&#x2F;p&gt;
&lt;p&gt;Today I decided to try out my father’s Nikon D5200 instead to get some
experience using a more professional device. See below for a small selection of
my favourite shots.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;10&amp;#x2F;echinops.jpg&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;echinops.3bec30929acbcd81.jpg&quot; alt=&quot;Echinops, a globe thistle.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Echinops&quot;&gt;Echinops&lt;&#x2F;a&gt;, a globe thistle.&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;10&amp;#x2F;viburnum.jpg&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;viburnum.00bd32580117188b.jpg&quot; alt=&quot;The fruit of viburnum lantana, the wayfarer.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;The fruit of &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Viburnum_lantana&quot;&gt;viburnum
lantana&lt;&#x2F;a&gt;, the wayfarer.&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;10&amp;#x2F;acronicta.jpg&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;acronicta.2912252ecc643770.jpg&quot; alt=&quot;Acronicta aceris on gravel.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Sycamore_(moth)&quot;&gt;Acronicta aceris&lt;&#x2F;a&gt;
on gravel.&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>git-am(1) and mail sorting</title>
		<published>2021-07-25T16:58:29+02:00</published>
		<updated>2021-07-25T16:58:29+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/9/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/9/</id>
		<content type="html">&lt;p&gt;In the &lt;a class=&quot;internal&quot; href=&quot;&#x2F;8&quot;&gt;previous post&lt;&#x2F;a&gt;
 I talked about a couple of
different ways to apply patches with &lt;code&gt;mutt(1)&lt;&#x2F;code&gt; or &lt;code&gt;neomutt(1)&lt;&#x2F;code&gt;. Turns out
&lt;code&gt;Maildir&lt;&#x2F;code&gt; might not be the best format to use for &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; because its
files are not guaranteed to be in any specific order (per
&lt;a href=&quot;https:&#x2F;&#x2F;cr.yp.to&#x2F;proto&#x2F;maildir.html&quot;&gt;spec&lt;&#x2F;a&gt; they need only carry unique names).&lt;&#x2F;p&gt;
&lt;p&gt;As &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; does not sort its input, patches might be applied in the wrong
order. This came up on the mailing list as well, all the way
&lt;a href=&quot;https:&#x2F;&#x2F;public-inbox.org&#x2F;git&#x2F;20130301222018.GA839@WST420&#x2F;&quot;&gt;back in 2013&lt;&#x2F;a&gt;.
A fix specific to &lt;code&gt;Maildir&lt;&#x2F;code&gt; files created by &lt;code&gt;mutt(1)&lt;&#x2F;code&gt; was added in
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;git&#x2F;git&#x2F;commit&#x2F;18505c34237d3544729c3deed3e4f851fb672086&quot;&gt;&lt;code&gt;18505c3&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly &lt;code&gt;neomutt(1)&lt;&#x2F;code&gt; changed this format 5 years ago, removing the sequence number
that &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; relies on in commit
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;neomutt&#x2F;neomutt&#x2F;commit&#x2F;75b3708edb18815935692c60bbae56d5301f8210#diff-8904141e55cf466b09a2db0df752f92a29daf093e79df61121ecd347b7631c19L1489-L1491&quot;&gt;&lt;code&gt;75b3708&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
and replacing it with a call to &lt;code&gt;mutt_rand64()&lt;&#x2F;code&gt;. I can only assume no one is
using &lt;code&gt;neomutt(1)&lt;&#x2F;code&gt; to export patches to &lt;code&gt;Maildir&lt;&#x2F;code&gt;, since having patches applied
in the wrong order is a pretty significant problem.&lt;&#x2F;p&gt;
&lt;p&gt;For now I recommend using the &lt;code&gt;mbox&lt;&#x2F;code&gt; format instead when exporting patches.
Whilst that doesn’t guarantee a specific order either, usually mail clients are
nice enough to export mails to &lt;code&gt;mbox&lt;&#x2F;code&gt; in the order they are shown.&lt;&#x2F;p&gt;
&lt;p&gt;The core issue remains until &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; learns to sort mails itself.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Applying patches with mutt(1)</title>
		<published>2021-07-23T22:37:17+02:00</published>
		<updated>2021-07-23T22:37:17+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/8/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/8/</id>
		<content type="html">&lt;p&gt;When maintaining a project sooner or later there comes the time when you need to
apply patches that have been submitted to you. Assuming a patch-based workflow,
those are going to be one patch per mail, possibly connected in a thread.
There’s lots of different ways of getting those patches to their final
destination, &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-am&quot;&gt;&lt;code&gt;git-am(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, and in this post I
want to take a look at ones that work well with &lt;a href=&quot;http:&#x2F;&#x2F;mutt.org&#x2F;&quot;&gt;&lt;code&gt;mutt(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; or
&lt;a href=&quot;https:&#x2F;&#x2F;neomutt.org&#x2F;&quot;&gt;&lt;code&gt;neomutt(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; since that is what I use.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;I want to rely on the default bindings as much as possible. All mentioned
bindings should work out of the box.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Applying a single patch is very straightforward: Select the mail in the pager
and hit &lt;code&gt;|&lt;&#x2F;code&gt; to pipe it to an external command.  This command will be some
variation of &lt;code&gt;git-am(1)&lt;&#x2F;code&gt;, perhaps &lt;code&gt;git am -s&lt;&#x2F;code&gt; to also add a &lt;code&gt;Signed-off-by&lt;&#x2F;code&gt;
trailer.&lt;&#x2F;p&gt;
&lt;p&gt;What if you want to apply a patch series, however? An obvious solution would be
to pipe each message in the thread to &lt;code&gt;git-am(1)&lt;&#x2F;code&gt;. The &lt;code&gt;&amp;lt;pipe-message&amp;gt;&lt;&#x2F;code&gt; command
we invoked earlier with &lt;code&gt;|&lt;&#x2F;code&gt; only applies to the currently selected message, so
we can’t use that on the whole thread. Instead we can tag the whole thread using
&lt;code&gt;&amp;lt;Esc&amp;gt;t&lt;&#x2F;code&gt;, then use the &lt;code&gt;&amp;lt;tag-prefix&amp;gt;&lt;&#x2F;code&gt; command &lt;code&gt;;&lt;&#x2F;code&gt; followed by &lt;code&gt;|&lt;&#x2F;code&gt; to send all
tagged messages to &lt;code&gt;git-am(1)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;There’s two problems with this, though. The first is that depending on the setting
of &lt;a href=&quot;https:&#x2F;&#x2F;neomutt.org&#x2F;guide&#x2F;reference#3-280-%C2%A0pipe_split&quot;&gt;&lt;code&gt;pipe_split&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;code&gt;git-am(1)&lt;&#x2F;code&gt; might only apply the first patch in the series. This is the case if
&lt;code&gt;pipe_split&lt;&#x2F;code&gt; is set to the default of &lt;code&gt;no&lt;&#x2F;code&gt;; &lt;code&gt;mutt(1)&lt;&#x2F;code&gt; will then concatenate the
messages before sending them to the external command. Sadly this concatenated
format is slightly different from the &lt;code&gt;mbox&lt;&#x2F;code&gt; format that &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; expects,
making it not see anything past the first patch.&lt;&#x2F;p&gt;
&lt;p&gt;With &lt;code&gt;pipe_split&lt;&#x2F;code&gt; set to &lt;code&gt;yes&lt;&#x2F;code&gt;, &lt;code&gt;mutt(1)&lt;&#x2F;code&gt; spawns one process per tagged mail
instead, applying all patches correctly. Now that &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; is spawned once
per mail, however, you lose its atomicity: Neither &lt;code&gt;ORIG_HEAD&lt;&#x2F;code&gt; will be set
correctly, nor will &lt;code&gt;--abort&lt;&#x2F;code&gt; go back to the original branch.&lt;&#x2F;p&gt;
&lt;p&gt;This might not be a big issue, but I am not a fan. Thankfully &lt;code&gt;git-am(1)&lt;&#x2F;code&gt;
supports reading patches from &lt;code&gt;mbox&lt;&#x2F;code&gt; files or &lt;code&gt;Maildir&lt;&#x2F;code&gt; structures. So instead
of piping mails to &lt;code&gt;git-am(1)&lt;&#x2F;code&gt; via &lt;code&gt;&amp;lt;pipe-message&amp;gt;&lt;&#x2F;code&gt;, let’s save them to the
current directory: With the thread still tagged, &lt;code&gt;;C&lt;&#x2F;code&gt; (&lt;code&gt;&amp;lt;tag-prefix&amp;gt;&lt;&#x2F;code&gt; followed
by &lt;code&gt;&amp;lt;copy-message&amp;gt;&lt;&#x2F;code&gt;) will save a copy of it under a given path. Now you can
apply the series by hitting &lt;code&gt;!&lt;&#x2F;code&gt; and running &lt;code&gt;git am -s &amp;lt;path&amp;gt;&lt;&#x2F;code&gt;. This works with
&lt;a href=&quot;https:&#x2F;&#x2F;neomutt.org&#x2F;guide&#x2F;reference#3-188-%C2%A0mbox_type&quot;&gt;&lt;code&gt;mbox_type&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; set to
either &lt;code&gt;mbox&lt;&#x2F;code&gt; or &lt;code&gt;Maildir&lt;&#x2F;code&gt; (but see &lt;a class=&quot;internal&quot; href=&quot;&#x2F;9&quot;&gt;№ 9&lt;&#x2F;a&gt;
).&lt;&#x2F;p&gt;
&lt;p&gt;Of course there is no need to rely on the default bindings, especially if you
need to do this kind of thing very often. &lt;code&gt;mutt(1)&lt;&#x2F;code&gt; is easily customizable,
making it possible to bind the entire chain of actions to just one keystroke.
If you’re interested in a more detailed examination of a patch-based workflow
with &lt;code&gt;mutt(1)&lt;&#x2F;code&gt;, check out this
&lt;a href=&quot;http:&#x2F;&#x2F;kroah.com&#x2F;log&#x2F;blog&#x2F;2019&#x2F;08&#x2F;14&#x2F;patch-workflow-with-mutt-2019&#x2F;&quot;&gt;post&lt;&#x2F;a&gt;
by Greg Kroah-Hartman.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Wrap-around search in less(1)</title>
		<published>2021-07-09T22:28:13+02:00</published>
		<updated>2021-07-09T22:28:13+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/7/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/7/</id>
		<content type="html">&lt;p&gt;I recently became frightfully aware of how much time I spend in
&lt;a href=&quot;https:&#x2F;&#x2F;greenwoodsoftware.com&#x2F;less&#x2F;&quot;&gt;&lt;code&gt;less(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;It’s never been a utility I gave much conscious thought and I realized that it
is one of those programs that go largely ignored and underappreciated just for
their ubiquity and unobtrusiveness. For most people piping something to
&lt;code&gt;less(1)&lt;&#x2F;code&gt; has most likely become second nature. In the same way it is surely
unthinkable for some to read log files and manuals in anything other than
&lt;code&gt;less(1)&lt;&#x2F;code&gt;, or use any other pager for the Git suite.&lt;&#x2F;p&gt;
&lt;p&gt;If you’ve not given &lt;code&gt;less(1)&lt;&#x2F;code&gt; a closer look, I invite you to read &lt;a href=&quot;https:&#x2F;&#x2F;man7.org&#x2F;linux&#x2F;man-pages&#x2F;man1&#x2F;less.1.html&quot;&gt;its
manual&lt;&#x2F;a&gt;.  There’s lots of
neat features you might have missed, like filtering lines with &lt;code&gt;&amp;amp;&lt;&#x2F;code&gt;, toggling any
command-line option on the fly with &lt;code&gt;-&lt;&#x2F;code&gt;, following input as it appears with &lt;code&gt;F&lt;&#x2F;code&gt;,
or opening the current file in an editor with &lt;code&gt;v&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A feature I discovered only recently is the “wrap-around search modifier”.
Introduced in
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gwsw&#x2F;less&#x2F;commit&#x2F;27e2643875e010c30f9d51eb1124855b707806f4&quot;&gt;late 2020&lt;&#x2F;a&gt;
(past version 565), this modifier obsoletes the common dance of &lt;code&gt;g&lt;&#x2F;code&gt; and &lt;code&gt;n&lt;&#x2F;code&gt; to
redo the current search on the whole file. Now, if you hit &lt;code&gt;Ctrl-W&lt;&#x2F;code&gt; right after
issuing a forward or backward search, &lt;code&gt;less(1)&lt;&#x2F;code&gt; toggles search wrap-around.&lt;&#x2F;p&gt;
&lt;p&gt;There is no option to turn this behaviour on automatically. However, it is
possible to override the &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; and &lt;code&gt;?&lt;&#x2F;code&gt; bindings using
&lt;a href=&quot;https:&#x2F;&#x2F;man7.org&#x2F;linux&#x2F;man-pages&#x2F;man1&#x2F;lesskey.1.html&quot;&gt;&lt;code&gt;lesskey(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
Put the following in &lt;code&gt;~&#x2F;.lesskey&lt;&#x2F;code&gt;, run &lt;code&gt;lesskey&lt;&#x2F;code&gt;
(&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gwsw&#x2F;less&#x2F;commit&#x2F;a2137dcb01cbf46f148828a7389540dd5b51bff1&quot;&gt;not needed&lt;&#x2F;a&gt;
on versions past 590), and &lt;code&gt;less(1)&lt;&#x2F;code&gt; should now wrap the search automatically:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#command
&amp;#x2F; forw-search ^W
? back-search ^W
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Firefox and the Link HTTP header</title>
		<published>2021-07-03T13:23:34+02:00</published>
		<updated>2021-07-03T13:23:34+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/6/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/6/</id>
		<content type="html">&lt;p&gt;HTTP &lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;HTTP&#x2F;Headers&#x2F;Link&quot;&gt;defines&lt;&#x2F;a&gt;
the &lt;em&gt;Link&lt;&#x2F;em&gt; header with which
&lt;a href=&quot;https:&#x2F;&#x2F;www.iana.org&#x2F;assignments&#x2F;link-relations&#x2F;link-relations.xhtml&quot;&gt;&lt;em&gt;Link Relations&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;
can be defined directly in the HTTP response. This lets websites define their
stylesheets or favicons without having to pass them in an HTML
&lt;a href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;HTML&#x2F;Element&#x2F;link&quot;&gt;&lt;code&gt;&amp;lt;link&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
element.&lt;&#x2F;p&gt;
&lt;p&gt;When displaying certain files directly, Firefox wraps them in its own HTML. This
happens, for example, when you look at a &lt;code&gt;.txt&lt;&#x2F;code&gt; file marked as &lt;code&gt;text&#x2F;plain&lt;&#x2F;code&gt; or
an image marked as &lt;code&gt;image&#x2F;png&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Turns out that for plain-text files, Firefox will load and honour any stylesheet
passed to it in the &lt;em&gt;Link&lt;&#x2F;em&gt; header and apply it to its own HTML.  One could, for
example, link a stylesheet that overrides the font settings, or even include
pictures. Firefox will duly load all of these when displaying the file, whilst
&lt;em&gt;View Page Source&lt;&#x2F;em&gt; will still show only the file itself.  It is only when
looking at the HTTP response and the &lt;em&gt;Network&lt;&#x2F;em&gt; tab in the Inspector that you see
what exactly is happening.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;a href=&quot;&#x2F;6&amp;#x2F;firefox-link-header.png&quot;&gt;
		&lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;zunzuncito.oriole.systems&amp;#x2F;processed_images&amp;#x2F;firefox-link-header.0d9e36fe91914f2d.jpg&quot; alt=&quot;Firefox displaying a plain-text file
alongside a picture.&quot; &#x2F;&gt;
	&lt;&#x2F;a&gt;
	&lt;figcaption class=&quot;smaller&quot;&gt;A plain-text file… in Comic Sans… that also
displays a picture?&lt;&#x2F;figcaption&gt;
	&lt;&#x2F;figure&gt;
&lt;p&gt;This does not seem to work when Firefox is displaying images and it doesn’t work
&lt;em&gt;at all&lt;&#x2F;em&gt; in Chromium-based browsers. The only relevant entry in Mozilla’s
Bugzilla instance I could find was
&lt;a href=&quot;https:&#x2F;&#x2F;bugzilla.mozilla.org&#x2F;show_bug.cgi?id=748294&quot;&gt;this issue&lt;&#x2F;a&gt;
from 9 years ago.&lt;&#x2F;p&gt;
&lt;p&gt;Arguably this could be considered a bug, and I do strongly feel that Firefox
&lt;strong&gt;should not&lt;&#x2F;strong&gt; load any outside resource when displaying plain-text files. For
now, though, have fun confusing people with this.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https:&#x2F;&#x2F;puck.moe&quot;&gt;puck&lt;&#x2F;a&gt; for pointing this out to me.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Use git-send-email(1) only to send</title>
		<published>2021-06-25T18:25:34+02:00</published>
		<updated>2021-06-25T18:25:34+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/5/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/5/</id>
		<content type="html">&lt;p&gt;Even though &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-send-email&quot;&gt;&lt;code&gt;git-send-email(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; calls
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-format-patch&quot;&gt;&lt;code&gt;git-format-patch(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; if you
provide a revision list, oftentimes when submitting a patch series you should
instead run &lt;code&gt;git-format-patch(1)&lt;&#x2F;code&gt; first, and later use &lt;code&gt;git-send-email(1)&lt;&#x2F;code&gt; only
to submit the files it generated. There’s a bunch of reasons for this.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;send-email&lt;&#x2F;code&gt; is built chiefly for mail submission, not patch formatting.
There is no way to pass options meant for &lt;code&gt;format-patch&lt;&#x2F;code&gt;, meaning that
you miss out on really good features like
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-format-patch#Documentation&#x2F;git-format-patch.txt---no-cover-letter&quot;&gt;&lt;code&gt;--cover-letter&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
or
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-format-patch#Documentation&#x2F;git-format-patch.txt---interdiffltpreviousgt&quot;&gt;&lt;code&gt;--interdiff&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;If you use
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-send-email#Documentation&#x2F;git-send-email.txt---annotate&quot;&gt;&lt;code&gt;--annotate&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
or decide to edit the mail body, you will lose all changes if you quit before
sending. You can’t save your work and continue writing the mail later either.
Once you call &lt;code&gt;send-email&lt;&#x2F;code&gt;, you’re committed; It’s all or nothing.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-send-email#Documentation&#x2F;git-send-email.txt---compose&quot;&gt;&lt;code&gt;--compose&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
gets you a worse version of &lt;code&gt;format-patch&lt;&#x2F;code&gt;’s &lt;code&gt;--cover-letter&lt;&#x2F;code&gt;. No diffstat is
included by default, and the same problems as in 2) apply.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;format-patch&lt;&#x2F;code&gt; outputs text files for you to browse and edit. This can be
done on your own time and with your own tools, without the &lt;code&gt;send-email&lt;&#x2F;code&gt; prompt
nagging and stressing you.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Providing a convenient way of quickly sending out small patches makes sense, but
all in all I think the inclusion of formatting in &lt;code&gt;git-send-email(1)&lt;&#x2F;code&gt; is a
glaring misfeature. Hiding &lt;code&gt;git-format-patch(1)&lt;&#x2F;code&gt; away from the user makes
&lt;code&gt;git-send-email(1)&lt;&#x2F;code&gt; intransparent and, worse, really clunky to use for regular
patch workflows.&lt;&#x2F;p&gt;
&lt;p&gt;Sadly, &lt;a href=&quot;https:&#x2F;&#x2F;git-send-email.io&#x2F;&quot;&gt;git-send-email.io&lt;&#x2F;a&gt; still tells newcomers to
use &lt;strong&gt;only&lt;&#x2F;strong&gt; &lt;code&gt;get-send-email(1)&lt;&#x2F;code&gt;, without even mentioning &lt;code&gt;git-format-patch(1)&lt;&#x2F;code&gt;.
This &lt;a href=&quot;https:&#x2F;&#x2F;lists.sr.ht&#x2F;~sircmpwn&#x2F;sr.ht-dev&#x2F;%3C20200925224503.10032-1-evan.gates%40gmail.com%3E#%3CC5WTCDJYQZGF.22D6HCBBU9T82@homura%3E&quot;&gt;won’t change&lt;&#x2F;a&gt; any time soon, either.&lt;&#x2F;p&gt;
&lt;p&gt;That is a shame. Guiding people to a worse workflow will not increase the
standing of mail-based processes. For now I’d recommend linking newcomers &lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;MyFirstContribution#howto-git-send-email&quot;&gt;this
section&lt;&#x2F;a&gt; of
Git’s own contribution tutorial instead.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>(Un)Blinking cursors</title>
		<published>2021-06-17T20:37:37+02:00</published>
		<updated>2021-06-17T20:37:37+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/4/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/4/</id>
		<content type="html">&lt;p&gt;Whilst reviewing and discussing &lt;a href=&quot;https:&#x2F;&#x2F;git.oriole.systems&#x2F;weltschmerz&#x2F;commit&#x2F;?id=0774a46257bdc6daa1c6a1c3485d75bd07ef849c&quot;&gt;this
patch&lt;&#x2F;a&gt;
for weltschmerz I found out that there actually exists a global property
&lt;a href=&quot;https:&#x2F;&#x2F;developer.gnome.org&#x2F;gtk3&#x2F;stable&#x2F;GtkSettings.html#GtkSettings--gtk-cursor-blink&quot;&gt;&lt;code&gt;gtk-cursor-blink&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
that is honoured by all applications that build on GTK.&lt;&#x2F;p&gt;
&lt;p&gt;I don’t think I’ve ever seen this exposed in a settings dialog. Perhaps in the
accessibility settings, I rarely venture there. In any case, you can put
properties like these straight into &lt;code&gt;~&#x2F;.config&#x2F;gtk-3.0&#x2F;settings.ini&lt;&#x2F;code&gt; and GTK
apps will pick them up.&lt;&#x2F;p&gt;
&lt;p&gt;For QT apps it seems you can set
&lt;a href=&quot;https:&#x2F;&#x2F;doc.qt.io&#x2F;qt-5&#x2F;qapplication.html#cursorFlashTime-prop&quot;&gt;&lt;code&gt;cursorFlashTime&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
to a negative value in the aptly named &lt;code&gt;~&#x2F;.config&#x2F;Trolltech.conf&lt;&#x2F;code&gt; but I could
not get this to work with the only QT app that I use, quassel.&lt;&#x2F;p&gt;
&lt;p&gt;Not that I would want to, I do prefer a blinking cursor.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Patch workflows and git branch -d</title>
		<published>2021-06-13T20:22:51+02:00</published>
		<updated>2021-06-13T20:22:51+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/3/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/3/</id>
		<content type="html">&lt;p&gt;The notion of a “merged” branch is highly dependent on the
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;gitworkflows&quot;&gt;workflow&lt;&#x2F;a&gt; used for a project. I was
wanting to clean up some topic branches in my copy of git.git today, but &lt;code&gt;git branch -d&lt;&#x2F;code&gt; refused to delete them, pointing out that they were not yet merged.&lt;&#x2F;p&gt;
&lt;p&gt;I knew for a fact that they were, which made me look up how &lt;code&gt;git branch -d&lt;&#x2F;code&gt;
actually determines that. The manual is not entirely clear, but a
&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;git&#x2F;git&#x2F;blob&#x2F;211eca0895794362184da2be2a2d812d070719d3&#x2F;builtin&#x2F;branch.c#L116-L121&quot;&gt;comment&lt;&#x2F;a&gt;
in the code pointed out that git constructs the merge base of the branch and its
upstream (or &lt;code&gt;HEAD&lt;&#x2F;code&gt; if there is none) and checks whether the branch is reachable
from that merge base.&lt;&#x2F;p&gt;
&lt;p&gt;In a patch workflow, this will generally not be true. A lot of things may
happen to your patches before inclusion, and with git.git they will get at least
one other sign-off. They’ll be recorded in a merge commit, but it will not have
your original branch as one of its parents.&lt;&#x2F;p&gt;
&lt;p&gt;Therefore, neither &lt;code&gt;git branch -d&lt;&#x2F;code&gt; nor &lt;code&gt;git branch --merged&lt;&#x2F;code&gt; will report your
branch as merged. Both of these tools are built for the merge workflow instead.&lt;&#x2F;p&gt;
&lt;p&gt;To see if your work was merged in patch-based workflows, use
&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-cherry&quot;&gt;&lt;code&gt;git-cherry(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. Then you can safely
force deletion of the branch with &lt;code&gt;git branch -D&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Did you mean to go to...</title>
		<published>2021-06-12T19:47:12+02:00</published>
		<updated>2021-06-12T19:47:12+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/2/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/2/</id>
		<content type="html">&lt;p&gt;In recent versions of Firefox, single words are looked up via DNS when you enter
them in the URL bar. If the word resolves, the browser “helpfully” indicates
that there’s a page at &lt;code&gt;http:&#x2F;&#x2F;&amp;lt;word&amp;gt;&lt;&#x2F;code&gt; to visit.&lt;&#x2F;p&gt;
&lt;p&gt;Weird feature, though when taken at face value I can see its usefulness with a
combined search and URL bar. Ideally you’d have completely different semantics
for searching and (direct) browsing, but I don’t think something like this is
forthcoming. If anything I’d expect direct browsing to be ever more discouraged.
Nowadays search engines, not browsers, are the gateway to the internet.&lt;&#x2F;p&gt;
&lt;p&gt;In any case, turns out this feature also has &lt;a href=&quot;https:&#x2F;&#x2F;bugzilla.mozilla.org&#x2F;1642623&quot;&gt;interesting
side-effects&lt;&#x2F;a&gt; with (browser-based) DoH
turned on. If you ever need to turn it off, Firefox 78 added the following
about:config switch:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;browser.urlbar.dnsResolveSingleWordsAfterSearch
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Not that I think this is a great solution. DoH should be done on a system-wide
level (with local queries sent to your router or resolved through mDNS) and
there should be a way of trusting your router’s DNS to not forward local queries
to your ISP.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<author><name>wolf</name></author>
		<title>Launching zunzuncito</title>
		<published>2021-06-12T13:35:46+02:00</published>
		<updated>2021-06-12T13:35:46+02:00</updated>
		<link href="https://zunzuncito.oriole.systems/1/" type="text/html"/>
		<id>https://zunzuncito.oriole.systems/1/</id>
		<content type="html">&lt;p&gt;Hi, welcome to my bespoke microblog.&lt;&#x2F;p&gt;
&lt;p&gt;This is where I’ll keep things that aren’t fit for inclusion on &lt;a href=&quot;https:&#x2F;&#x2F;oriole.systems&quot;&gt;my main
site&lt;&#x2F;a&gt;, like smaller posts, stuff of less relevance or
depth, and anything else for which a proper post would take too much effort.&lt;&#x2F;p&gt;
&lt;p&gt;Expect this space to be updated very frequently. If you dare, subscribe to &lt;a href=&quot;&#x2F;atom.xml&quot;&gt;the
feed&lt;&#x2F;a&gt;. Per-tag feeds are also available on the respective tag
pages.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;contact&quot;&gt;Contact&lt;&#x2F;h3&gt;
&lt;p&gt;If you want to chat about anything on here, feel free to send me a mail or find
me on IRC. The &lt;a href=&quot;https:&#x2F;&#x2F;oriole.systems&quot;&gt;main site&lt;&#x2F;a&gt; has details.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;source&quot;&gt;Source&lt;&#x2F;h3&gt;
&lt;p&gt;This site is put together with &lt;a href=&quot;https:&#x2F;&#x2F;www.getzola.org&quot;&gt;zola&lt;&#x2F;a&gt;. Check out the
&lt;a href=&quot;https:&#x2F;&#x2F;git.oriole.systems&#x2F;zunzuncito&quot;&gt;git repository&lt;&#x2F;a&gt; if you are interested.&lt;&#x2F;p&gt;
</content>
	</entry>
</feed>
