<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss version="2.0">

<channel>
	<title>ExcitingAds! Planet Debian</title>
	<link>https://planet.debian.org/</link>
	<language>en</language>
	<description>Planet Debian!</description>


<xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
	<title>Matthias Klumpp: Hello old new “Projects” directory!</title>
	<guid>https://blog.tenstral.net/?p=2053</guid>
	<link>https://blog.tenstral.net/2026/04/hello-projects-directory.html</link>
     <description>  &lt;p&gt;If you have recently installed a very up-to-date Linux distribution with a desktop environment, or upgraded your system on a rolling-release distribution, you might have noticed that your home directory has a new folder: “Projects”&lt;/p&gt;



&lt;h2 class="wp-block-heading"&gt;Why?&lt;/h2&gt;



&lt;p&gt;With the recent 0.20 release of &lt;a href="https://www.freedesktop.org/wiki/Software/xdg-user-dirs/"&gt;xdg-user-dirs&lt;/a&gt; we enabled the “Projects” directory by default. Support for this has already existed since 2007, but was never formally enabled. This closes a &lt;a href="https://gitlab.freedesktop.org/xdg/xdg-user-dirs/-/work_items/3"&gt;more than 11 year old bug report&lt;/a&gt; that asked for this feature.&lt;/p&gt;



&lt;p&gt;The purpose of the &lt;em&gt;Projects&lt;/em&gt; directory is to give applications a default location to place project files that do not cleanly belong into one of the existing categories (Documents, Music, Pictures, Videos). Examples of this are software engineering projects, scientific projects, 3D printing projects, CAD design or even things like video editing projects, where project files would end up in the “Projects” directory, with output video being more at home in “Videos”.&lt;/p&gt;



&lt;p&gt;By enabling this by default, and subsequently in the coming months adding support to GLib, Flatpak, desktops and applications that want to make use of it, we hope to give applications that do operate in a “project-centric” manner with mixed media a better default storage location. As of now, those tools either default to the home directory, or will clutter the “Documents” folder, both of which is not ideal. It also gives users a default organization structure, hopefully leading to less clutter overall and better storage layouts.&lt;/p&gt;



&lt;h2 class="wp-block-heading"&gt;This sucks, I don’t like it!&lt;/h2&gt;



&lt;figure class="wp-block-image size-full"&gt;&lt;a href="https://blog.tenstral.net/wp-content/uploads/2026/04/woman-pointing-at-projects-folder.avif"&gt;&lt;img alt="" class="wp-image-2055" height="273" src="https://blog.tenstral.net/wp-content/uploads/2026/04/woman-pointing-at-projects-folder.avif" width="548" /&gt;&lt;/a&gt;&lt;/figure&gt;



&lt;p&gt;As usual, you are in control and can modify your system’s behavior. If you do not like the “Projects” folder, &lt;strong&gt;simply delete it!&lt;/strong&gt; The &lt;em&gt;xdg-user-dirs&lt;/em&gt; utility will not try to create it again, and instead adjust the default location for this directory to your home directory. If you want more control, you can influence exactly what goes where by editing your &lt;code&gt;~/.config/user-dirs.dirs&lt;/code&gt; configuration file.&lt;/p&gt;



&lt;p&gt;If you are a system administrator or distribution vendor and want to set default locations for the default XDG directories, you can edit the &lt;code&gt;/etc/xdg/user-dirs.defaults&lt;/code&gt; file to set global defaults that affect all users on the system (users can still adjust the settings however they like though).&lt;/p&gt;



&lt;h2 class="wp-block-heading"&gt;What else is new?&lt;/h2&gt;



&lt;p&gt;Besides this change, the 0.20 release of &lt;code&gt;xdg-user-dirs&lt;/code&gt; brings full support for the Meson build system (dropping Automake), translation updates, and some robustness improvements to its code. We also fixed the “arbitrary code execution from unsanitized input” bug that the Arch Linux Wiki mentions &lt;a href="https://wiki.archlinux.org/title/XDG_user_directories#Querying_configured_directories"&gt;here&lt;/a&gt; for the &lt;code&gt;xdg-user-dirs&lt;/code&gt; utility, by replacing the shell script with a C binary.&lt;/p&gt;



&lt;p&gt;Thanks to everyone who contributed to this release!&lt;/p&gt; </description> 
	<pubDate>Sat, 18 Apr 2026 08:06:00 +0000</pubDate>

</item> 
<item>
	<title>Yifei Zhan: CommBank hardware MFA token</title>
	<guid>https://segments.zhan.science/posts/physical-netcode-token/</guid>
	<link>https://segments.zhan.science/posts/physical-netcode-token/</link>
     <description>  &lt;p&gt;A while ago, CommBank started asking for MFA confirmation on its mobile app for every NetBank login on a browser. Previously, there was an option to use SMS for MFA, which isn’t as secure as I would like, but it was at least usable. Since I’m switching away from Android to Mobian and won’t be able to use the CommBank app for much longer, I applied for a physical NetCode token.&lt;/p&gt;
&lt;p&gt;The letter that came with it has the wrong link for activation, the correct link is under NetBank -&amp;gt; Settings -&amp;gt; NetCode (under the Security section)&lt;/p&gt;
&lt;p&gt;To apply for a physical token, call the NetBank team, mention you can’t use the app and need a physical NetCode token, and make sure they actually submit your request for a token. It took me 2 calls to get them to ship me a token. The hardware is free of charge but can only be applied for via phone call; unfortunately staff members at my local branch are unable to do anything in relation to NetBank. I was told privately by a CommBank employee that they are deprecating the hardware token in favor of the mobile app, I hope that won’t happen anytime soon, or that they add support for passkeys before they do. The last time I checked, the CommBank app was LineageOS-friendly, but I don’t want to configure WayDroid just to do online banking.&lt;/p&gt;
&lt;p&gt;PayID, the thing that allows you to receive payment via a phone number or email address, is not compatible with the hardware token, and existing PayID will be silently deactivated if you use hardware token. This looks to be an artificial restriction; I don’t see why it has to be this way.&lt;/p&gt;
&lt;p&gt;Regular CommBank mobile app sessions will also be de-activated once the hardware token is activated (I was told so but my sessions weren’t deactivated until I wiped my Android phone), and you won’t be able to sign into mobile app again until you manually disable the NetCode token.&lt;/p&gt;
&lt;p&gt;Online banking has been getting progressively more invasive and anti-user over the last decade, from demanding remote attestation to requiring real time location data, each time locking certain features when those demands are not satisfied; all based on the flawed assumptions that everyone owns a phone running a certain flavor of iOS or Android, and has it ready all the time. I’m not sure what can be done to reverse this trend, but on the personal level I will use NetBank less and go back to cash.&lt;/p&gt; </description> 
	<pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: Home Battery</title>
	<guid>https://etbe.coker.com.au/?p=5991</guid>
	<link>https://etbe.coker.com.au/2026/04/17/home-battery/</link>
     <description>  &lt;h2&gt;Prices&lt;/h2&gt;
&lt;p&gt;On the 19th of March I got a home battery system installed. The government has a rebate scheme so it had a list price of about $22k for a 40kWh setup and cost me about $12k. It seems that 40KWh is the minimum usable size for the amount of electricity I use, I have 84 cores running BOINC when they have nothing better to do which is 585W of TDP according to Intel. While the CPUs are certainly using less than the maximum TDP (both due to design safety limits and the fact that I have disabled hyper-threading on all systems due to it providing minimal benefits and potential security issues) given some power usage by cooling fans and some inefficiency in PSUs I think that assuming that 585W is accounted for 24*7 by CPUs is reasonable. So my home draws between 800W and 1KW when no-one is home and with an electric car and all electric cooking a reasonable amount of electricity can be used.&lt;/p&gt;
&lt;p&gt;My bills prior to the battery installation were around $200/month which was based on charging my car only during sunny times as my electricity provider (Amber Electric) has variable rates based on wholesale prices. Also the feed in rates if my solar panels produce too much electricity in sunny times often go negative so if I don’t use enough electricity. I haven’t had the electric car long enough to find out what the bills might be in winter without a home battery.&lt;/p&gt;
&lt;p&gt;Before getting the battery my daily bills according to the Amber app were usually between $5 and $10. After getting it the daily bills have almost always been below $5. The only day where it’s been over $5 since the battery installation was when electricity was cheap and I fully charged the home battery and my car which used 50KWh in one day and cost $7.87 which is 16 cents per KWh. 16 cents isn’t the cheapest price (sometimes it gets as low as 10 cents) but is fairly cheap, sometimes even in the cheap parts of the day it doesn’t get that low (the cheapest price on the day I started writing this was 20 cents).&lt;/p&gt;
&lt;p&gt;So it looks like this may save me $100 per month, if so there will be a 10% annual return on investment on the $12K I spent. This makes it a good investment, better than repaying a mortgage (which is generally under 6%) and almost as good as the long term results of index tracker funds. However if it cost $22K (the full price without subsidy) then it would still be ok but wouldn’t be a great investment. The government subsidised batteries because the huge amount of power generated by rooftop solar systems was greater than the grid could use during the day in summer and batteries are needed to use that power when it’s dark.&lt;/p&gt;
&lt;h2&gt;Android App&lt;/h2&gt;
&lt;p&gt;The battery system is from Fox ESS and the FoxCloud 2.0 Android app is a bit lacking in functionality. It has a timer for mode setting with options “Self-use” (not clearly explained), “Feed-in Priority” (not explained but testing shows feeding everything in to the grid), “Back Up”, “Forced Charge”, and “Forced Discharge”. Currently I have “Forced Charge” setup for  most sunny 5 hours of the day for a maximum charge power of 5KW. I did that because about 25KW/day is what I need to cover everything and while the system can do almost 10KW that would charge the battery fully in a few hours and then electricity would be exported to the grid which would at best pay me almost nothing and at worst bill me for supplying electricity when they don’t want it. There doesn’t seem to be a “never put locally generated power into the grid unless the battery is full” option. The force charge mode allows stopping at a certain percentage, but when that is reached there is no fallback to another option. It would be nice if the people who designed the configuration could take as a baseline assumption that the macro programming in office suites and functions in spreadsheets are things that regular people are capable of using when designing the configuration options. I don’t think we need a Turing complete programming language in the app to control batteries (although I would use it if there was one), but I think we need clauses like “if battery is X% full then end this section”.&lt;/p&gt;
&lt;p&gt;There is no option to say “force charge until 100%” or “force charge for the next X minutes” as a one-off thing. If I came home in the afternoon with my car below 50% battery and a plan to do a lot of driving the next day then I’d want to force charge it immediately to allow charging the car overnight. But I can’t do that without entering a “schedule”. For Unix people imagine having to do everything via a cron job and no option to run something directly from the command-line.&lt;/p&gt;
&lt;p&gt;It’s a little annoying that they appear to have spent more development time on animations for the app than some of what should be core functionality.&lt;/p&gt;
&lt;h2&gt;Management&lt;/h2&gt;
&lt;p&gt;Amber has an option to allow my battery to be managed by them based on wholesale pries but I haven’t done that as the feed-in prices are very low. So I just charge my battery when electricity is cheap and use it for the rest of the day. There is usually a factor of 2 or more price difference between the middle of the day and night time so that saves money. It also means I don’t have to go out of my way to try and charge my car in the middle of the day. There is some energy lost in charging and discharging the batteries but it’s not a lot. I configured the system to force charge for the 5 sunniest hours every day for 5KW as that’s enough to keep it charged overnight and 5KW is greater than the amount of solar electricity produced on my house since I’ve been monitoring it so that forces it to all be used for the battery. In summer I might have to change that to 6KW for the sunniest 2 or 3 hours and then 4KW or 5KW surrounding that which will be a pain to manage.&lt;/p&gt;
&lt;p&gt;Instead of charging the car every day during sunny times I charge it once or twice a week, I have a 3.3KW charger and the car has a 40KWh battery so usually it takes me less than 10 hours to fully charge it and I get at least 5 hours of good sunlight in the process.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://foxesscommunity.com/viewtopic.php?t=2397"&gt;There are people hacking on these devices which is interesting to get direct control from computers [1]&lt;/a&gt;, and apparently not banned from the official community for doing so. I’m not enthusiastic enough to do this, I’ve got plenty of other free software things to work on. But it’s good that others are doing so.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href="https://foxesscommunity.com/viewtopic.php?t=2397"&gt; https://foxesscommunity.com/viewtopic.php?t=2397&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list"&gt;

&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2014/02/24/car-charging-melbourne/" rel="bookmark" title="Electric Car Charging in Melbourne"&gt;Electric Car Charging in Melbourne&lt;/a&gt; &lt;small&gt;This morning I noticed some parking bays reserved for car...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2007/06/18/backup-for-wind-power/" rel="bookmark" title="Backup for Wind Power"&gt;Backup for Wind Power&lt;/a&gt; &lt;small&gt;A question that people often ask about wind power (and...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2007/03/22/power-saving/" rel="bookmark" title="power saving"&gt;power saving&lt;/a&gt; &lt;small&gt;Adrian von Bidder made an interesting post in response to...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Fri, 17 Apr 2026 12:58:23 +0000</pubDate>

</item> 
<item>
	<title>Sahil Dhiman: What is Life (to you)?</title>
	<guid>https://blog.sahilister.in/2026/04/what-is-life-to-you/</guid>
	<link>https://blog.sahilister.in/2026/04/what-is-life-to-you/</link>
     <description>  &lt;p&gt;It started with a thought: to understand people’s perspectives on life and its meaning. So I texted folks, “What is life (to you)?”. Each of the following list items (-) is a response from a different individual, mostly verbatim.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- A lot&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Everyone has a few universal basic qualities, and some special qualities. To me life is pursuit of exploring world based on those qualities and maturing those qualities as one goes on about exploring world/life with those qualities. &lt;br /&gt;
Discovering and enhancing experiences as one goes through them.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- life is endless suffering&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- my answer might change daily, but this is what I’ve noticed and feel recently.
Life is a spectrum with two distinct ends: what we control and what we don’t. At birth, the spectrum is largely tilted toward control, but throughout our lives, it gradually shifts toward the other side. Ultimately, as we approach death, we lose all control over any aspect of our existence, reaching the other end of the spectrum. &lt;br /&gt;
tho this isn’t universal, privilege plays a huge part in what you control tho i believe it holds true for the majority &lt;br /&gt;
but yeah man, meaning and purpose are dynamic, it’s in their nature to change
i can give you a different answer this evening itself xD&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Funeral Monologue from Synecdoche, New York. &lt;a href="https://www.youtube.com/watch?v=Z9PzSNy3xj0"&gt;https://www.youtube.com/watch?v=Z9PzSNy3xj0&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Zindagi ek nadiya hai,
Aur mujhe tairna nahi aata &lt;br /&gt; (translation - Life is a river,
and I don’t know how to swim)&lt;br /&gt;
On a more serious note, Life is what you make it out for yourself.
The only established truth is that it will end. We can never know if there is something after or if there was something before.
So try to live a life that you feel aspired by?
But this question was beautifully answered by that book which you had about that dying professor &lt;br /&gt;
(Me - He was talking about Tuesday’s with Morrie)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- My answer is 42&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- One, it’s living on your own terms, you define everything for yourself, success, normal, whatever. You get to curate your version of it no matter the societal norms. &lt;br /&gt;
It’s an accumulation of experiences - friends, parents, work, activities, doing shit loads. Sab try karo- travel, zumba, art, music, workout, sports, dil kara ye karna hai karlo. (translation - If your heart wants to do it, just do it.) &lt;br /&gt;
Then I think relationships - all that you’ve nurtured, people forget maintaining people because of work. It takes efforts to keep people in your life, everyone that comes has a place in yours, how well thats stays is upto you. You also get to curate your people, who stays who don’t. Family toh hai hi (translation - family is there) but everyone else that comes along can make it pretty good. &lt;br /&gt;
So I don’t want to be 50 and be like chalo ab kuch apne liye karte hai… (translation - Come on, now let’s do something for ourselves) Do whatever shit you want today. Not everything costs money, and if it does get thrifty &lt;br /&gt;
But do keep healthy while doing all of that&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Being alive so that my daughter can grow up and i can help raising her kids as well.
Raising kids without mother is tough :P&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Definitively, I feel like Life is a by product of proteins and energy working together.
But in a more personal sense, Life is a dumb joke played onto us. It’s a rat race.
But rats exists because of life and then it becomes a chicken-egg problem &lt;br /&gt;
Honestly, I don’t give good answers to life questions. I’m generally the one asking &lt;br /&gt;
Life can be like a box of chocolates, you don’t know what you’re gonna get untill you experience the chocolate(assuming the chocolates are heterogenous and contains a mix of everything) &lt;br /&gt;
Camus once said, “Life is a revolt”, and one of his students added more spice to it like “Life is a revolt against the meaninglessness of existence" &lt;br /&gt;
I kinda feel like Life is the pursuit of every person’s search for meaning&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Imprisonment waiting for execution &#128516; &lt;br /&gt;
I have one more thought while we are on the topic , game with pre defined starting position and predefined destination , path to reach is a maze&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Life to me is to live without regrets and live with freedom. &lt;br /&gt;
Life is always unpredictable and this unpredictability makes it more interesting and worth it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- As of now, for the state of mind that I am in , I think for me life is about subtle struggle, subtle inconveniences and yet moving forward cause that’s all I know. &lt;br /&gt;
I am not sure if any of this has any meaning, but  sometimes I feel I was born of a purpose and that the universe has my back. &lt;br /&gt;
For me it’s about raising my consciousness, understanding people to their depths, gaining moderate material success and helping people to some extend. &lt;br /&gt;
I have tried to seek a grander meaning but I have failed. &lt;br /&gt;
Life for me is what I make out it. &lt;br /&gt;
In my times of great success i rarely think about life for I am busy enjoying it, whatever you may call that state of mind.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- For me its the little things that you enjoy with YOUR people&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Life to me is about living and loving, and doing it in a way that sustains. It’s the people who shape you, the work you get absorbed in, the quiet moments in between. There’s also the wanting, the drive to figure out what’s worth going after and how to get there, but that’s just one part of it, not the point of it. And none of it happens in a vacuum. I’m aware of the privileges that let me live this way, and I try to hold on to that gratitude. In the end, life has both a material and a non-material side, and a lot of what we do is chasing material things in an attempt to satisfy something non-material within us&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Mere liye (translation - for me) life is staying at my home and studying random economics papers. That’s when I enjoy myself the most.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Very complicated &lt;br /&gt;
Some days I wish this life never ended and some time I feel it would be better if it stopped at that moment. &lt;br /&gt;
It all depends on the events that happen in the so called “life”. &lt;br /&gt;
So life to me is a string of events that happen anyway and you get to make some decisions which can turn it in any direction and then you wonder how did that happen.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- not forgetting to breathe, learn, eat, game, take a good shit, love, sleep.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- To be honest it changed with time!
At 19 it was about freedom, wasn’t sure what freedom meant but i wanted that! To be free from everything, maybe because parents still controlled a part of my life.
Then came 22-24 where i was working, trying to figure out what i want, the meaning changed from freedom to living for myself. To earn more, to be greedy about myself and pursue whatever would help me gain more steps in my career. &lt;br /&gt;
Came my mba life, switched my life from doing for myself to trying everything out to have no regrets. Life meaning was just about living with no regrets, invested, gambled, did everything to earn that tag of “yeah, have tried that”.
Now it has all switched to, it was all just a fake facade. Life turned to having a meaningful life rather than finding meaning in what i am doing. Living for people around me, chhoti chhoti cheezo m khushi (translation - happiness in small things(?)) isn’t really a topic of conversation but more of happy thing for me.
So it changed, and m quite happy to be honest. Life did show me a lot of failures, but was privileged enough to face those failures. Gained a lot of learnings if not money&#128514; &lt;br /&gt;
Hopeful for more learnings and change meaning of life with time&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- A task.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- You have different answers at different times
You learn different meanings at different times
When you are studying, basically it is about job, finding a partner
then it becomes, house, car other things based on your income
in between, there can be passion too &lt;br /&gt;
Free Software was a passion, electoral politics too, but both kind of faded and I want cooperative and user driven development now (prav - something that motivates me every day) and these days learning Chinese and watching Cdrama takes a huge part of my leisure time
it is heavily subjective
and also influences by previous experiences
people around you, how much influence they have on you &lt;br /&gt;
it also depends on if they had to struggle in their life or not, for some life did not give much troubles
and trouble itself can be relative
people who never had to struggle may find even smallest challenges as troubles
like if you own a car, your worry is finding a parking slot&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- I am too young to think about lyfe&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- A ticket to see the show on earth, I guess &#128512;  &lt;br /&gt;
I guess life is different depending on the mood. It is a very broad question. &lt;br /&gt;
(Me - What is it in this present mood?) &lt;br /&gt;
Learning stuff (like I am learning a new language) and being happy but also to regulate emotions in a world where being optimistic is getting harder each day. &lt;br /&gt;
Life is also having a unique set of glasses you wear. Both in terms of looking from your eyeballs and your psychological perspective. Both are unique and cannot be replicated. &lt;br /&gt;
It is interesting what people on their deathbed think of life.  If I know I am dying, my perspective would change a whole lot. &lt;br /&gt;
Life is finishing reading books while we are alive &#128521; &lt;br /&gt;
Life is sleeping after a good XMPP chat &#128521;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Dukh dard peeda (translation - surrow pain suffering)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- uhh to word it? life is just like a journey from A to somewhere and its all about what paths you take and what line you get on to me, just a series of short adventures that all connect to a larger sequence until you can’t have any more adventures-&lt;br /&gt;
(Me - eee, THE END. drop dead, like a coin) &lt;br /&gt;
yeaaaah- I am not really for spirituality of an afterlife, to me life just ends at some point, after which point there fails to remain a discernable &lt;em&gt;you&lt;/em&gt;, and some X time after which, you will be last remembered, try to make that last time a good one I guess? &lt;br /&gt;
(Me -  no soul?) &lt;br /&gt;
uhhh not in the way most people think of it i guess? &lt;br /&gt;
theres just a lot of &lt;code&gt;you&lt;/code&gt;s, theres the physical you, there is the idea of you, there is the expectation of you, and one of the undefinable you I would label as the soul maybe? like the part thats not physically you, but also certainly you &lt;br /&gt;
(Me - can’t say I understood part, but I get you in this sense) &lt;br /&gt;
mhm- well its about just questioning who you are more so questioning what life is-, I have sadly spent way too much time trying to figure that out&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Making the best of the time you have&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- living a full range of experiences and embracing the good ones, seeing all that the world has to offer. In the end we were always just stardust. Might as well enjoy it when we are stardust with a consciousness of our own.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- Life is being fucked by everything and you just have to figure out and try to stick to the things worth being fucked for&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note: Following was transcribed from a audio message.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;- There are five conditions to become a life to survive in the environment. I think there’s five conditions by the biological definitions and reproduction is one of the factor virus is not considered a life form because it cannot reproduce on its own but technically it’s kind of a life because it reproduces using the DNA ability this is the biological definition.
Do you want a philosophical definition? &lt;br /&gt;
My definition is kind of the same except that you get life experiences along with it as a human.
Extra benefits is that you are not an NPC. All other organisms are NPCs.
But humans can interpret the world and change it to their liking.
That is life in the case of a human.
But then many humans are mostly NPCs.
But they still can change the life.
Okay, fuck this. Where is this even going? &lt;br /&gt;
A human is an exception in the case of life, because human is not an NPC.
Human can interrupt the world, human can change it to its liking,
which is why we are such a successful organism on this planet.
That is life to me. That’s a human.
But all of this is kind of meaningless, because
the biological impurity of a human being still exists, so you still have the
urges to reproduce, which kind of makes
it like just another organism. But then, humans are yet to evolve
to overcome that biological imperative.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m grateful for all the replies, outlooks, and subsequent conversations I got to have after this question with everyone. After all, it was a deeply personal question. It does fit in nicely with &lt;em&gt;my&lt;/em&gt; definition of life: &lt;br /&gt; &lt;em&gt;“Life is all about experiences and all the transient relationships one gets to have with folks we meet on the way.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS - I would love you hear you on this. Feel free to text or email on sahil AT sahilister.in&lt;/em&gt;&lt;/p&gt; </description> 
	<pubDate>Thu, 16 Apr 2026 17:59:00 +0000</pubDate>

</item> 
<item>
	<title>Paul Tagliamonte: designing arf, an sdr iq encoding format &#128054;</title>
	<guid>https://k3xec.com/arf/</guid>
	<link>https://k3xec.com/arf/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/paultag.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;div class="hz-alert-ok"&gt;
Interested in future updates? Follow me on mastodon at
&lt;a href="https://soylent.green/@paul"&gt;@paul@soylent.green&lt;/a&gt;. Posts about
&lt;code&gt;hz.tools&lt;/code&gt; will be tagged
&lt;a href="https://soylent.green/@paul/tagged/hztools"&gt;#hztools&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&#128054; Want to jump right to the draft? I'll be maintaining ARF going forward at
&lt;a href="https://k3xec.com/draft-tagliamonte-arf-00.txt"&gt;/draft-tagliamonte-arf-00.txt&lt;/a&gt;.
&lt;/div&gt;
&lt;p&gt;It’s true – processing data from software defined radios can be a bit
&lt;a href="http://localhost:1313/packrat-processing-iq/"&gt;complex&lt;/a&gt;
&#128072;&#128527;&#128072; – which tends to keep all but the most grizzled experts and bravest
souls from playing with it. While I wouldn’t describe myself as either, I will
say that I’ve stuck with it for longer than most would have expected of me.
One of the biggest takeaways I have from my adventures with software defined
radio is that there’s a lot of cool crossover opportunity between RF and
nearly every other field of engineering.&lt;/p&gt;
&lt;p&gt;Fairly early on, I decided on a very light metadata scheme to track SDR
captures, called &lt;a href="https://k3xec.com/rfcap/"&gt;rfcap&lt;/a&gt;. rfcap has withstood my test
of time, and I can go back to even my earliest captures and still make sense of
what they are – IQ format, capture frequencies, sample rates, etc. A huge
part of this was the simplicity of the scheme (fixed-lengh header, byte-aligned
to supported capture formats), which made it roughly as easy to work with as a
raw file of IQ samples.&lt;/p&gt;
&lt;p&gt;However, rfcap has a number of downsides. It’s only a single, fixed-length
header. If the frequency of operation changed during the capture, that change
is not represented in the capture information. It’s not possible to easily
represent mulit-channel coherent IQ streams, and additional metadata is
condemned to adjacent text files.&lt;/p&gt;
&lt;h1 id="arf-archive-of-rf"&gt;ARF (Archive of RF)&lt;/h1&gt;
&lt;p&gt;A few years ago, I needed to finally solve some of these shortcomings and tried
to see if a new format would stick. I sat down and wrote out my design goals
before I started figuring out what it looked like.&lt;/p&gt;
&lt;p&gt;First, whatever I come up with must be capable of being streamed and processed
while being streamed. This includes streaming across the network or merely
written to disk as it’s being created. No post-processing required. This is
mostly an artifact of how I’ve built all my tools and how I intereact with my
SDRs. I use them extensively over the network (both locally, as well
as remotely by friends across my &lt;a href="https://tpl.house"&gt;wider&lt;/a&gt;
&lt;a href="https://notes.pault.ag/tpl/"&gt;lan&lt;/a&gt;). This decision sometimes even
prompts me to do some &lt;a href="https://k3xec.com/sparky-rtlsdr/"&gt;crazy things&lt;/a&gt; from time
to time.&lt;/p&gt;
&lt;p&gt;I need actual, real support for multiple IQ channels from my multi-channel SDRs
(Ettus, Kerberos/Kracken SDR, etc) for playing with things like
&lt;a href="https://k3xec.com/simulating-phased-arrays/"&gt;beamforming&lt;/a&gt;.
My new format must be capable of storing
multiple streams in a single capture file, rather than a pile of files in
a directory (and hope they’re aligned).&lt;/p&gt;
&lt;p&gt;Finally, metadata must be capable of being stored in-band. The initial set of
metadata I needed to formalize in-stream were &lt;code&gt;Frequency Changes&lt;/code&gt; and
&lt;code&gt;Discontinuities&lt;/code&gt;. Since then, ARF has grown a few more.&lt;/p&gt;
&lt;p&gt;After getting all that down, I opted to start at what I thought the simplest
container would look like,
&lt;a href="https://en.wikipedia.org/wiki/Type%E2%80%93length%E2%80%93value"&gt;TLV&lt;/a&gt;
(tag-length-value) encoded packets. This is a fairly well trodden path,
and used by a bunch of existing protocols
&lt;a href="https://datatracker.ietf.org/doc/html/rfc4880"&gt;we&lt;/a&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc4253"&gt;all&lt;/a&gt;
&lt;a href="https://en.wikipedia.org/wiki/ASN.1"&gt;know&lt;/a&gt;
and
&lt;a href="https://datatracker.ietf.org/doc/html/rfc6184"&gt;love&lt;/a&gt;.
Each ARF file (or stream) was a set of
encoded “packets” (sometimes called data units in other specs). This means that
unknown packet types may be skipped (since the length is included) and
additional data can be added after the existing fields without breaking
existing decoders.&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-yellow hz-abi-2b" type="u8"&gt;
&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#tag-field"&gt;tag&lt;/a&gt;
&lt;/div&gt;
&lt;div class="hz-abi-yellow hz-abi-2b" type="u8"&gt;
&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#flags"&gt;flags&lt;/a&gt;
&lt;/div&gt;
&lt;div class="hz-abi-yellow hz-abi-4b" type="u16"&gt;
length
&lt;/div&gt;
&lt;div class="hz-abi-yellow hz-abi-Nb" type="[]u8"&gt;
value
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hz-alert-error"&gt;
&lt;b&gt;Heads up!&lt;/b&gt;
Once this is posted, I'm not super likely to update this page. Once this
goes out, the latest stable copy of the ARF spec is maintained at
&lt;a href="https://k3xec.com/draft-tagliamonte-arf-00.txt"&gt;draft-tagliamonte-arf-00.txt&lt;/a&gt;.
This page may quickly become out of date, so if you're actually interested in
implementing this, I've put a lot of effort into making the draft
comprehensive, and I plan to maintain it as I edit the format.
&lt;/div&gt;
&lt;p&gt;Unlike a “traditional” TLV structure, I opted to add “flags” to the top-level
packet. This gives me a bit of wiggle room down the line, and gives me a
feature that I like from ASN.1 – a “critical” bit. The critical bit indicates
that the packet must be understood fully by implementers, which allows future
backward incompatible changes by marking a new packet type as critical. This
would only really be done if something meaningfully changed the interpretation
of the backwards compatible data to follow.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td class="hz-1-6th"&gt;Flag&lt;/td&gt;
&lt;td class="hz-5-6th"&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;0x01&lt;/td&gt;&lt;td&gt;Critical (tag must be understood)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Within each Packet is a &lt;code&gt;tag&lt;/code&gt; field. This tag indicates how the contents of the
&lt;code&gt;value&lt;/code&gt; field should be interpreted.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td class="hz-1-6th"&gt;Tag ID&lt;/td&gt;
&lt;td class="hz-5-6th"&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;0x01&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#header"&gt;Header&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x02&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#stream-header"&gt;Stream Header&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x03&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#samples"&gt;Samples&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x04&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#frequency-change"&gt;Frequency Change&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x05&lt;/td&gt;&lt;td&gt;Timing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x06&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#discontinuity"&gt;Discontinuity&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x07&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#location"&gt;Location&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0xFE&lt;/td&gt;&lt;td&gt;&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#vendor-extension"&gt;Vendor Extension&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is an example packet which should parse without error.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; 00, // tag (0; no subpacket is 0 yet)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; 00, // flags (0; no flags)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; 00, 00 // length (0; no data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; // data would go here, but there is none
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Additionally, throughout the rest of the subpackets, there are a few unique and
shared datatypes. I document them all more clearly in the draft, but to quickly
run through them here too:&lt;/p&gt;
&lt;h3 id="uuid"&gt;UUID&lt;/h3&gt;
&lt;p&gt;This field represents a globally unique idenfifer, as defined by RFC 9562, as
16 raw bytes.&lt;/p&gt;
&lt;h3 id="frequency"&gt;Frequency&lt;/h3&gt;
&lt;p&gt;Data encoded in a Frequency field is stored as microhz (1 Hz is stored as
1000000, 2 Hz is stored as 2000000) as an unsigned 64 bit integer. This has a
minimum value of 0 Hz, and a maximum value of 18446744073709551615 uHz, or just
above 18.4 THz. This is a bit of a tradeoff, but it’s a set of issues that I
would gladly contend with rather than deal with the related issues with storing
frequency data as a floating point value downstream. Not a huge factor, but as
an aside, this is also how my current generation SDR processing code (&lt;code&gt;sparky&lt;/code&gt;)
stores Frequency data internally, which makes conversion between the two
natural.&lt;/p&gt;
&lt;h3 id="iq-samples"&gt;IQ samples&lt;/h3&gt;
&lt;p&gt;ARF supports IQ samples in a number of different formats. Part of the idea here
is I want it to be easy for capturing programs to encode ARF for a specific
radio without mandating a single iq format representation. For IQ types with
a scalar value which takes more than a single byte, this is always paired
with a Byte Order field, to indicate if the IQ scalar values are little or
big endian.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td class="hz-1-6th"&gt;ID&lt;/td&gt;
&lt;td class="hz-1-6th"&gt;Name&lt;/td&gt;
&lt;td class="hz-2-3rd"&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;0x01&lt;/td&gt;&lt;td&gt;f32&lt;/td&gt;&lt;td&gt;interleaved 32 bit floating point scalar values&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x02&lt;/td&gt;&lt;td&gt;i8&lt;/td&gt; &lt;td&gt;interleaved 8 bit signed integer scalar values&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x03&lt;/td&gt;&lt;td&gt;i16&lt;/td&gt;&lt;td&gt;interleaved 16 bit signed integer scalar values&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x04&lt;/td&gt;&lt;td&gt;u8&lt;/td&gt; &lt;td&gt;interleaved 8 bit unsigned integer scalar values&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x05&lt;/td&gt;&lt;td&gt;f64&lt;/td&gt;&lt;td&gt;interleaved 64 bit floating point scalar values&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0x06&lt;/td&gt;&lt;td&gt;f16&lt;/td&gt;&lt;td&gt;interleaved 16 bit floating point scalar values&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="header"&gt;Header&lt;/h2&gt;
&lt;p&gt;Each ARF file must start with a specific Header packet. The header contains
information about the ARF stream writ large to follow. Header packets are
always marked as “critical”.&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
magic
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
flags
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
start
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-4b" type="uuid"&gt;
guid
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-4b" type="uuid"&gt;
site guid
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
#st
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is an example header subpacket (when encoded or decoded this
will be found inside an ARF packet as described above) which should parse
without error, with known values.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, 00, fa, de, dc, ab, 1e, // magic
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, 00, 00, 00, 00, 00, 00, // flags
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;18, 27, a6, c0, b5, 3b, 06, 07, // start time (1740543127)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;// guid (fb47f2f0-957f-4545-94b3-75bc4018dd4b)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;fb, 47, f2, f0, 95, 7f, 45, 45,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;94, b3, 75, bc, 40, 18, dd, 4b,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;// site_id (ba07c5ce-352b-4b20-a8ac-782628e805ca)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;ba, 07, c5, ce, 35, 2b, 4b, 20,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;a8, ac, 78, 26, 28, e8, 05, ca
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="stream-header"&gt;Stream Header&lt;/h2&gt;
&lt;p&gt;Immediately after the arf &lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#header"&gt;Header&lt;/a&gt;, some number of Stream Headers
follow. There must be exactly the same number of Stream Header packets as are
indicated by the &lt;code&gt;num streams&lt;/code&gt; field of the Header. This has the nice effect of
enabling clients to read all the stream headers without requiring buffering of
“unread” packets from the stream.&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
id
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
flags
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
fmt
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
bo
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
rate
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
freq
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="uuid"&gt;
guid
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="uuid"&gt;
site
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is an example stream header subpacket (when encoded or decoded
this will be found inside an ARF packet as described above) which should parse
without error, with known values.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 01, // id (1)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, 00, 00, 00, 00, 00, 00, // flags
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, // format (float32)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, // byte order (Little Endian)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, 01, d1, a9, 4a, 20, 00, // rate (2 MHz)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, 5a, f3, 10, 7a, 40, 00, // frequency (100 MHz)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;// guid (7b98019d-694e-417a-8f18-167e2052be4d)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;7b, 98, 01, 9d, 69, 4e, 41, 7a,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;8f, 18, 16, 7e, 20, 52, be, 4d,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;// site_id (98c98dc7-c3c6-47fe-bc05-05fb37b2e0db)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;98, c9, 8d, c7, c3, c6, 47, fe,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;bc, 05, 05, fb, 37, b2, e0, db,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="samples"&gt;Samples&lt;/h2&gt;
&lt;p&gt;Block of IQ samples in the format indicated by this stream’s &lt;code&gt;format&lt;/code&gt; and
&lt;code&gt;byte_order&lt;/code&gt; field sent in the related &lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#stream-header"&gt;Stream Header&lt;/a&gt;.&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
id
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-Nb" type="[]iq"&gt;
iq samples
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is an samples subpacket (when encoded or decoded
this will be found inside an ARF packet as described above). The IQ values
here are notional (and are either 2 8 bit samples, or 1 16 bit sample,
depending on what the related &lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#stream-header"&gt;Stream Header&lt;/a&gt; was).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, // id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;ab, cd, ab, cd, // iq samples
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="frequency-change"&gt;Frequency Change&lt;/h2&gt;
&lt;p&gt;The center frequency of the IQ stream has changed since the
&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#stream-header"&gt;Stream Header&lt;/a&gt; or last &lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#frequency-change"&gt;Frequency Change&lt;/a&gt;
has been sent. This is useful to capture IQ streams that are jumping
around in frequency during the duration of the capture, rather than
starting and stopping them.&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
id
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-4b" type="u64"&gt;
frequency
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is a frequency change subpacket (when encoded or decoded
this will be found inside an ARF packet as described above).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, // id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, b5, e6, 20, f4, 80, 00 // frequency (200 MHz)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="discontinuity"&gt;Discontinuity&lt;/h2&gt;
&lt;p&gt;Since the last Samples packet for this stream, samples have been dropped
or not encoded to this stream. This can be used for a stream that has
dropped samples for some reason, a large gap (radio was needed for something
else), or communicating “iq snippits”.&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
id
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is a discontinuity subpacket (when encoded or decoded this will
be found inside an ARF packet as described above).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, // id
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="location"&gt;Location&lt;/h2&gt;
&lt;p&gt;Up-to-date location as of this moment of the IQ stream, usually from a GPS.
This allows for in-band geospatial information to be marked in the IQ stream.
This can be used for all sorts of things (detected IQ packet snippits aligned
with a time and location or a survey of rf noise in an area)&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="u64"&gt;
flags
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-1b" type="u8"&gt;
&lt;a href="https://k3xec.com/index.xml?_cache_bust=1705936052#location-geodetic-systems"&gt;sys&lt;/a&gt;
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="f64"&gt;
lat
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="f64"&gt;
long
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="f64"&gt;
el
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="f64"&gt;
accuracy
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;sys&lt;/code&gt; field indicates the Geodetic system to be used for the provided
&lt;code&gt;latitude&lt;/code&gt;, &lt;code&gt;longitude&lt;/code&gt; and &lt;code&gt;elevation&lt;/code&gt; fields. The full list of supported
geodetic systems is currently just WGS84, but in case something meaningfully
changes in the future, it’d be nice to migrate forward.&lt;/p&gt;
&lt;p&gt;Unfortunately, being a bit of a coward here, the accuracy field is a bit of a
cop-out. I’d really rather it be what we see out of kinematic state estimation
tools like a kalman filter, or at minimum, some sort of ellipsoid. This is
neither of those - it’s a perfect sphere of error where we pick the largest
error in any direction and use that. Truthfully, I can’t be bothered to model
this accurately, and I don’t want to contort myself into half-assing something
I know I will half-ass just because I know better.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;td class="hz-1-6th"&gt;System&lt;/td&gt;
&lt;td class="hz-5-6th"&gt;Description&lt;/td&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;0x01&lt;/td&gt;&lt;td&gt;
&lt;a href="https://en.wikipedia.org/wiki/World_Geodetic_System#WGS_84"&gt;WGS84 - World Geodetic System 1984&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is a location subpacket (when encoded or decoded this will be
found inside an ARF packet as described above).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;00, 00, 00, 00, 00, 00, 00, 00, // flags
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, // system (wgs84)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;3f, f3, be, 76, c8, b4, 39, 58, // latitude (1.234)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;40, 02, c2, 8f, 5c, 28, f5, c3, // longitude (2.345)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;40, 59, 00, 00, 00, 00, 00, 00, // elevation (100)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;40, 24, 00, 00, 00, 00, 00, 00 // accuracy (10)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vendor-extension"&gt;Vendor Extension&lt;/h2&gt;
&lt;p&gt;In addition to the fields I put in the spec, I expect that I may need custom
packet types I can’t think of now. There’s all sorts of useful data that could
be encoded into the stream, so I’d rather there be an officially sanctioned
mechanism that allows future work on the spec without constraining myself.&lt;/p&gt;
&lt;p&gt;Just an example, I’ve used a custom subpacket to create test vectors, the data
is encoded into a Vendor Extension, followed by the IQ for the modulated
packet. If the demodulated data and in-band original data don’t match, we’ve
regressed. You could imagine in-band speech-to-text, antenna rotator azimuth
information, or demodulated digital sideband data (like FM HDR data) too. Or
even things I can’t even think of!&lt;/p&gt;
&lt;div class="hz-abi"&gt;
&lt;div class="hz-abi-blue hz-abi-2b" type="uuid"&gt;
id
&lt;/div&gt;
&lt;div class="hz-abi-blue hz-abi-Nb" type="[]u8"&gt;
data
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In order to help with checking the basic parsing and encoding of this format,
the following is a vendor extension subpacket (when encoded or decoded this
will be found inside an ARF packet as described above).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;// extension id (b24305f6-ff73-4b7a-ae99-7a6b37a5d5cd)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;b2, 43, 05, f6, ff, 73, 4b, 7a,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;ae, 99, 7a, 6b, 37, a5, d5, cd,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;// data (0x01, 0x02, 0x03, 0x04, 0x05)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;01, 02, 03, 04, 05
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="tradeoffs"&gt;Tradeoffs&lt;/h1&gt;
&lt;p&gt;The biggest tradeoff that I’m not &lt;em&gt;entirely&lt;/em&gt; happy with is limiting the length
of a packet to &lt;code&gt;u16&lt;/code&gt; – 65535 bytes. Given the u8 sample header, this limits us
to 8191 32 bit sample pairs at a time. I wound up believing that the overhead in
terms of additional packet framing is worth it – because always encoding 4
byte lengths felt like overkill, and a dynamic length scheme ballooned
codepaths in the decoder that I was trying to keep as easy to change as
possible as I worked with the format.&lt;/p&gt; </description> 
	<pubDate>Wed, 15 Apr 2026 15:43:00 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: qlcal 0.1.1 on CRAN: Calendar Updates</title>
	<guid>http://dirk.eddelbuettel.com/blog/2026/04/15#qlcal-r_0.1.1</guid>
	<link>http://dirk.eddelbuettel.com/blog/2026/04/15#qlcal-r_0.1.1</link>
     <description>  &lt;img src="http://planet.debian.org/heads/dirk.png" width="65" height="90" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;The nineteenth release of the &lt;a href="https://dirk.eddelbuettel.com/code/qlcal-r.html"&gt;qlcal&lt;/a&gt; package
arrivied at &lt;a href="https://cran.r-project.org"&gt;CRAN&lt;/a&gt; just now, and
has already been built for &lt;a href="https://eddelbuettel.github.io/r2u/"&gt;r2u&lt;/a&gt;. This version
synchronises with &lt;a href="https://www.quantlib.org"&gt;QuantLib&lt;/a&gt; 1.42
released this week.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dirk.eddelbuettel.com/code/qlcal-r.html"&gt;qlcal&lt;/a&gt;
delivers the calendaring parts of &lt;a href="https://www.quantlib.org"&gt;QuantLib&lt;/a&gt;. It is provided (for the R
package) as a set of included files, so the package is self-contained
and does not depend on an external &lt;a href="https://www.quantlib.org"&gt;QuantLib&lt;/a&gt; library (which can be
demanding to build). &lt;a href="https://dirk.eddelbuettel.com/code/qlcal-r.html"&gt;qlcal&lt;/a&gt; covers
over sixty country / market calendars and can compute holiday lists, its
complement (&lt;em&gt;i.e.&lt;/em&gt; business day lists) and much more. Examples
are in the README at the &lt;a href="https://github.com/qlcal/qlcal-r"&gt;repository&lt;/a&gt;, the &lt;a href="https://dirk.eddelbuettel.com/code/qlcal-r.html"&gt;package page&lt;/a&gt;,
and course at the &lt;a href="https://cran.r-project.org/package=qlcal"&gt;CRAN package
page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This releases updates to the 2025 holidays for China, Singapore, and
Taiwan.&lt;/p&gt;
&lt;p&gt;The full details from &lt;code&gt;NEWS.Rd&lt;/code&gt; follow.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id="changes-in-version-0.1.1-2026-04-15"&gt;Changes in version 0.1.1
(2026-04-15)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Synchronized with QuantLib 1.42 released two days ago&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Calendar updates for China, Singapore, Taiwan&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Courtesy of my &lt;a href="https://dirk.eddelbuettel.com/cranberries/"&gt;CRANberries&lt;/a&gt;, there
is a diffstat report for &lt;a href="https://dirk.eddelbuettel.com/cranberries/2026/04/15/#qlcal_0.1.1"&gt;this
release&lt;/a&gt;. See the &lt;a href="https://dirk.eddelbuettel.com/code/qlcal-r.html"&gt;project page&lt;/a&gt;
and package documentation for more details, and more examples.&lt;/p&gt;
&lt;p style="font-size: 80%; font-style: italic;"&gt;
This post by &lt;a href="https://dirk.eddelbuettel.com"&gt;Dirk
Eddelbuettel&lt;/a&gt; originated on his &lt;a href="https://dirk.eddelbuettel.com/blog/"&gt;Thinking inside the box&lt;/a&gt;
blog. If you like this or other open-source work I do, you can &lt;a href="https://github.com/sponsors/eddelbuettel"&gt;sponsor me at
GitHub&lt;/a&gt;. You can also sponsor my &lt;a href="https://dirk.eddelbuettel.com/blog/2026/04/03#sponsor_tour_de_shore_202"&gt;Tour
de Shore 2026 ride in support of the Maywood Fine Arts Center&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Wed, 15 Apr 2026 13:07:00 +0000</pubDate>

</item> 
<item>
	<title>Emmanuel Kasper: Minix 3 on Beagle Board Black (ARM)</title>
	<guid>http://00formicapunk00.wordpress.com/?p=301</guid>
	<link>https://00formicapunk00.wordpress.com/2026/04/15/minix-3-on-beagle-board-black-arm/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/manu.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;div class="wp-block-jetpack-markdown"&gt;&lt;p&gt;Connected via serial console. Does not have a package manager, web or ssh server, but can play tetris in the terminal (&lt;a href="https://packages.debian.org/de/stable/bsdgames"&gt;bsdgames&lt;/a&gt; in Debian have the same tetris version packaged).&lt;/p&gt;
&lt;/div&gt;



&lt;div class="wp-block-jetpack-markdown"&gt;&lt;p&gt;&lt;a href="https://asciinema.org/a/e4WZGIW42JiJwSiB"&gt;&lt;img alt="asciicast" src="https://asciinema.org/a/e4WZGIW42JiJwSiB.svg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt; </description> 
	<pubDate>Wed, 15 Apr 2026 09:44:50 +0000</pubDate>

</item> 
<item>
	<title>Freexian Collaborators: Debian Contributions: Debusine projects in GSoC, Debian CI updates, Salsa CI maintenance and more! (by Anupa Ann Joseph)</title>
	<guid>https://www.freexian.com/blog/debian-contributions-03-2026/</guid>
	<link>https://www.freexian.com/blog/debian-contributions-03-2026/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/freexian.png" width="215" height="101" alt="" align="right" style="float: right;"&gt;  &lt;h1 id="debian-contributions-2026-03"&gt;Debian Contributions: 2026-03&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://www.freexian.com/about/debian-contributions/"&gt;Contributing to Debian&lt;/a&gt;
is part of &lt;a href="https://www.freexian.com/about/"&gt;Freexian’s mission&lt;/a&gt;. This article
covers the latest achievements of Freexian and their collaborators. All of this
is made possible by organizations subscribing to our
&lt;a href="https://www.freexian.com/lts/"&gt;Long Term Support contracts&lt;/a&gt; and
&lt;a href="https://www.freexian.com/services/"&gt;consulting services&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="debusine-projects-in-googles-summer-of-code"&gt;Debusine projects in Google’s Summer of Code&lt;/h2&gt;
&lt;p&gt;While Freexian initiated Debusine, and is investing a lot of resources in the
project, we manage it as a true free software project that can and should have a
broader community.&lt;/p&gt;
&lt;p&gt;We always had &lt;a href="https://freexian-team.pages.debian.net/debusine/howtos/contribute.html"&gt;documentation for new contributors&lt;/a&gt;
and we aim to be reactive with them when they interact via the issue tracker or
via merge requests. We decided to put those intentions under stress tests by
&lt;a href="https://wiki.debian.org/SummerOfCode2026/Projects#SummerOfCode2026.2FApprovedProjects.2FDebusineDebuginfodServer.Debusine:_debuginfod_server"&gt;proposing five projects&lt;/a&gt;
for Google’s Summer of Code as part of Debian’s participation in that program.&lt;/p&gt;
&lt;p&gt;Given that at least 11 candidates managed to get their merge request accepted in
the last 30 days (interacting with the development team is part of the
pre-requisites to apply to Google Summer of Code projects these days), the
contributing experience must not be too bad. &#128578; If you want to try it out, we
maintain a list of “&lt;a href="https://salsa.debian.org/freexian-team/debusine/-/issues/?sort=created_date&amp;amp;state=opened&amp;amp;label_name%5B%5D=Quick%20fix"&gt;quick fixes&lt;/a&gt;”
that are accessible to newcomers. And as always, we welcome your
&lt;a href="https://freexian-team.pages.debian.net/debusine/reference/development-team-organization.html#coordination-and-communication-tools"&gt;feedback&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id="debian-ci-incus-backend-and-upgrade-to-bootstrap-5-by-antonio-terceiro"&gt;Debian CI: incus backend and upgrade to Bootstrap 5, by Antonio Terceiro&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;debci&lt;/code&gt; 3.14 was released on March 4th, with a followup 3.14.1 release with
regression fixes a few days afterwards. Those releases were followed by new
development and maintenance work that will provide extra capabilities and
stability to the platform.&lt;/p&gt;
&lt;p&gt;This month saw the &lt;a href="https://salsa.debian.org/ci-team/debci/-/merge_requests/305"&gt;initial version of an incus backend&lt;/a&gt;
land in Debian CI. The transition into the new backend will be done carefully so
as to not disrupt ‘testing’ migration. Each package will be running jobs with
both the current lxc backend and with incus. Packages that have the same result
on both backends will be migrated over, and packages that exhibit different
results will be investigated further, resulting in bug reports and/or other
communication with the maintainers.&lt;/p&gt;
&lt;p&gt;On the frontend side, the code has been &lt;a href="https://salsa.debian.org/ci-team/debci/-/merge_requests/314"&gt;ported to Bootstrap 5&lt;/a&gt;
over from the now ancient Bootstrap 3. This need has been
&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1088408"&gt;originally reported back in 2024&lt;/a&gt;
based on the lack of security support for Bootstrap 3. Beyond improving
maintainability, this upgrade also enables support for dark mode in &lt;code&gt;debci&lt;/code&gt;,
which is still work in progress.&lt;/p&gt;
&lt;p&gt;Both updates mentioned in this section will be available in a following &lt;code&gt;debci&lt;/code&gt;
release.&lt;/p&gt;
&lt;h2 id="salsa-ci-maintenance-by-santiago-ruano-rincón-et-al"&gt;Salsa CI maintenance by Santiago Ruano Rincón et al.&lt;/h2&gt;
&lt;p&gt;Santiago reviewed some Salsa CI issues and reviewed associated merge requests.
For example, he investigated a &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/issues/545"&gt;regression (#545)&lt;/a&gt;,
introduced by the &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/merge_requests/569"&gt;move to sbuild&lt;/a&gt;,
on the use of extra repositories configured as “.source” files; and reviewed the
&lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/merge_requests/712/"&gt;MR (!712)&lt;/a&gt;
that fixes it.&lt;/p&gt;
&lt;p&gt;Also, there were conflicts with changes made in &lt;a href="https://tracker.debian.org/news/1725893/accepted-debci-314-source-into-unstable/"&gt;debci 3.14&lt;/a&gt;
and &lt;a href="https://tracker.debian.org/news/1727877/accepted-debci-3141-source-into-unstable/"&gt;debci 3.14.1&lt;/a&gt;
(those updates are mentioned above), and different people have contributed to
fix the subsequent issues, in a long-term way. This includes Raphaël who
proposed &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/merge_requests/707"&gt;MR !707&lt;/a&gt;
and who also suggested Antonio to merge the Salsa CI patches to avoid similar
errors in the future. This happened &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/merge_requests/707"&gt;shortly after&lt;/a&gt;.
Those fixes finally required the unrelated &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/merge_requests/709"&gt;MR !709&lt;/a&gt;,
which will prevent similar problems when building images.&lt;/p&gt;
&lt;p&gt;To identify bugs related to the autopkgtest support in the backport suites as
early as possible, Santiago proposed &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/merge_requests/708"&gt;MR !708&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, Santiago, in collaboration with Emmanuel Arias also had exchanges with
GSoC candidates for the &lt;a href="https://wiki.debian.org/SummerOfCode2026/Projects#SummerOfCode2026.2FApprovedProjects.2FImprovingSalsaCI.Improving_Salsa_CI"&gt;Salsa CI project&lt;/a&gt;,
including the contributions they have made as merge requests. It is important to
note that there are several very good candidates interested in participating.
Thanks a lot to them for their work so far!&lt;/p&gt;
&lt;h2 id="miscellaneous-contributions"&gt;Miscellaneous contributions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Raphaël reported a &lt;a href="https://github.com/zim-desktop-wiki/zim-desktop-wiki/issues/2941"&gt;zim bug&lt;/a&gt;
affecting Debian Unstable users, which was already fixed in git apparently. He
could thus cherry-pick the fix and &lt;a href="https://tracker.debian.org/news/1736712/accepted-zim-0763-3-source-into-unstable/"&gt;update the package&lt;/a&gt;
in Debian Unstable.&lt;/li&gt;
&lt;li&gt;Carles created a new page on the &lt;a href="https://wiki.debian.org/InstallingDebianOn/Framework/Laptop13/AMD_Ryzen_AI_300_Series"&gt;InstallingDebianOn&lt;/a&gt;
in Debian Wiki.&lt;/li&gt;
&lt;li&gt;Carles submitted translation errors in the debian-installer Weblate.&lt;/li&gt;
&lt;li&gt;Carles, using &lt;a href="https://salsa.debian.org/carlespina/po-debconf-manager"&gt;po-debconf-manager&lt;/a&gt;,
improved Catalan translations: reviewed and submitted 3 packages. Also improved
error handling when forking or submitting an MR if the fork already existed.&lt;/li&gt;
&lt;li&gt;Carles kept improving &lt;a href="https://salsa.debian.org/carlespina/check-relations"&gt;check-relations&lt;/a&gt;:
code base related general improvements (added strict typing, enabled pre-commit).
Also added DebPorts support, virtual packages support and added commands for
reporting missing relations and importing bugs from &lt;a href="https://bugs.debian.org"&gt;bugs.debian.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Antonio handled miscellaneous Salsa support requests.&lt;/li&gt;
&lt;li&gt;Antonio improved the management of &lt;a href="https://salsa.debian.org/debconf-team/public/mini/minidc"&gt;MiniDebConf websites&lt;/a&gt;
by keeping all non&lt;a href="https://salsa.debian.org/debconf-team/public/mini/minidc/-/tree/master/sites?ref_type=heads"&gt;-secret settings in git&lt;/a&gt;
and &lt;a href="https://salsa.debian.org/debconf-team/public/websites/wafer-debconf/-/merge_requests/258"&gt;fixed&lt;/a&gt;
exporting these sites as static HTML.&lt;/li&gt;
&lt;li&gt;Stefano uploaded routine updates to &lt;code&gt;hatchling&lt;/code&gt;, &lt;code&gt;python-mitogen&lt;/code&gt;,
&lt;code&gt;python-virtualenv&lt;/code&gt;, &lt;code&gt;python-discovery&lt;/code&gt;, &lt;code&gt;dh-python&lt;/code&gt;, &lt;code&gt;pypy3&lt;/code&gt;, &lt;code&gt;python-pipx&lt;/code&gt;,
and &lt;code&gt;git-filter-repo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Faidon uploaded routine updates to &lt;code&gt;crun&lt;/code&gt;, &lt;code&gt;libmaxminddb&lt;/code&gt;, &lt;code&gt;librdkafka&lt;/code&gt;,
&lt;code&gt;lowdown&lt;/code&gt;, &lt;code&gt;platformdirs&lt;/code&gt;, &lt;code&gt;python-discovery&lt;/code&gt;, &lt;code&gt;sphinx-argparse-cli&lt;/code&gt;, &lt;code&gt;tox&lt;/code&gt;,
&lt;code&gt;tox-uv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stefano and Santiago continued to help with DebConf 26 preparations.&lt;/li&gt;
&lt;li&gt;Stefano reviewed some contributions to debian-reimbursements and handled admin
for reimbursements.debian.net.&lt;/li&gt;
&lt;li&gt;Stefano attended the Debian Technical Committee meeting.&lt;/li&gt;
&lt;li&gt;Helmut sent 8 patches for cross build failures.&lt;/li&gt;
&lt;li&gt;Building on the work of &lt;a href="https://wiki.postmarketos.org/wiki/Systemd"&gt;postmarketOS&lt;/a&gt;,
Helmut managed to cross build systemd for musl in rebootstrap and sent several
patches in the process.&lt;/li&gt;
&lt;li&gt;Helmut reviewed several MRs of Johannes Schauer Marin Rodrigues expanding
support for &lt;code&gt;DPKG_ROOT&lt;/code&gt; to support installing hurd.&lt;/li&gt;
&lt;li&gt;Helmut incorporated a final round of feedback for the Multi-Arch documentation
in Debian policy, which finally made it into &lt;a href="https://tracker.debian.org/news/1737016/accepted-debian-policy-4740-source-into-unstable/"&gt;unstable&lt;/a&gt;
together with documentation of Build-Profiles.&lt;/li&gt;
&lt;li&gt;In order to fix &lt;a href="https://bugs.debian.org/1122076"&gt;python-memray&lt;/a&gt;, Helmut
&lt;a href="https://tracker.debian.org/news/1730846/accepted-libunwind-181-03-source-into-unstable/"&gt;NMUed libunwind&lt;/a&gt;
generally disabling C++ exception support as being an incompatible duplication
of the gcc implementation. Unfortunately, that ended up breaking &lt;a href="https://bugs.debian.org/1131522"&gt;suricata&lt;/a&gt; on &lt;code&gt;riscv64&lt;/code&gt;.
After another &lt;a href="https://tracker.debian.org/news/1739577/accepted-libunwind-181-04-source-into-unstable/"&gt;NMU&lt;/a&gt;,
python-memray finally &lt;a href="https://tracker.debian.org/news/1741625/python-memray-1170dfsg-1-migrated-to-testing/"&gt;migrated&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Thorsten uploaded new upstream versions of &lt;code&gt;epson-inkjet-printer-escpr&lt;/code&gt; and
&lt;code&gt;sane-airscan&lt;/code&gt;. He also fixed a packaging bug in &lt;code&gt;printer-driver-oki&lt;/code&gt;. As of
systemd 260.1-1 the configuration of lpadmin has been added to the sysusers.d
configuration. All printing packages can now simply depend on the
systemd-sysusers package and don’t have to take care of its creation in
maintainer scripts anymore.&lt;/li&gt;
&lt;li&gt;In collaboration with Emmanuel Arias, Santiago had exchanges with GSoC
candidates and reviewed the proposals of the
&lt;a href="https://wiki.debian.org/SummerOfCode2026/Projects#SummerOfCode2026.2FApprovedProjects.2FLinuxLivePatching.Linux_Livepatching"&gt;Linux livepatching GSoC 2026 project&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Colin helped to fix &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-3497"&gt;CVE-2026-3497&lt;/a&gt;
in openssh and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-28356"&gt;CVE-2026-28356&lt;/a&gt;
in multipart.&lt;/li&gt;
&lt;li&gt;Colin upgraded tango and pytango to new upstream releases and packaged
pybind11-stubgen (needed for pytango), thanks to a Freexian customer. Tests of
reproducible builds revealed that pybind11-stubgen didn’t generate imports in a
stable order; this is &lt;a href="https://github.com/pybind/pybind11-stubgen/pull/293"&gt;now fixed upstream&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Lucas fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2025-67733"&gt;CVE-2025-67733&lt;/a&gt;
and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-21863"&gt;CVE-2026-21863&lt;/a&gt;
affecting src:valkey in unstable and testing. Also reviewed the same fixes
targeting stable proposed by Peter Wienemann.&lt;/li&gt;
&lt;li&gt;Faidon worked with upstream and build-dep Debian maintainers on resolving
blockers in order to bring pyHanko into Debian, starting with the adoption of
&lt;code&gt;python-pyhanko-certvalidator&lt;/code&gt;. pyHanko is a suite for signing and stamping PDF
files, and one of the few libraries that can be leveraged to sign PDFs with
eIDAS Qualified Electronic Signatures.&lt;/li&gt;
&lt;li&gt;Anupa co-organized &lt;a href="https://kanpur2026.mini.debconf.org/"&gt;MiniDebConf Kanpur&lt;/a&gt;
and attended the event with many others from all across India. She handled the
accommodation arrangements along with the registration team members, worked on
the budget and expenses. She was also a speaker at the event.&lt;/li&gt;
&lt;li&gt;Lucas helped with content review/schedule for the
&lt;a href="https://campinas.mini.debconf.org/"&gt;MiniDebConf Campinas&lt;/a&gt;. Thanks Freexian for
being a Gold sponsor!&lt;/li&gt;
&lt;li&gt;Lucas organized and took part in a one-day in-person sprint to work on
Ruby 3.4 transition. It was held in a coworking space in Brasilia - Brazil on
April 6th. There were 5 DDs and they fixed multiple packages FTBFSing against
Ruby 3.4 (coming to unstable soon hopefully). Lucas has been postponing a blog
post about this sprint since then :-)&lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Steinar H. Gunderson: Looking for work</title>
	<guid>http://blog.sesse.net/blog/tech/2026-04-14-17-44_looking_for_work.html</guid>
	<link>http://blog.sesse.net/blog/tech/2026-04-14-17-44_looking_for_work.html</link>
     <description>  &lt;img src="http://planet.debian.org/heads/sesse.png" width="74" height="85" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;It seems my own plans and life's plans diverged this spring,
so I am in the market for a new job. So if you're looking for
someone with a long track record making your code go brrr
really fast, give me a ping (contact information at
&lt;a href="https://www.sesse.net"&gt;my homepage&lt;/a&gt;). Working from Oslo
(on-site or remote), CV available upon request. No AI boosterism
or cryptocurrency grifters, please :-)&lt;/p&gt; </description> 
	<pubDate>Tue, 14 Apr 2026 16:00:22 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: anytime 0.3.13 on CRAN: Mostly Minor Bugfix</title>
	<guid>http://dirk.eddelbuettel.com/blog/2026/04/14#anytime_0.3.13</guid>
	<link>http://dirk.eddelbuettel.com/blog/2026/04/14#anytime_0.3.13</link>
     <description>  &lt;img src="http://planet.debian.org/heads/dirk.png" width="65" height="90" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;A maintenance release 0.3.13 of the &lt;a href="https://dirk.eddelbuettel.com/code/anytime.html"&gt;anytime&lt;/a&gt;
package arrived on &lt;a href="https://cran.r-project.org"&gt;CRAN&lt;/a&gt; today,
sticking with the roughly yearly schedule we have now. Binaries for &lt;a href="https://eddelbuettel.github.io/r2u"&gt;r2u&lt;/a&gt; have been built
already. The package is fairly feature-complete, and code and
functionality remain mature and stable.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dirk.eddelbuettel.com/code/anytime.html"&gt;anytime&lt;/a&gt;
is a very focused package aiming to do just one thing &lt;em&gt;really&lt;/em&gt;
well: to convert &lt;em&gt;anything&lt;/em&gt; in integer, numeric, character,
factor, ordered, … input format to either POSIXct (when called as
&lt;code&gt;anytime&lt;/code&gt;) or Date objects (when called as
&lt;code&gt;anydate&lt;/code&gt;) – and to do so &lt;em&gt;without requiring a format
string&lt;/em&gt; as well as &lt;em&gt;accomodating different formats in one input
vector&lt;/em&gt;. See the &lt;a href="https://dirk.eddelbuettel.com/code/anytime.html"&gt;anytime&lt;/a&gt; page,
the &lt;a href="https://github.com/eddelbuettel/anytime"&gt;GitHub repo&lt;/a&gt;
for a few examples, the nice &lt;a href="https://cloud.r-project.org/web/packages/anytime/vignettes/anytime-introduction.pdf"&gt;pdf
vignette&lt;/a&gt;, and the beautiful &lt;a href="https://eddelbuettel.github.io/anytime/"&gt;documentation site&lt;/a&gt;
for all documentation.&lt;/p&gt;
&lt;p&gt;This release was triggered by a bizarre bug seen on elementary os 8.
For “reason” &lt;a href="https://dirk.eddelbuettel.com/code/anytime.html"&gt;anytime&lt;/a&gt; was
taking note on startup where it runs, and used a small and simply piece
of code reading &lt;code&gt;/etc/os-release&lt;/code&gt; when it exists. We assumed
sane content, but this particular operating system and releases managed
to have a duplicate entry throwing us spanner. So now this code is
robust to duplicates, and no longer executed on each startup but “as
needed” which is a net improvement. We also switched the vignette to
being deployed by the new &lt;code&gt;Rcpp::asis()&lt;/code&gt; driver.&lt;/p&gt;
&lt;p&gt;The short list of changes follows.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id="changes-in-anytime-version-0.3.13-2026-04-14"&gt;Changes in anytime
version 0.3.13 (2026-04-14)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Continuous integration has received minor updates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The vignette now use the &lt;code&gt;Rcpp::asis()&lt;/code&gt; driver, and
references have been refreshed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stateful 'where are we running' detection is now more robust, and
has been moved from running on each startup to a cached 'as needed'
case&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Courtesy of my &lt;a href="https://dirk.eddelbuettel.com/cranberries"&gt;CRANberries&lt;/a&gt;, there
is also a diffstat report of &lt;a href="https://dirk.eddelbuettel.com/cranberries/2025/07/14#anytime_0.3.12"&gt;changes
relative to the previous release&lt;/a&gt;. The &lt;a href="https://github.com/eddelbuettel/anytime/issues"&gt;issue tracker&lt;/a&gt;
tracker off the &lt;a href="https://github.com/eddelbuettel/anytime"&gt;GitHub
repo&lt;/a&gt; can be use for questions and comments. More information about
the package is at the &lt;a href="https://dirk.eddelbuettel.com/code/anytime.html"&gt;package page&lt;/a&gt;,
the &lt;a href="https://github.com/eddelbuettel/anytime"&gt;GitHub repo&lt;/a&gt;,
in the &lt;a href="https://cloud.r-project.org/web/packages/anytime/vignettes/anytime-introduction.pdf"&gt;vignette&lt;/a&gt;,
and at the &lt;a href="https://eddelbuettel.github.io/anytime/"&gt;documentation&lt;/a&gt;
site.&lt;/p&gt;
&lt;p style="font-size: 80%; font-style: italic;"&gt;
This post by &lt;a href="https://dirk.eddelbuettel.com"&gt;Dirk
Eddelbuettel&lt;/a&gt; originated on his &lt;a href="https://dirk.eddelbuettel.com/blog"&gt;Thinking inside the box&lt;/a&gt;
blog. If you like this or other open-source work I do, you can now &lt;a href="https://github.com/sponsors/eddelbuettel"&gt;sponsor me at
GitHub&lt;/a&gt;. You can also sponsor my &lt;a href="https://dirk.eddelbuettel.com/blog/2026/04/03#sponsor_tour_de_shore_202"&gt;Tour
de Shore 2026 ride in support of the Maywood Fine Arts Center&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Tue, 14 Apr 2026 15:07:00 +0000</pubDate>

</item> 
<item>
	<title>Petter Reinholdtsen: Talking to the Computer, and Getting Some Nonsense Back...</title>
	<guid>http://www.hungry.com/~pere/blog/Talking_to_the_Computer__and_Getting_Some_Nonsense_Back___.html</guid>
	<link>http://www.hungry.com/~pere/blog/Talking_to_the_Computer__and_Getting_Some_Nonsense_Back___.html</link>
     <description>  &lt;p&gt;At last, I can run my own large language model artificial idiocy
generator at home on a Debian testing host using Debian packages
directly from the Debian archive.  After months of polishing the
&lt;a href="https://tracker.debian.org/llama.cpp"&gt;llama.cpp&lt;/a&gt;,
&lt;a href="https://tracker.debian.org/whisper.cpp"&gt;whisper.cpp&lt;/a&gt; and
&lt;a href="https://tracker.debian.org/ggml"&gt;ggml&lt;/a&gt; packages, and their
dependencies, I was very happy to see today that they all entered
Debian testing this morning.  Several release-critical issues in
dependencies have been blocking the migration for the last few weeks,
and now finally the last one of these has been fixed.  I would like to
extend a big thanks to everyone involved in making this happen.&lt;/p&gt;

&lt;p&gt;I've been running home-build editions of whisper.cpp and llama.cpp
packages for a while now, first building from the upstream Git
repository and later, as the Debian packaging progressed, from the
relevant Salsa Git repositories for the ROCM packages, GGML,
whisper.cpp and llama.cpp.  The only snag with the official Debian
packages is that the JavaScript chat client web pages are slightly
broken in my setup, where I use a reverse proxy to make my home server
visible on the public Internet while the included web pages only want
to communicate with localhost / 127.0.0.1.  I suspect it might be
simple to fix by making the JavaScript code dynamically look up the
URL of the current page and use that to determine where to find the
API service, but until someone fixes
&lt;a href="https://bugs.debian.org/1128381"&gt;BTS report #1128381&lt;/a&gt;, I
just have to edit
&lt;tt&gt;/usr/share/llama.cpp-tools/llama-server/themes/simplechat/simplechat.js&lt;/tt&gt;
every time I upgrade the package.  I start my server like this on my
machine with a nice AMD GPU (donated to me as a Debian developer by
AMD two years ago, thank you very much):&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;pre&gt;  LC_ALL=C llama-server \
    -ngl 256  \
    -c $(( 42 * 1024)) \
    --temp 0.7 \
    --repeat_penalty 1.1 \
    -n -1 \
    -m Qwen3-Coder-30B-A3B-Instruct-Q5_K_S.gguf
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;It only takes a few minutes to load the model for the first time
and prepare a nice API server for me at
&lt;tt&gt;https://my.reverse.proxy.example.com:8080/v1/&lt;/tt&gt;, available
(note, this sets up the server up without authentication; use a
reverse proxy with authentication if you need it) for all the API
clients I care to test.  I switch models regularly to test different
new ones, the Qwen3-Coder one just happen to be the one I use at the
moment.  Perhaps these packages is something for you to have fun with
too?&lt;/p&gt;

&lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
activities, please send Bitcoin donations to my address
&lt;b&gt;&lt;a&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt; </description> 
	<pubDate>Tue, 14 Apr 2026 12:15:00 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: Furilabs FLX1s Finally Working</title>
	<guid>https://etbe.coker.com.au/?p=5976</guid>
	<link>https://etbe.coker.com.au/2026/04/14/furilabs-flx1s-finally-working/</link>
     <description>  &lt;p&gt;I’ve been using the &lt;a href="https://etbe.coker.com.au/2026/01/19/furilabs-flx1s/"&gt;Furilabs FLX1s phone [1]&lt;/a&gt; as my daily driver for 6 weeks, it’s a decent phone, not as good as I hoped but good enough to use every day and rely on for phone calls about job interviews etc. I intend to keep using it as my main phone and as a platform to improve phone software in Debian as you really can’t effectively find bugs unless you use the platform for important tasks.&lt;/p&gt;
&lt;h2&gt;Support Problems&lt;/h2&gt;
&lt;p&gt;I previously wrote about the phone after I received it without a SIM caddy on the 13th of Jan. I had a saga with support about this, on the 16th of Jan one support person said that they would ship it immediately but didn’t provide a tracking number or any indication of when it would arrive. On the 5th of Feb I contacted support again and asked how long it would be, the new support person seemed to have no record of my previous communication but said that they would send it. On the 17th of Feb I made another support request including asking for a way of direct communication as the support email came from an address that wouldn’t accept replies, I was asked for a photo showing where the problem is. The support person also said that they might have to send a replacement phone!&lt;/p&gt;
&lt;p&gt;The last support request I sent included my disappointment at the time taken to resolve the issue and the proposed solution of replacing the entire phone (why have two international shipments of a fragile and expensive phone when a single letter with a cheap SIM caddy would do?). I didn’t receive a reply but the SIM caddy arrived on the 2nd of Mar. Here is a pic of the SIM caddy and the package it came in:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.coker.com.au/blogpics/2026/simpackage-big.jpg"&gt;&lt;img alt="" height="540px" src="https://www.coker.com.au/blogpics/2026/simpackage.jpg" width="400px" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One thing that should be noted is that some of the support people seemed to be very good at their jobs and they were all friendly. It was the system that failed here, turning a minor issue of a missing part into a 6 week saga.&lt;/p&gt;
&lt;p&gt;Furilabs needs to do the following to address this issue:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make it possible to reply directly to a message from a support person. Accept email with a custom subject to sort it, give a URL for a web form, anything. Collating discussions with a customer allows giving better support while taking less time for the support people.&lt;/li&gt;
&lt;li&gt;Have someone monitor every social media address that is used by the company. When someone sends a support request in a public Mastodon post it indicates that something has gone wrong and you want to move quickly to resolve it.&lt;/li&gt;
&lt;li&gt;Take care of the little things, like sending a tracking number for every parcel. If it’s something too small for a parcel (the SIM caddy could have fit in a regular letter) then just tell the customer what date it was posted and where it was posted from so they have some idea of when it will arrive.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is not just a single failure of Furilabs support, it’s a systemic failure of their processes.&lt;/p&gt;
&lt;h2&gt;Problems I Will Fix – Unless Someone Beats Me to it&lt;/h2&gt;
&lt;p&gt;Here are some issues I plan to work on.&lt;/p&gt;
&lt;h3&gt;Smart Watch Support&lt;/h3&gt;
&lt;p&gt;I need to port one of the smart watch programs to Debian. Also I want to make one of them support the &lt;a href="https://etbe.coker.com.au/2025/08/19/colmi-p80-smartwatch/"&gt;Colmi P80 [2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A smart watch significantly increases the utility of a phone even though IMHO they aren’t doing nearly all the things that they could and should do. When we get Debian programs talking to the PineTime it will make a good platform for development of new smart phone and OS features.&lt;/p&gt;
&lt;h3&gt;Nextcloud&lt;/h3&gt;
&lt;p&gt;I have ongoing issues of my text Nextcloud installation on a Debian VM not allowing connection from the Linux desktop app (as packaged in Debian) and from the Android client (from f-droid). The desktop client works with a friend’s Nextcloud installation on Ubuntu so I may try running it on an Ubuntu VM I run while waiting for the Debian issue to get resolved. There was a bug recently fixed in Nextcloud that appears related so maybe the next release will fix it.&lt;/p&gt;
&lt;p&gt;For the moment I’ve been running without these features and I call and SMS people from knowing their number or just returning calls. Phone calls generally aren’t very useful for me nowadays except when applying for jobs. If I could deal with recruiters and hiring managers via video calls then I would consider just not having a phone number.&lt;/p&gt;
&lt;h3&gt;Wifi IPv6&lt;/h3&gt;
&lt;p&gt;Periodically IPv6 support just stops working, I can’t ping the gateway. I turn wifi off and on again and it works. This might be an issue with my wifi network configuration. This might be an issue with the way I have configured my IPv6 networking, although that problem doesn’t happen with any of my laptops.&lt;/p&gt;
&lt;h3&gt;Chatty Sorting&lt;/h3&gt;
&lt;p&gt;Chatty is the program for SMS that is installed by default (part of the phosh/phoc setup), it also does Jabber. Version 0.8.7 is installed which apparently has some Furios modifications and it doesn’t properly support sorting SMS/Jabber conversations. Version 0.8.9 from Debian sorts in the same way as most SMS and Jabber programs with the most recent at the top. But the Debian version doesn’t support Jabber (only SMS and Matrix). When I went back to the Furilabs version of Chatty it still sorted for a while but then suddenly stopped. Killing Chatty (not just closing the window and reopening it) seems to make it sort the conversations sometimes.&lt;/p&gt;
&lt;h2&gt;Problems for Others to Fix&lt;/h2&gt;
&lt;p&gt;Here are the current issues I have starting with the most important.&lt;/p&gt;
&lt;h3&gt;Important&lt;/h3&gt;
&lt;p&gt;The following issues seriously reduce the usability of the device.&lt;/p&gt;
&lt;h4&gt;Hotspot&lt;/h4&gt;
&lt;p&gt;The Wifi hotspot functionality wasn’t working for a few weeks, &lt;a href="https://github.com/FuriLabs/issue-tracker/issues/216"&gt;this Gitlab issue seems to match it [3]&lt;/a&gt;. It started working correctly for a day and I was not sure if an update I applied fixed the bug or if it’s some sort of race condition that worked for this boot and will return next time I reboot it. Later on I rebooted it and found that it’s somewhat random whether it works or now.&lt;/p&gt;
&lt;p&gt;Also while it is mostly working it seemed to stop working about every 25 minutes or so and I had to turn it off and on again to get it going.&lt;/p&gt;
&lt;p&gt;On another day it went to a stage where it got repeated packet loss when I pinged the phone as a hotspot from my laptop. A pattern of 3 ping responses and 3 “Destination Host Unreachable” messages was often repeated.&lt;/p&gt;
&lt;p&gt;I don’t know if this is related to the way Android software is run in a container to access the hardware.&lt;/p&gt;
&lt;h4&gt;4G Reliability&lt;/h4&gt;
&lt;p&gt;Sometimes 4G connectivity has just stopped, sometimes I can stop and restart the 4G data through software to fix it and sometimes I need to use the hardware switch. I haven’t noticed this for a week or two so there is a possibility that one fix addressed both Hotspot and 4G.&lt;/p&gt;
&lt;p&gt;One thing that I will do is setup monitoring to give an alert on the phone if it can’t connect to the Internet. I don’t want it to just quietly stop doing networking stuff and not tell me!&lt;/p&gt;
&lt;h4&gt;On-screen Keyboard&lt;/h4&gt;
&lt;p&gt;The compatibility issues of the GNOME and KDE on-screen keyboards are getting me. I use phosh/phoc as the login environment as I want to stick to defaults at first to not make things any more difficult than they need to be. When I use programs that use QT such as Nheko the keyboard doesn’t always appear when it should and it forgets the setting for “word completion” (which means spelling correction).&lt;/p&gt;
&lt;p&gt;The spelling correction system doesn’t suggest replacing “dont” with “don’t” which is really annoying as a major advantage for spelling checkers on touch screens is inserting an apostrophy. An apostrophy takes at least 3* longer than a regular character and saving that delay makes a difference to typing speed.&lt;/p&gt;
&lt;p&gt;The spelling correction doesn’t correct two words run together.&lt;/p&gt;
&lt;h3&gt;Medium Priority&lt;/h3&gt;
&lt;p&gt;These issues are ongoing annoyances.&lt;/p&gt;
&lt;h4&gt;Delay on Power Button&lt;/h4&gt;
&lt;p&gt;In the best case scenario this phone has a much slower response to pressing the power button than the Android phones I tested (Huawei Mate 10 Pro and Samsung Galaxy Note 9) and a much slower response than my recollection of the vast majority of Android phones I’ve ever used. For testing pressing buttons on the phones simultaneously resulted in the Android phone screens lighting up much sooner. Something like 200ms vs 600ms – I don’t have a good setup to time these things but it’s very obvious when I test.&lt;/p&gt;
&lt;p&gt;In a less common case scenario (the phone having been unused for some time) the response can be something like 5 seconds. The worst case scenario is something in excess of 20 seconds.&lt;/p&gt;
&lt;p&gt;For UI designers, if you get multiple press events from a button that can turn the screen on/off please make your UI leave the screen on and ignore all the stacked events. Having the screen start turning on and off repeatedly when the phone recovers and processes all the button presses isn’t good, especially when each screen flash takes half a second.&lt;/p&gt;
&lt;h4&gt;Notifications&lt;/h4&gt;
&lt;p&gt;Touching on a notification for a program often doesn’t bring it to the foreground. I haven’t yet found a connection between when it does and when it doesn’t.&lt;/p&gt;
&lt;p&gt;Also the lack of icons in the top bar on the screen to indicate notifications is annoying, but that seems to be an issue of design not the implementation.&lt;/p&gt;
&lt;h4&gt;Charge Delay&lt;/h4&gt;
&lt;p&gt;When I connect the phone to a power source there is a delay of about 22 seconds before it starts to charge. Having it miss 22 seconds of charge time is no big deal, having to wait 22 seconds to be sure it’s charging before leaving it is really annoying. Also the phone makes an audible alert when it gets to 0% charge which woke me up one night when I had failed to push the USB-C connector in hard enough. This phone requires a slightly deeper connector than most phones so with some plugs it’s easy to not quite insert them far enough.&lt;/p&gt;
&lt;h4&gt;Torch aka Flash&lt;/h4&gt;
&lt;p&gt;The light for the “torch” or flash for camera is not bright at all. In a quick test staring into the light from 40cm away wasn’t unpleasant compared to my Huawei Mate 10 Pro which has a light bright enough that it hurts to look at it from 4 meters away.&lt;/p&gt;
&lt;p&gt;Because of this photos at night are not viable, not even when photographing something that’s less than a meter away.&lt;/p&gt;
&lt;p&gt;The torch has a brightness setting which doesn’t seem to change the brightness, so it seems likely that this is a software issue and the brightness is set at a low level and the software isn’t changing it.&lt;/p&gt;
&lt;h4&gt;Audio&lt;/h4&gt;
&lt;p&gt;When I connect to my car the Lollypop player starts playing before the phone directs audio to the car, so the music starts coming from the phone for about a second. This is an annoying cosmetic error. Sometimes audio playing pauses for no apparent reason.&lt;/p&gt;
&lt;p&gt;It doesn’t support the phone profile with Bluetooth so phone calls can’t go through the car audio system. Also it doesn’t always connect to my car when I start driving, sometimes I need to disable and enable Bluetooth to make it connect.&lt;/p&gt;
&lt;p&gt;When I initially set the phone up Lollypop would send the track name when playing music through my car (Nissan LEAF) Bluetooth connection, after an update that often doesn’t happen so the car doesn’t display the track name or whether the music is playing but the pause icon works to pause and resume music (sometimes it does work).&lt;/p&gt;
&lt;p&gt;About 30 seconds into a phone call it switches to hands-free mode while the icon to indicate hands-free is not highlighted, so I have to press the hands-free button twice to get it back to normal phone mode.&lt;/p&gt;
&lt;h3&gt;Low Priority&lt;/h3&gt;
&lt;p&gt;I could live with these things remaining as-is but it’s annoying.&lt;/p&gt;
&lt;h4&gt;Ticket Mode&lt;/h4&gt;
&lt;p&gt;There is apparently some code written to display tickets on screen without unlocking. I want to get this working and store screen-caps of the Android barcode screens of the different loyalty cards so I can scan them without unlocking. My threat model does not include someone trying to steal my phone to get a free loaf of bread on the bakery loyalty program.&lt;/p&gt;
&lt;h4&gt;Camera&lt;/h4&gt;
&lt;p&gt;The camera app works with both the back and front cameras, which is nice, and sadly based on my experience with other Debian phones it’s noteworthy. The problem is that it takes a long time to take a photo, something like a second after the button is pressed – long enough for you to think that it just silently took a photo and then move the phone.&lt;/p&gt;
&lt;p&gt;The UI of the furios-camera app is also a little annoying, when viewing photos there is an icon at the bottom left of the screen for a video camera and an icon at the bottom right with a cross. Which every time makes me think “record videos” and “leave this screen” not “return to taking photos” and “delete current photo”. I can get used to the surprising icons, but being so slow is a real problem.&lt;/p&gt;
&lt;h4&gt;GUI App Installation&lt;/h4&gt;
&lt;p&gt;The program for managing software doesn’t work very well. It said that there were two updates for Mesa package needed, but didn’t seem to want to install them. I ran “flatpak update” as root to fix that. The process of selecting software defaults to including non-free, and most of the available apps are for desktop/laptop with no way to search for phone/tablet apps.&lt;/p&gt;
&lt;p&gt;Generally I think it’s best to just avoid this and use apt and flatpak directly from the command-line. Being able to ssh to my phone from a desktop or laptop is good!&lt;/p&gt;
&lt;h4&gt;Android Emulation&lt;/h4&gt;
&lt;p&gt;The file &lt;b&gt;/home/furios/.local/share/andromeda/data/system/uiderrors.txt&lt;/b&gt; is created by the Andromeda system which runs Android apps in a LXC container and appears to grow without end. After using the phone for a month it was 3.5G in size. The disk space usage isn’t directly a problem, out of the 110G storage space only 17G is used and I don’t have a need to put much else on it, even if I wanted to put backups of /home from my laptop on it when travelling that would still leave plenty of free space. But that sort of thing is a problem for backing up the phone and wasting 3.5G out of 110G total is a fairly significant step towards breaking the entire system.&lt;/p&gt;
&lt;p&gt;Also having lots of logging messages from a subsystem that isn’t even being used is a bad sign.&lt;/p&gt;
&lt;p&gt;I just tried using it and it doesn’t start from either the settings menu or from the f-droid icon. Android isn’t that important to me as I want to get away from the proprietary app space so I won’t bother trying this any more.&lt;/p&gt;
&lt;h2&gt;Unfixable Problems&lt;/h2&gt;
&lt;h3&gt;Unlocking&lt;/h3&gt;
&lt;p&gt;After getting used to fingerprint unlocking going back to a password is a pain. I think that the hardware isn’t sufficient for modern quality face recognition that can’t be fooled by a photo and there isn’t fingerprint hardware.&lt;/p&gt;
&lt;p&gt;When I first used an Android phone using a pin to unlock didn’t seem like a big deal, but after getting used to fingerprint unlock it’s a real drag to go without. This is a real annoyance when doing things like checking Wikipedia while watching TV.&lt;/p&gt;
&lt;p&gt;This phone would be significantly improved with a fingerprint sensor or a camera that worked well enough for face unlock.&lt;/p&gt;
&lt;h3&gt;Plasma Mobile&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.reddit.com/r/linux/comments/1o0ylc5/furios_a_linux_phone_that_works/"&gt;According to Reddit Plasma Mobile (KDE for phones) doesn’t support Halium and can never work on this phone because of it [4]&lt;/a&gt;. This is one of a number of potential issues with the phone, running on hardware that was never designed for open OSs is always going to have issues.&lt;/p&gt;
&lt;h3&gt;Wifi MAC Address&lt;/h3&gt;
&lt;p&gt;The MAC keeps changing on reboot so I can’t assign a permanent IPv4 address to the phone. It appears from the MAC prefix of 00:08:22 that the network hardware is made in InPro Comm which is well known for using random addresses in the products it OEMs. They apparently have one allocation of 2^24 addresses and each device randomly chooses a MAC from that range on boot.&lt;/p&gt;
&lt;p&gt;In the settings for a Wifi connection the “Identity” tab has a field named “Cloned Address” which can be set to “Stable for SSID” that prevents it from changing and allows a static IP address allocation from DHCP. It’s not ideal but it works.&lt;/p&gt;
&lt;p&gt;Network Manager can be configured to have a permanent assigned MAC address for all connections or for just some connections. In the past for such things I have copied MAC addresses from ethernet devices that were being discarded and used them for such things. For the moment the “Stable for SSID” setting does what I need but I will consider setting a permanent address at some future time.&lt;/p&gt;
&lt;h3&gt;Docks&lt;/h3&gt;
&lt;p&gt;Having the ability to connect to a dock is really handy. The PinePhonePro and Librem5 support it and on the proprietary side a lot of Samsung devices do it with a special desktop GUI named Dex and some Huawei devices also have a desktop version of the GUI. It’s unfortunate that this phone can’t do it.&lt;/p&gt;
&lt;h2&gt;The Good Things&lt;/h2&gt;
&lt;p&gt;It’s good to be able to ssh in to my phone, even if the on-screen keyboard worked as well as the Android ones it would still be a major pain to use when compared to a real keyboard. The phone doesn’t support connecting to a dock (unlike Samsung phones I’ve used for which I found Dex to be very useful with a 4K monitor and proper keyboard) so ssh is the best way to access it.&lt;/p&gt;
&lt;p&gt;This phone has very reliable connections to my home wifi. I’ve had ssh sessions from my desktop to my phone that have remained open for multiple days. I don’t really need this, I’ve just forgotten to logout and noticed days later that the connection is still running. None of the other phones running Debian could do that.&lt;/p&gt;
&lt;p&gt;Running the same OS on desktop and phone makes things easier to test and debug.&lt;/p&gt;
&lt;p&gt;Having support for all the things that Linux distributions support is good. For example none of the Android music players support all the encodings of audio that comes from YouTube so to play all of my music collection on Android I would need to transcode most of them which means either losing quality, wasting storage space, or both. While Lollypop plays FLAC0, mp3, m4a, mka, webm, ogg, and more.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This is a step towards where I want to go but it’s far from the end goal.&lt;/p&gt;
&lt;p&gt;The PinePhonePro and Librem5 are more open hardware platforms which have some significant benefits. But the battery life issues make them unusable for me.&lt;/p&gt;
&lt;p&gt;Running Mobian on a OnePlus 6 or Droidian on a Note 9 works well for the small tablet features but without VoLTE. While the telcos have blocked phones without VoLTE data devices still work so if recruiters etc would stop requiring phone calls then I could make one of them an option.&lt;/p&gt;
&lt;p&gt;The phone works well enough that it could potentially be used by one of my older relatives. If I could ssh in to my parents phones when they mess things up that would be convenient.&lt;/p&gt;
&lt;p&gt;I’ve run this phone as my daily driver since the 3rd of March and it has worked reasonably well. 6 weeks compared to my previous use of the PinePhonePro for 3 days. This is the first time in 15 years that a non-Android phone has worked for me personally. I have briefly used an iPhone 7 for work which basically did what it needed to do, it was at the bottom of the pile of unused phones at work and I didn’t want to take a newer iPhone that could be used by someone who’s doing more than the occasional SMS or Slack message.&lt;/p&gt;
&lt;p&gt;So this is better than it might have been, not as good as I hoped, but a decent platform to use it while developing for it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href="https://etbe.coker.com.au/2026/01/19/furilabs-flx1s/"&gt; https://etbe.coker.com.au/2026/01/19/furilabs-flx1s/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href="https://etbe.coker.com.au/2025/08/19/colmi-p80-smartwatch/"&gt; https://etbe.coker.com.au/2025/08/19/colmi-p80-smartwatch/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3]&lt;a href="https://github.com/FuriLabs/issue-tracker/issues/216"&gt; https://github.com/FuriLabs/issue-tracker/issues/216&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4]&lt;a href="https://www.reddit.com/r/linux/comments/1o0ylc5/furios_a_linux_phone_that_works/"&gt; https://tinyurl.com/27vkulbr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list"&gt;

&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2026/01/19/furilabs-flx1s/" rel="bookmark" title="Furilabs FLX1s"&gt;Furilabs FLX1s&lt;/a&gt; &lt;small&gt;The Aim I have just got a Furilabs FLX1s [1]...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2010/01/31/my-ideal-mobile-phone/" rel="bookmark" title="My Ideal Mobile Phone"&gt;My Ideal Mobile Phone&lt;/a&gt; &lt;small&gt;Based on my experience testing the IBM Seer software on...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2024/12/15/oneplus-6-debian/" rel="bookmark" title="OnePlus 6 Debian"&gt;OnePlus 6 Debian&lt;/a&gt; &lt;small&gt;I recently got a OnePlus 6 for the purpose of...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Tue, 14 Apr 2026 09:31:17 +0000</pubDate>

</item> 
<item>
	<title>Ravi Dwivedi: Hungary Visa</title>
	<guid>https://ravidwivedi.in/posts/hungary-visa/</guid>
	<link>https://ravidwivedi.in/posts/hungary-visa/</link>
     <description>  &lt;p&gt;The annual &lt;a href="https://conference.libreoffice.org/2025/"&gt;LibreOffice conference 2025&lt;/a&gt; was held in Budapest, Hungary, from the 3rd to the 6th of September 2025. Thanks to the &lt;a href="https://www.documentfoundation.org/"&gt;The Document Foundation&lt;/a&gt; (TDF) for sponsoring me to attend the conference.&lt;/p&gt;
&lt;p&gt;As Hungary is a part of the Schengen area, I needed a Schengen visa to attend the conference. In order to apply for a Schengen visa, one needs to get an appointment at VFS Global and submit all the required documents there, which are then forwarded to the embassy.&lt;/p&gt;
&lt;p&gt;I got an appointment for a Hungary visa at VFS Global in New Delhi for the 24th of July. There were many appointment slots available for the Hungary visa. One could easily get an appointment for the next day at the Delhi center. There were some technical problems on the VFS website, though, as I was unable to upload a scanned copy of my passport while booking the appointment. I got an error saying, “Unfortunately, you have exceeded the maximum upload limit.”&lt;/p&gt;
&lt;p&gt;The problem didn’t get fixed even after contacting the VFS helpline. They asked me to try in the Firefox browser and deleting all the cache, which I already did.&lt;/p&gt;
&lt;p&gt;So I created another account with a different email address and phone number, after which I was able to upload my passport and book an appointment. Other conference attendees from India also reported facing some technical issues on the VFS Hungary website.&lt;/p&gt;
&lt;p&gt;Anyway, I went to the VFS Hungary application center as per my appointment on the 24th of July. Going inside, I located the Hungary visa application counter. There were two applicants ahead of me.&lt;/p&gt;
&lt;p&gt;When it was my turn, the VFS staff warned me that my passport was damaged. The “damage” was on the bio-data page. All the details could be seen, but the lamination of the details page wore off a bit. They asked me to write an application to the Embassy of Hungary in New Delhi stating that I insist VFS to submit my application along with describing the “damage” on my passport.&lt;/p&gt;
&lt;p&gt;I got a bit worried about my application getting rejected due to the “damage.” But I decided to gamble my money on this one, as I didn’t have time (and energy) to apply for a new passport before this trip.&lt;/p&gt;
&lt;p&gt;Moreover, I had struck down a couple of fields in my visa application form which were not applicable to me, due to which the VFS staff asked me to fill out another visa application.&lt;/p&gt;
&lt;p&gt;After this, the application got submitted, and it was 11,000 INR (including the fee to book the appointment at VFS). Here is the list of documents I submitted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My passport&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Photocopy of my passport&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two photographs of myself&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Duly filled visa application form&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Return flight ticket reservations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Payslips for the last three months&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Invitation letter from the conference organizer (in Hungarian)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Proof of hotel bookings during my stay in Hungary&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cover letter stating my itinerary&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Income tax returns filed by me&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bank account statement, signed and sealed by the bank&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Travel insurance valid for the period of the entire trip&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It took 2 hours for me to submit my visa application, even though there were only two applicants before me. This was by far the longest time to submit a Schengen visa application for me.&lt;/p&gt;
&lt;p&gt;Fast-forward to the 30th of July, and I received an email from the Embassy of Hungary asking me to submit an additional document - paid air ticket - for my application. I had only submitted dummy flight tickets, and they were enough for the Schengen visas I applied for until now. This was the first time a country was asking me to submit a confirmed flight ticket during the visa process.&lt;/p&gt;
&lt;p&gt;I consulted my travel agent on this, and they were fairly confident that I will get the visa if the embassy is asking me to submit confirmed flight tickets. So I asked the travel agent to book the flight tickets. These tickets were ₹78,000, and the airline was Emirates. Then, I sent the flight tickets to the embassy by email.&lt;/p&gt;
&lt;p&gt;The embassy sent the visa results on the 6th of August, which I received the next day.&lt;/p&gt;
&lt;p&gt;My visa had been approved! It took 14 days for me to get the Hungary visa after submitting the application.&lt;/p&gt;
&lt;p&gt;See you in the next one!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thanks to &lt;a href="https://badrihippo.thekambattu.rocks/"&gt;Badri&lt;/a&gt; for proofreading.&lt;/strong&gt;&lt;/p&gt; </description> 
	<pubDate>Tue, 14 Apr 2026 05:50:25 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: littler 0.3.23 on CRAN: Mostly Internal Fixes</title>
	<guid>http://dirk.eddelbuettel.com/blog/2026/04/12#littler_0.3.23</guid>
	<link>http://dirk.eddelbuettel.com/blog/2026/04/12#littler_0.3.23</link>
     <description>  &lt;img src="http://planet.debian.org/heads/dirk.png" width="65" height="90" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;&lt;img alt="max-heap image" height="100" src="https://dirk.eddelbuettel.com/images/letter-r.png" style="float: left; margin: 15px 30px 15px 15px;" width="100" /&gt;&lt;/p&gt;
&lt;p&gt;The twentyfourth release of &lt;a href="https://dirk.eddelbuettel.com/code/littler.html"&gt;littler&lt;/a&gt; as a
&lt;a href="https://cran.r-project.org/package=littler"&gt;CRAN package&lt;/a&gt;
landed on CRAN just now, following in the now twenty-one year history
(!!) as a (initially non-CRAN) package started by &lt;a href="https://jeffreyhorner.blogspot.com/"&gt;Jeff&lt;/a&gt; in 2006, and joined
by me a few weeks later.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dirk.eddelbuettel.com/code/littler.html"&gt;littler&lt;/a&gt;
is the first command-line interface for R as it predates
&lt;code&gt;Rscript&lt;/code&gt;. It allows for piping as well for &lt;em&gt;shebang&lt;/em&gt;
scripting via &lt;code&gt;#!&lt;/code&gt;, uses command-line arguments more
consistently and still &lt;a href="https://dirk.eddelbuettel.com/blog/2014/09/02#littler-faster-at-doing-nothing"&gt;starts
faster&lt;/a&gt;. It also always loaded the &lt;code&gt;methods&lt;/code&gt; package which
&lt;code&gt;Rscript&lt;/code&gt; only began to do in later years.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dirk.eddelbuettel.com/code/littler.html"&gt;littler&lt;/a&gt;
lives on Linux and Unix, has its difficulties on macOS due to
some-braindeadedness there (who ever thought case-insensitive
filesystems as a default were a good idea?) and simply does not exist on
Windows (yet – the build system could be extended – see &lt;a href="https://dirk.eddelbuettel.com/code/rinside.html"&gt;RInside&lt;/a&gt; for
an existence proof, and volunteers are welcome!). See the &lt;a href="https://cran.r-project.org/web/packages/littler/vignettes/littler-faq.html"&gt;FAQ
vignette&lt;/a&gt; on how to add it to your &lt;code&gt;PATH&lt;/code&gt;. A few examples
are highlighted at the &lt;a href="https://github.com/eddelbuettel/littler"&gt;Github repo&lt;/a&gt;:, as well
as in the &lt;a href="https://cran.r-project.org/web/packages/littler/vignettes/littler-examples.html"&gt;examples
vignette&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release, which comes just two months after the previous &lt;a href="https://dirk.eddelbuettel.com/blog/2026/02/04#littler_0.3.22"&gt;0.3.22
release&lt;/a&gt; that brought a few new features, is mostly internal. (The
previous release erroneously had 0.3.23 in its blog and social media
posts, it really was 0.3.22 and this one now is is 0.3.23.) Mattias
Ellert address a nag (when building for a distribution) about one
example file with a shebang not have excutable modes. I accommodated the
ever-changing interface the C API of R (within about twelve hours of
being notified). A few other smaller changes were made as well polishing
a script or two or usual, see below for more.&lt;/p&gt;
&lt;p&gt;The full change description follows.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id="changes-in-littler-version-0.3.23-2026-04-12"&gt;Changes in littler
version 0.3.23 (2026-04-12)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Changes in examples scripts&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Correct spelling in &lt;code&gt;installGithub.r&lt;/code&gt; to lower-case
h&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;r2u.r&lt;/code&gt; now recognises ‘resolute’ aka
26.06&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;installRub.r&lt;/code&gt; can install (more easily) from
r-multiverse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A file permission was corrected (Mattias Ellert in &lt;a href="https://github.com/eddelbuettel/littler/pull/131"&gt;#131&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changes in package&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Update script count and examples in README.md&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continuous intgegration scripts received minor updates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The C level access to the R API was updated to reflect most
recent standards (Dirk in &lt;a href="https://github.com/eddelbuettel/littler/pull/132"&gt;#132&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;My &lt;a href="https://dirk.eddelbuettel.com/cranberries/"&gt;CRANberries&lt;/a&gt;
service provides a comparison to &lt;a href="https://dirk.eddelbuettel.com/cranberries/2026/02/04/#littler_0.3.22"&gt;the
previous release&lt;/a&gt;. Full details for the &lt;a href="https://dirk.eddelbuettel.com/code/littler.html"&gt;littler&lt;/a&gt;
release are provided as usual at the &lt;a href="https://github.com/eddelbuettel/littler/blob/master/ChangeLog"&gt;ChangeLog&lt;/a&gt;
page, and also on the &lt;a href="https://eddelbuettel.github.io/littler/"&gt;package docs website&lt;/a&gt;.
The code is available via the &lt;a href="https://github.com/eddelbuettel/littler"&gt;GitHub&lt;/a&gt; repo, from
tarballs and now of course also from &lt;a href="https://cran.r-project.org/package=littler"&gt;its CRAN page&lt;/a&gt; and
via &lt;code&gt;install.packages("littler")&lt;/code&gt;. Binary packages are
available directly in &lt;a href="https://www.debian.org"&gt;Debian&lt;/a&gt; as
well as (in a day or two) &lt;a href="https://cran.r-project.org/bin/linux/ubuntu"&gt;Ubuntu binaries at
CRAN&lt;/a&gt; thanks to the tireless Michael Rutter. Comments and suggestions
are welcome at the &lt;a href="https://github.com/eddelbuettel/littler"&gt;GitHub&lt;/a&gt; repo.&lt;/p&gt;
&lt;p style="font-size: 80%; font-style: italic;"&gt;
This post by &lt;a href="https://dirk.eddelbuettel.com"&gt;Dirk
Eddelbuettel&lt;/a&gt; originated on his &lt;a href="https://dirk.eddelbuettel.com/blog/"&gt;Thinking inside the box&lt;/a&gt;
blog. If you like this or other open-source work I do, you can &lt;a href="https://github.com/sponsors/eddelbuettel"&gt;sponsor me at
GitHub&lt;/a&gt;. You can also sponsor my &lt;a href="https://dirk.eddelbuettel.com/blog/2026/04/03#sponsor_tour_de_shore_2026"&gt;Tour
de Shore 2026 ride in support of the Maywood Fine Arts Center&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Sun, 12 Apr 2026 14:47:00 +0000</pubDate>

</item> 
<item>
	<title>Colin Watson: Free software activity in March 2026</title>
	<guid>tag:www.chiark.greenend.org.uk,2026-04-12:/~cjwatson/blog/activity-2026-03.html</guid>
	<link>https://www.chiark.greenend.org.uk/~cjwatson/blog/activity-2026-03.html</link>
     <description>  &lt;img src="http://planet.debian.org/heads/cjwatson.png" width="70" height="82" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;My Debian contributions this month were all &lt;a href="https://www.freexian.com/about/debian-contributions/"&gt;sponsored&lt;/a&gt; by Freexian.&lt;/p&gt;
&lt;p&gt;You can also support my work directly via &lt;a href="https://liberapay.com/cjwatson"&gt;Liberapay&lt;/a&gt; or &lt;a href="https://github.com/sponsors/cjwatson"&gt;GitHub Sponsors&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;OpenSSH&lt;/h2&gt;
&lt;p&gt;I fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-3497"&gt;&lt;span class="caps"&gt;CVE&lt;/span&gt;-2026-3497&lt;/a&gt; in unstable, thanks to a fix in Ubuntu by Marc Deslauriers.  Relatedly, I applied an Ubuntu patch by Athos Ribeiro to &lt;a href="https://bugs.debian.org/1131206"&gt;not default to weak &lt;span class="caps"&gt;GSS&lt;/span&gt;-&lt;span class="caps"&gt;API&lt;/span&gt; exchange algorithms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’m looking forward to being able to split out &lt;span class="caps"&gt;GSS&lt;/span&gt;-&lt;span class="caps"&gt;API&lt;/span&gt; key exchange support in OpenSSH once Ubuntu 26.04 &lt;span class="caps"&gt;LTS&lt;/span&gt; has been released!  This stuff will still be my problem, but at least it won’t be in packages that &lt;a href="https://qa.debian.org/popcon.php?package=openssh"&gt;nearly everyone has installed&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Python packaging&lt;/h2&gt;
&lt;p&gt;New upstream versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dill&lt;/li&gt;
&lt;li&gt;django-modeltranslation&lt;/li&gt;
&lt;li&gt;isort&lt;/li&gt;
&lt;li&gt;langtable&lt;/li&gt;
&lt;li&gt;pathos&lt;/li&gt;
&lt;li&gt;pendulum&lt;/li&gt;
&lt;li&gt;pox&lt;/li&gt;
&lt;li&gt;ppft&lt;/li&gt;
&lt;li&gt;pydantic-extra-types&lt;/li&gt;
&lt;li&gt;pytango&lt;/li&gt;
&lt;li&gt;python-asyncssh&lt;/li&gt;
&lt;li&gt;python-datamodel-code-generator&lt;/li&gt;
&lt;li&gt;python-evalidate&lt;/li&gt;
&lt;li&gt;python-packaging (including fixes for python-hatch-requirements-txt and python-pyproject-examples)&lt;/li&gt;
&lt;li&gt;python-zxcvbn-rs-py&lt;/li&gt;
&lt;li&gt;rpds-py&lt;/li&gt;
&lt;li&gt;smart-open&lt;/li&gt;
&lt;li&gt;trove-classifiers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I packaged &lt;a href="https://bugs.debian.org/1130121"&gt;pybind11-stubgen&lt;/a&gt;, needed for new upstream versions of pytango.  Tests of reproducible builds revealed that it didn’t generate imports in a stable order; I &lt;a href="https://github.com/pybind/pybind11-stubgen/pull/293"&gt;contributed a fix for that upstream&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I worked with the security team to release &lt;a href="https://lists.debian.org/debian-security-announce/2026/msg00070.html"&gt;&lt;span class="caps"&gt;DSA&lt;/span&gt;-6161-1&lt;/a&gt; in multipart, fixing &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-28356"&gt;&lt;span class="caps"&gt;CVE&lt;/span&gt;-2026-28356&lt;/a&gt; (&lt;a href="https://github.com/defnull/multipart/security/advisories/GHSA-p2m9-wcp5-6qw3"&gt;upstream discussion&lt;/a&gt;).  (Most of the work for this was in February, but the vulnerability was still embargoed when I published my last monthly update.)&lt;/p&gt;
&lt;p&gt;In trixie-backports, I updated pytest-django to 4.12.0.&lt;/p&gt;
&lt;p&gt;I fixed a number of packages to support building with pyo3 0.28:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pendulum&lt;/li&gt;
&lt;li&gt;pydantic-core&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1131586"&gt;python-jellyfish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;python-zxcvbn-rs-py&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1131590"&gt;rpds-py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other build/test failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1130519"&gt;python-bcrypt: Upcoming rust-getrandom update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1131677"&gt;python-cotengrust: &lt;span class="caps"&gt;FTBFS&lt;/span&gt;: error[E0432]: unresolved import &lt;code&gt;rand::rngs::OsRng&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1127499"&gt;austin: &lt;span class="caps"&gt;FTBFS&lt;/span&gt;: E ModuleNotFoundError: No module named ‘pycparser.plyparser’&lt;/a&gt; (&lt;a href="https://github.com/P403n1x87/austin/pull/349"&gt;contributed upstream&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1122488"&gt;taurus: &lt;span class="caps"&gt;FTBFS&lt;/span&gt;: dh_auto_build: error: pybuild —build -i python{version} -p “3.14 3.13” returned exit code 13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1129211"&gt;python-datamodel-code-generator: Depends: python3-isort (&amp;lt; 8) but 8.0.0-1 is to be installed&lt;/a&gt; (&lt;a href="https://github.com/koxudaxi/datamodel-code-generator/pull/3011"&gt;contributed upstream&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Rust packaging&lt;/h2&gt;
&lt;p&gt;New upstream versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rust-rpds&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other bits and pieces&lt;/h2&gt;
&lt;p&gt;I upgraded tango to 10.1.2, and yubihsm-shell to 2.7.2.&lt;/p&gt;
&lt;h2&gt;Code reviews&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bugs.debian.org/1130913"&gt;python-backports.zstd: Obsolete with Python 3.14&lt;/a&gt; (sponsored partial fix from &lt;span class="caps"&gt;YOKOTA&lt;/span&gt; Hiroshi)&lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Sun, 12 Apr 2026 10:13:15 +0000</pubDate>

</item> 
<item>
	<title>Vasudev Kamath: Hardening the Unpacakgeable: A systemd-run Sandbox for Third-Party Binaries</title>
	<guid>tag:copyninja.in,2026-04-12:/blog/safe-run-binary-sandbox.html</guid>
	<link>https://copyninja.in/blog/safe-run-binary-sandbox.html</link>
     <description>  &lt;img src="http://planet.debian.org/heads/vasudev.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;div class="section" id="the-shift-in-software-consumption"&gt;
&lt;h2&gt;The Shift in Software Consumption&lt;/h2&gt;
&lt;p&gt;Historically, I have been a "distribution-first" user. Sticking to tools
packaged within the Debian archives provides a layer of trust; maintainers
validate licenses, audit code, and ensure the entire dependency chain is
verified. However, the rapid pace of development in the Generative AI
space—specifically with new tools like Gemini-CLI—has made this traditional
approach difficult to sustain.&lt;/p&gt;
&lt;p&gt;Many modern CLI tools are built within the &lt;strong&gt;npm&lt;/strong&gt; or &lt;strong&gt;Python&lt;/strong&gt; ecosystems. For
a distribution packager, these are a nightmare; packaging a single tool often
requires packaging a massive, shifting dependency chain. Consequently, I found
myself forced to use third-party binaries, bypassing the safety of the Debian
archive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-supply-chain-risk"&gt;
&lt;h2&gt;The Supply Chain Risk&lt;/h2&gt;
&lt;p&gt;Recent supply chain attacks affecting widely used packages like &lt;tt class="docutils literal"&gt;axios&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;LiteLLM&lt;/tt&gt; have made it clear: running unvetted binaries on a personal system
is a significant risk. These scripts often have full access to your &lt;tt class="docutils literal"&gt;$HOME&lt;/tt&gt;
directory, SSH keys, and the system D-Bus.&lt;/p&gt;
&lt;p&gt;After discussing these concerns with a colleague, I was inspired by his
approach—using a Flatpak-style sandbox for even basic applications like Google
Chrome. I decided to build a generalized version of this using &lt;strong&gt;OpenCode&lt;/strong&gt; and
&lt;strong&gt;Qwen 3.6 Fast&lt;/strong&gt; (which was available for free use at the time) to create a
robust, transient sandbox utility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-solution-safe-run-binary"&gt;
&lt;h2&gt;The Solution: safe-run-binary&lt;/h2&gt;
&lt;p&gt;My script, &lt;a class="reference external" href="https://github.com/copyninja/dotfiles/blob/master/bin/safe-run-binary"&gt;safe-run-binary&lt;/a&gt;,
leverages &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;systemd-run&lt;/span&gt;&lt;/tt&gt; to execute binaries within an isolated scope. It
implements strict filesystem masking and resource control to ensure that even if
a dependency is compromised, the "blast radius" is contained.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="key-technical-features"&gt;
&lt;h2&gt;Key Technical Features&lt;/h2&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;&lt;strong&gt;1. Virtualized Home Directory (tmpfs)&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Instead of exposing my real home directory, the script mounts a &lt;tt class="docutils literal"&gt;tmpfs&lt;/tt&gt;
over &lt;tt class="docutils literal"&gt;$HOME&lt;/tt&gt;. It then selectively creates and bind-mounts only the
necessary subdirectories (like &lt;tt class="docutils literal"&gt;.cache&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;.config&lt;/tt&gt;) into a virtual
structure. This prevents the application from ever "seeing" sensitive files
like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.ssh&lt;/span&gt;&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.gnupg&lt;/span&gt;&lt;/tt&gt;.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;2. D-Bus Isolation via xdg-dbus-proxy&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;For GUI applications, providing raw access to the D-Bus is a security hole.
The script uses &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;xdg-dbus-proxy&lt;/span&gt;&lt;/tt&gt; to sit between the application and the
system bus. By using the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--filter&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--talk=org.freedesktop.portal.*&lt;/span&gt;&lt;/tt&gt;
flags, the app can only communicate with necessary portals (like the file
picker) rather than sniffing the entire bus.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;3. Linux Namespace Restrictions&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first"&gt;The sandbox utilizes several &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; execution properties to harden the
process:&lt;/p&gt;
&lt;ul class="last simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;RestrictNamespaces=yes&lt;/tt&gt;: For CLI tools, this prevents the app from
creating its own nested namespaces.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PrivateTmp=yes&lt;/tt&gt;: Ensures a private &lt;tt class="docutils literal"&gt;/tmp&lt;/tt&gt; space that isn't shared with
the host.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;NoNewPrivileges=yes&lt;/tt&gt;: Prevents the binary from gaining elevated
permissions through SUID/SGID bits.&lt;/li&gt;
&lt;/ul&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;4. GPU and Audio Passthrough&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;The script intelligently detects and binds Wayland, PipeWire, and NVIDIA/DRI
device nodes. This allows browsers like Firefox to run with full hardware
acceleration and audio support while remaining locked out of the rest of the
filesystem.&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class="section" id="usage"&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;To run a CLI tool like Gemini-CLI with access only to a specific directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;safe-run-binary&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;~/.gemini-config&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;npx&lt;span class="w"&gt; &lt;/span&gt;@google/gemini-cli
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For a GUI application like Firefox:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;safe-run-binary&lt;span class="w"&gt; &lt;/span&gt;--gui&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;~/.mozilla&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;~/.cache/mozilla&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;~/Downloads&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;firefox
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;While it is not always possible to escape the need for third-party software, it
is possible to control the environment in which it operates. By leveraging
native Linux primitives like &lt;tt class="docutils literal"&gt;systemd&lt;/tt&gt; and namespaces, high-grade isolation is
achievable.&lt;/p&gt;
&lt;p&gt;PS: &lt;em&gt;If you spot any issues or have suggestions for improving the script, feel free
to raise a PR on the&lt;/em&gt; &lt;a class="reference external" href="https://github.com/copyninja/dotfiles/"&gt;repo&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt; </description> 
	<pubDate>Sun, 12 Apr 2026 07:23:00 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: The Teller of Small Fortunes</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/0-593-81590-4.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/0-593-81590-4.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;The Teller of Small Fortunes&lt;/cite&gt;, by Julie Leong&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;Ace&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;November 2024&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;0-593-81590-4&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Kindle&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;324&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
&lt;cite&gt;The Teller of Small Fortunes&lt;/cite&gt; is a cozy found-family fantasy with a
roughly medieval setting. It was Julie Leong's first novel.
&lt;/p&gt;

&lt;p&gt;
Tao is a traveling teller of small fortunes. In her wagon, pulled by her
friendly mule Laohu, she wanders the small villages of Eshtera and reads
the trivial fortunes of villagers in the tea leaves. An upcoming injury, a
lost ring, a future kiss, a small business deal... she looks around the
large lines of fate and finds the small threads. After a few days, she
moves on, making her solitary way to another village.
&lt;/p&gt;

&lt;p&gt;
Tao is not originally from Eshtera. She is Shinn, which means she
encounters a bit of suspicion and hostility mixed with the fascination of
the exotic. (Language and culture clues lead me to think Shinara is
intended to be this world's not-China, but it's not a direct mapping.) Tao
uses the fascination to help her business; fortune telling is more
believable from someone who seems exotic. The hostility she's learned to
deflect and ignore. In the worst case, there's always another village.
&lt;/p&gt;

&lt;p&gt;
If you've read any cozy found-family novels, you know roughly what happens
next. Tao encounters people on the road and, for various reasons, they
decide to travel together. The first two are a massive mercenary (Mash)
and a semi-reformed thief (Silt), who join Tao somewhat awkwardly after
Tao gives Mash a fortune that is far more significant than she intended.
One town later, they pick up an apprentice baker best known for her
misshapen pastries. They also collect a stray cat, because of course they
do. It's that sort of book.
&lt;/p&gt;

&lt;p&gt;
For me, this sort of novel lives or dies by the characters, so it's good
news that I liked Tao and enjoyed spending time with her. She's quiet,
resilient, competent, and self-contained, with a difficult past and some
mysteries and emotions the others can draw over time. She's also
thoughtful and introspective, which means the tight third-person narration
that almost always stays on Tao offers emotional growth to mull over. I
also liked Kina (the baker) and Mash; they're a bit more obvious and
straightforward, but Kina adds irrepressible energy and Mash is a good
example of the sometimes-gruff soldier with a soft heart. Silt was a bit
more annoying and I never entirely warmed to him, but he's tolerable and
does get a bit of much-needed (if superficial) character development.
&lt;/p&gt;

&lt;p&gt;
It takes some time for the reader to learn about the primary conflict of
the story (Tao does not give up her secrets quickly), so I won't spoil it,
but I thought it worked well. I was momentarily afraid the story would
develop a clear villain, but Leong has some satisfying alternate surprises
in store. The ending was well-done, although it is very happily-ever-after
in a way that may strike some readers as too neat. &lt;cite&gt;The Teller of
Small Fortunes&lt;/cite&gt; aims for a quiet and relaxed mood rather than forcing
character development through difficult choices; it's a fine aim for a
novel, but it won't match everyone's mood.
&lt;/p&gt;

&lt;p&gt;
I liked the world-building, although expect small and somewhat
disconnected details rather than an overarching theory of magic. Tao's
ability gets the most elaboration, for obvious reasons, and I liked how
Leong describes it and explores its consequences. Most of the attention in
the setting is on the friction, wistfulness, and small reminders of coming
from a different culture than everyone around you, but so long ago that
you are not fully a part of either world. This, I thought, was very
well-done and is one of the places where the story is comfortable with
complex feelings and doesn't try to reach a simplifying conclusion.
&lt;/p&gt;

&lt;p&gt;
There is one bit of the story that felt like it was taken directly out of
a &lt;cite&gt;Dungeons &amp;amp; Dragons&lt;/cite&gt; campaign to a degree that felt jarring, but
that was the only odd world-building note.
&lt;/p&gt;

&lt;p&gt;
This book felt like a warm cup of tea intended to comfort and relax,
without large or complex thoughts about the world. It's not intended to be
challenging; there are a few plot twists I didn't anticipate, but nothing
that dramatic, and I doubt anyone will be surprised by the conclusions it
reaches. It's a pleasant time with some nice people and just enough
tension and mystery to add some motivation to find out what happens next.
If that's what you're in the mood for, recommended. If you want a book
that has Things To Say or will put you on the edge of your seat, maybe
save this one for another mood.
&lt;/p&gt;

&lt;p&gt;
All the on-line sources I found for this book call it a standalone, but
&lt;cite&gt;The Keeper of Magical Things&lt;/cite&gt; is set in the same world, so I would
call it a loose series with different protagonists. &lt;cite&gt;The Teller of
Small Fortunes&lt;/cite&gt; is a complete story in one book, though.
&lt;/p&gt;

&lt;p&gt;Rating: 7 out of 10&lt;/p&gt; </description> 
	<pubDate>Sun, 12 Apr 2026 02:53:00 +0000</pubDate>

</item> 
<item>
	<title>Reproducible Builds: Reproducible Builds in March 2026</title>
	<guid>https://reproducible-builds.org/reports/2026-03/</guid>
	<link>https://reproducible-builds.org/reports/2026-03/</link>
     <description>  &lt;p class="lead"&gt;&lt;strong&gt;Welcome to the March 2026 report from the &lt;a href="https://reproducible-builds.org"&gt;Reproducible Builds&lt;/a&gt; project!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reproducible-builds.org/"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/reproducible-builds.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These reports outline what we’ve been up to over the past month, highlighting items of news from elsewhere in the increasingly-important area of software supply-chain security. As ever, if you are interested in contributing to the Reproducible Builds project, please see the &lt;a href="https://reproducible-builds.org/contribute/"&gt;&lt;em&gt;Contribute&lt;/em&gt;&lt;/a&gt; page on our website.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#linux-kernel-hash-based-integrity-checking-proposed"&gt;Linux kernel hash-based integrity checking proposed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#distribution-work"&gt;Distribution work&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#tool-development"&gt;Tool development&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#upstream-patches"&gt;Upstream patches&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#documentation-updates"&gt;Documentation updates&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#two-new-academic-papers"&gt;Two new academic papers&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="https://reproducible-builds.org/blog/index.rss#misc-news"&gt;Misc news&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h3 id="linux-kernel-hash-based-integrity-checking-proposed"&gt;Linux kernel hash-based integrity checking proposed&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lore.kernel.org/lkml/20260113-module-hashes-v4-0-0b932db9b56b@weissschuh.net/"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/tux.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eric Biggers posted to the &lt;a href="https://lkml.org/"&gt;Linux Kernel Mailing List&lt;/a&gt; in response to a &lt;a href="https://lore.kernel.org/lkml/20260113-module-hashes-v4-0-0b932db9b56b@weissschuh.net/"&gt;patch series posted by Thomas Weißschuh&lt;/a&gt; to introduce a calculated hash-based system of integrity checking to complement the existing &lt;em&gt;signature&lt;/em&gt;-based approach. Thomas’ &lt;a href="https://lore.kernel.org/lkml/20260113-module-hashes-v4-0-0b932db9b56b@weissschuh.net/"&gt;original post&lt;/a&gt; mentions:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The current signature-based module integrity checking has some drawbacks in combination with reproducible builds. Either the module signing key is generated at build time, which makes the build unreproducible, or a static signing key is used, which precludes rebuilds by third parties and makes the whole build and packaging process much more complicated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However, &lt;a href="https://lore.kernel.org/lkml/20260311011218.GA212983@quark/"&gt;Eric’s followup message&lt;/a&gt; goes further:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I think this actually undersells the feature. It’s also much simpler than the signature-based module authentication. The latter relies on PKCS#7, X.509, ASN.1, OID registry, &lt;code class="language-plaintext highlighter-rouge"&gt;crypto_sig&lt;/code&gt; API, etc in addition to the implementations of the actual signature algorithm (RSA / ECDSA / ML-DSA) and at least one hash algorithm.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="distribution-work"&gt;Distribution work&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://debian.org/"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/debian.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Debian this month,&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Lucas Nussbaum &lt;a href="https://lists.debian.org/debian-devel-announce/2026/03/msg00004.html"&gt;announced &lt;em&gt;Debaudit&lt;/em&gt;&lt;/a&gt;, a “new service to verify the reproducibility of Debian source packages”:&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;&lt;em&gt;debaudit&lt;/em&gt; complements the work of the Reproducible Builds project. While &lt;a href="https://reproduce.debian.net/"&gt;reproduce.debian.net&lt;/a&gt; focuses on ensuring that binary packages can be bit-for-bit reproduced from their source packages, &lt;em&gt;debaudit&lt;/em&gt; focuses on the preceding step: ensuring that the source package itself is a faithful and reproducible representation of its upstream source or &lt;code class="language-plaintext highlighter-rouge"&gt;Vcs-Git&lt;/code&gt; repository.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;kpcyrd&lt;/em&gt; &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1130772"&gt;filed a bug against the &lt;code class="language-plaintext highlighter-rouge"&gt;librust-const-random-dev&lt;/code&gt; package&lt;/a&gt; reporting that the &lt;code class="language-plaintext highlighter-rouge"&gt;compile-time-rng&lt;/code&gt; feature of the &lt;code class="language-plaintext highlighter-rouge"&gt;ahash&lt;/code&gt; crate uses the &lt;code class="language-plaintext highlighter-rouge"&gt;const-random&lt;/code&gt; crate in turn, which uses a macro to read/generate a random number generator during the build. This issue was also &lt;a href="https://github.com/jonhoo/flurry/issues/135"&gt;filed upstream&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;60 reviews of Debian packages were added, 4 were updated and 16 were removed this month adding to &lt;a href="https://tests.reproducible-builds.org/debian/index_issues.html"&gt;our knowledge about identified issues&lt;/a&gt;. One new issue types was added, &lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-notes/commit/e1457606"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;pkgjs_lock_json_file_issue&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.opensuse.org/"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/opensuse.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, Bernhard M. Wiedemann posted another &lt;a href="https://www.opensuse.org/"&gt;&lt;strong&gt;openSUSE&lt;/strong&gt;&lt;/a&gt; &lt;a href="https://lists.opensuse.org/archives/list/factory@lists.opensuse.org/thread/Y4UFWITC7EWEMPU2LCE7BIMNXUQW5CNI/"&gt;monthly update&lt;/a&gt; for their work there.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="tool-development"&gt;Tool development&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://diffoscope.org/"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/diffoscope.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://diffoscope.org"&gt;&lt;strong&gt;diffoscope&lt;/strong&gt;&lt;/a&gt; is our in-depth and content-aware diff utility that can locate and diagnose reproducibility issues. This month, Chris Lamb made a number of changes, including preparing and uploading versions, &lt;a href="https://tracker.debian.org/news/1729381/accepted-diffoscope-314-source-into-unstable/"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;314&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://tracker.debian.org/news/1732739/accepted-diffoscope-315-source-into-unstable/"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;315&lt;/code&gt;&lt;/a&gt; to Debian.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Chris Lamb:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Don’t run &lt;code class="language-plaintext highlighter-rouge"&gt;test_code_is_black_clean&lt;/code&gt; test in the autopkgtests. (&lt;a href="https://bugs.debian.org/1130402"&gt;#1130402&lt;/a&gt;). [&lt;a href="https://salsa.debian.org/reproducible-builds/diffoscope/commit/fbdc9b0d"&gt;…&lt;/a&gt;]&lt;/li&gt;
      &lt;li&gt;Add some debugging info for PyPI debugging. [&lt;a href="https://salsa.debian.org/reproducible-builds/diffoscope/commit/e881f4fa"&gt;…&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Jelle van der Waa:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Fix compatibility with &lt;a href="https://llvm.org/"&gt;LLVM&lt;/a&gt; version 22. [&lt;a href="https://salsa.debian.org/reproducible-builds/diffoscope/commit/6ea43da2"&gt;…&lt;/a&gt;]&lt;/li&gt;
      &lt;li&gt;Adjust the PGP file detection regular expression. [&lt;a href="https://salsa.debian.org/reproducible-builds/diffoscope/commit/1bb658f7"&gt;…&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Michael R. Crusoe:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Reformat the source code using &lt;a href="https://github.com/psf/black"&gt;Black&lt;/a&gt; version 26.1.0 [&lt;a href="https://salsa.debian.org/reproducible-builds/diffoscope/commit/3906fd77"&gt;…&lt;/a&gt;][&lt;a href="https://salsa.debian.org/reproducible-builds/diffoscope/commit/9adf36d5"&gt;…&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, Vagrant Cascadian &lt;a href="https://codeberg.org/guix/guix/commit/61849b667726dd30d623b517380f5b12655b115a"&gt;updated &lt;em&gt;diffoscope&lt;/em&gt; in GNU Guix to version &lt;code class="language-plaintext highlighter-rouge"&gt;315&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://reproduce.debian.net"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/reproduce.debian.net.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kpcyrd/rebuilderd"&gt;&lt;strong&gt;rebuilderd&lt;/strong&gt;&lt;/a&gt;, our server designed monitor the official package repositories of Linux distributions and attempt to reproduce the observed results there; it powers, amongst other things, &lt;a href="https://reproduce.debian.net/"&gt;&lt;em&gt;reproduce.debian.net&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A new version, &lt;a href="https://github.com/kpcyrd/rebuilderd/releases/tag/v0.26.0"&gt;0.26.0&lt;/a&gt;, was released this month, with the following improvements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Much smoother onboarding/installation.&lt;/li&gt;
  &lt;li&gt;Complete database redesign with many improvements.&lt;/li&gt;
  &lt;li&gt;New REST HTTP API.&lt;/li&gt;
  &lt;li&gt;It’s now possible to artificially delay the first reproduce attempt. This gives archive infrastructure more time to catch up.&lt;/li&gt;
  &lt;li&gt;And &lt;a href="https://github.com/kpcyrd/rebuilderd/releases/tag/v0.26.0"&gt;many, many other changes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="upstream-patches"&gt;Upstream patches&lt;/h3&gt;

&lt;p&gt;The Reproducible Builds project detects, dissects and attempts to fix as many currently-unreproducible packages as possible. We endeavour to send all of our patches upstream where appropriate. This month, we wrote a large number of such patches, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Bernhard M. Wiedemann:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://github.com/wilsonzlin/minify-html/pull/275"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;minify&lt;/code&gt;&lt;/a&gt; (rust random HashMap) / (&lt;a href="https://github.com/wilsonzlin/minify-html/pull/276"&gt;alternative&lt;/a&gt; by &lt;em&gt;kpcyrd&lt;/em&gt;)&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://github.com/openSUSE/rpm-config-SUSE/pull/95"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;rpm-config-SUSE&lt;/code&gt;&lt;/a&gt; (toolchain)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Chris Lamb:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1129544"&gt;#1129544&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/python-nxtomomill"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;python-nxtomomill&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1130622"&gt;#1130622&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/dh-fortran"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;dh-fortran&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1130623"&gt;#1130623&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/python-discovery"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;python-discovery&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1130666"&gt;#1130666&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/kanboard"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;kanboard&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1131168"&gt;#1131168&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/moltemplate"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;moltemplate&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1131384"&gt;#1131384&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/stacer"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;stacer&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1131385"&gt;#1131385&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/libcupsfilters"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;libcupsfilters&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1131395"&gt;#1131395&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/django-ninja"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;django-ninja&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1131403"&gt;#1131403&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/python-agate"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;python-agate&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1132074"&gt;#1132074&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/aetos"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;aetos&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;&lt;a href="https://bugs.debian.org/1132508"&gt;#1132508&lt;/a&gt; filed against &lt;a href="https://tracker.debian.org/pkg/python-bayespy"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;python-bayespy&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;kpcyrd&lt;/em&gt;:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://github.com/rust-lang/cargo/pull/16691"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;cargo&lt;/code&gt;&lt;/a&gt; (HashMap random order issue; &lt;a href="https://github.com/rust-lang/cargo/issues/16693"&gt;more info&lt;/a&gt;)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="documentation-updates"&gt;Documentation updates&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://reproducible-builds.org/"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/website.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once again, there were a number of improvements made to our website this month including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;kpcyrd&lt;/em&gt;:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Add a new page about &lt;a href="https://reproducible-builds.org/docs/rust/"&gt;&lt;em&gt;Rust&lt;/em&gt;&lt;/a&gt; specifics. [&lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-website/commit/3ed014bd"&gt;…&lt;/a&gt;][&lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-website/commit/4bf02f0d"&gt;…&lt;/a&gt;][&lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-website/commit/46c9f1e3"&gt;…&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Robin Candau:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Add link to the &lt;code class="language-plaintext highlighter-rouge"&gt;diffoci&lt;/code&gt; Arch Linux package on the &lt;a href="https://reproducible-builds.org/tools/"&gt;&lt;em&gt;Tools&lt;/em&gt;&lt;/a&gt; page. [&lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-website/commit/0ca6c946"&gt;…&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Timo Pohl:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Add new &lt;em&gt;From Constrictor to Serpent: Investigating the Threat of Cache Poisoning in the Python Ecosystem&lt;/em&gt; paper to the &lt;a href="https://reproducible-builds.org/docs/publications/"&gt;&lt;em&gt;Academic publications&lt;/em&gt;&lt;/a&gt; page. [&lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-website/commit/8577c2d5"&gt;…&lt;/a&gt;]&lt;/li&gt;
      &lt;li&gt;Add GitLab registration confirmation to &lt;a href="https://reproducible-builds.org/contribute/salsa/"&gt;&lt;em&gt;How to join the Salsa group&lt;/em&gt;&lt;/a&gt; page. [&lt;a href="https://salsa.debian.org/reproducible-builds/reproducible-website/commit/b4f72f5a"&gt;…&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="two-new-academic-papers"&gt;Two new academic papers&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://dl.gi.de/items/07a895be-d49c-4d73-b14d-cb533e850ca2"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/epub.gi.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Marc Ohm, Timo Pohl, Ben Swierzy and Michael Meier published a paper on the &lt;a href="https://dl.gi.de/items/07a895be-d49c-4d73-b14d-cb533e850ca2"&gt;&lt;em&gt;threat of cache poisoning in the Python ecosystem&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Attacks on software supply chains are on the rise, and attackers are becoming increasingly creative in how they inject malicious code into software components.
This paper is the first to investigate Python cache poisoning, which manipulates bytecode cache files to execute malicious code without altering the human-readable source code.
We demonstrate a proof of concept, showing that an attacker can inject malicious bytecode into a cache file without failing the Python interpreter’s integrity checks.
In a large-scale analysis of the Python Package Index, we find that about 12,500 packages are distributed with cache files.
Through manual investigation of cache files that cannot be reproduced automatically from the corresponding source files, we identify classes of reasons for irreproducibility to locate malicious cache files.
While we did not identify any malware leveraging this attack vector, we demonstrate that several widespread package managers are vulnerable to such attacks.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://dl.gi.de/items/07a895be-d49c-4d73-b14d-cb533e850ca2"&gt;PDF&lt;/a&gt; of the paper is available online.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://epub.jku.at/obvulihs/content/titleinfo/13440717"&gt;&lt;img alt="" src="https://reproducible-builds.org/images/reports/2026-03/epub.jku.png#right" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mario Lins of the University of Linz, Austria, has published their PhD doctoral thesis on the topic of &lt;a href="https://epub.jku.at/obvulihs/content/titleinfo/13440717"&gt;&lt;em&gt;Software supply chain transparency&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;We begin by examining threats to the software distribution stage — the point at which artifacts (e.g., mobile apps) are delivered to end users — with an emphasis on mobile ecosystems [and] we next focus on the operating system on mobile devices, with an emphasis on mitigating bootloader-targeted attacks. We demonstrate how to compensate lost security guarantees on devices with an unlocked bootloader. This allows users to flash custom operating systems on devices that no longer receive security updates from the original manufacturer without compromising security. We then move to the source code stage. [Also,] we introduce a new architecture to ensure strong source-to-binary correspondence by leveraging the security guarantees of Confidential Computing technology. Finally, we present The Supply Chain Game, an organizational security approach that enhances standard risk-management methods. We demonstrate how game-theoretic techniques, combined with common risk management practices, can derive new criteria to better support decision makers.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://epub.jku.at/obvulihs/download/pdf/13440717"&gt;PDF&lt;/a&gt; of the paper is available online.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id="misc-news"&gt;Misc news&lt;/h3&gt;

&lt;p&gt;On &lt;a href="https://lists.reproducible-builds.org/listinfo/rb-general/"&gt;our mailing list&lt;/a&gt; this month:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Holger Levsen &lt;a href="https://lists.reproducible-builds.org/pipermail/rb-general/2026-March/004060.html"&gt;announced that this year’s Reproducible Builds summit&lt;/a&gt; will almost certainly be held in Gothenburg, Sweden, from September 22 until 24, followed by two days of hacking. However, these dates are preliminary and not 100% final — an official announcement is forthcoming.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mark Wielaard posted to our list &lt;a href="https://lists.reproducible-builds.org/pipermail/rb-general/2026-March/004062.html"&gt;asking a question&lt;/a&gt; on the difference between &lt;a href="https://sourceware.org/debugedit"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;debugedit&lt;/code&gt;&lt;/a&gt; and relative debug paths based on a comment on the &lt;a href="https://reproducible-builds.org/docs/build-path/"&gt;&lt;em&gt;Build path&lt;/em&gt;&lt;/a&gt; page: “Have people tried more modern versions of &lt;code class="language-plaintext highlighter-rouge"&gt;debugedit&lt;/code&gt; to get deterministic (absolute) DWARF paths and found issues with it?&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Finally, if you are interested in contributing to the Reproducible Builds project, please visit our &lt;a href="https://reproducible-builds.org/contribute/"&gt;&lt;em&gt;Contribute&lt;/em&gt;&lt;/a&gt; page on our website. However, you can get in touch with us via:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;IRC: &lt;code class="language-plaintext highlighter-rouge"&gt;#reproducible-builds&lt;/code&gt; on &lt;code class="language-plaintext highlighter-rouge"&gt;irc.oftc.net&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mastodon: &lt;a href="https://fosstodon.org/@reproducible_builds"&gt;@reproducible_builds@fosstodon.org&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mailing list: &lt;a href="https://lists.reproducible-builds.org/listinfo/rb-general"&gt;&lt;code class="language-plaintext highlighter-rouge"&gt;rb-general@lists.reproducible-builds.org&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Fri, 10 Apr 2026 16:13:12 +0000</pubDate>

</item> 
<item>
	<title>Jamie McClelland: AI Hacking the Planet</title>
	<guid>https://current.workingdirectory.net/posts/2026/ai-hacking-the-planet/</guid>
	<link>https://current.workingdirectory.net/posts/2026/ai-hacking-the-planet/</link>
     <description>  &lt;p&gt;A colleague asked me if we should move all our money to our pillow cases after
reading the latest AI editorial from &lt;a href="https://www.nytimes.com/2026/04/07/opinion/anthropic-ai-claude-mythos.html"&gt;Thomas
Friedman&lt;/a&gt;.
The article reads like a press release from Anthropic, repeating the claim that
their latest AI model is so good at finding software vulnerabilities that it is
a danger to the world.&lt;/p&gt;
&lt;p&gt;I think I now know what it’s like to be a doctor who is forced to watch Gray’s
Anatomy.&lt;/p&gt;
&lt;p&gt;By now every journalist should be able to recognize the AI publicity playbook:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Start with a wildly unsubstantiated claim about how dangerous your
product is:&lt;/p&gt;
&lt;p&gt;&lt;del&gt;&lt;em&gt;AI will cause human extinction before we have a chance to colonize mars&lt;/em&gt;&lt;/del&gt;
(remember that one? Even Kim Stanley Robinson, author of perhaps the most
compelling science fiction on colonizing mars &lt;a href="https://www.newscientist.com/article/2520312-author-of-red-mars-calls-bullshit-on-emigrating-to-the-planet/"&gt;calls bull
shit&lt;/a&gt;
on it).&lt;/p&gt;
&lt;p&gt;&lt;del&gt;&lt;em&gt;AI will eliminate all of our jobs&lt;/em&gt;&lt;/del&gt; (this one was extremely effective at
providing cover for software companies laying off staff but it has quickly
dawned on people that the companies that did this are living in chaos not
humming along happily with functional robots)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;AI will discover massive software vulnerabilities allowing bad actors to “hack
pretty much every major software system in the world”.&lt;/em&gt; (Did Friedman pull that
directly from Anthropic’s press release or was that his contribution?)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; To help stave off human collapse, only release the new version to a
vetted group of software companies and developers, preferably ones with big
social media followings&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Wait for the limited release developers to spew unbridled
enthusiasm and shocking examples that seem to suggest this new AI produce is
truly unbelievable&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Watch stock prices and valuations soar&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Release to the world, and experience a steady stream of mockery as
people discover how wrong you are&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Start over&lt;/p&gt;
&lt;p&gt;Even if Friedman missed the text book example of the playbook, I have to ask:
if you think bad actors compromising software resulting in massive loss of
private data, major outages and wasted resources needs to be reported on, then
where have you been for the last 10 years? This literally happens &lt;a href="https://www.bleepingcomputer.com/news/security/"&gt;on a daily
basis&lt;/a&gt; due to the
fundamentally flawed way capitalism has been writing software even before the
invention of AI. A small part of me wonders - maybe AI writing software is not
so bad, because how could it be any worse than it is now?&lt;/p&gt;
&lt;p&gt;Also, let’s keep in mind that AI’s super ability at finding vulnerable software
depends on having access to the software’s source code, which most companies
keep locked up tight. That means the owners of the software can use AI to find
vulnerabilities and fix them but bad actors can’t.&lt;/p&gt;
&lt;p&gt;Oh, but wait, what if a company is so incompetent that they &lt;a href="https://www.cnbc.com/2026/03/31/anthropic-leak-claude-code-internal-source.html"&gt;accidentally
release their proprietary software to the
Internet&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Surely that would allow AI bots to discover their vulnerabilities and destroy
the company right? I’m not sure if anyone has discovered world ending
vulnerabilities in Anthropic’s Claude code since it was accidentally released,
but it is fun to watch people &lt;a href="https://neuromatch.social/@jonny/116325668039992121"&gt;mock
software&lt;/a&gt; that is clearly
written by AI (and spoiler alert, it seems way worse that software written
now).&lt;/p&gt;
&lt;p&gt;Well… we probably should all be keeping our money in a pillow case anyway.&lt;/p&gt; </description> 
	<pubDate>Fri, 10 Apr 2026 12:27:10 +0000</pubDate>

</item> 
<item>
	<title>Reproducible Builds (diffoscope): diffoscope 317 released</title>
	<guid>https://diffoscope.org/news/diffoscope-317-released/</guid>
	<link>https://diffoscope.org/news/diffoscope-317-released/</link>
     <description>  &lt;p&gt;The diffoscope maintainers are pleased to announce the release of diffoscope
version &lt;code class="language-plaintext highlighter-rouge"&gt;317&lt;/code&gt;. This version includes the following changes:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;[ Chris Lamb ]
* Limit python3-guestfs Build-Dependency to !i386. (Closes: #1132974)
* Try to fix PYPI_ID_TOKEN debugging.

[ Holger Levsen ]
* Add ppc64el to the list of architectures for python3-guestfs.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You find out more by &lt;a href="https://diffoscope.org"&gt;visiting the project homepage&lt;/a&gt;.&lt;/p&gt; </description> 
	<pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: HP Z640 and E5-2696 v4</title>
	<guid>https://etbe.coker.com.au/?p=6021</guid>
	<link>https://etbe.coker.com.au/2026/04/10/hp-z640-e5-2696-v4/</link>
     <description>  &lt;p&gt;I recently decided to upgrade the CPU in my workstation, the &lt;a href="https://www.cpubenchmark.net/cpu.php?cpu=Intel+Xeon+E5-2696+v3+%40+2.30GHz&amp;amp;id=2526"&gt;E5-2696 v3 CPU was OK (passmark 2045 for single thread and 21,380 for multi thread) [1]&lt;/a&gt; but I felt like buying something better so I got a &lt;a href="https://www.cpubenchmark.net/cpu.php?cpu=Intel+Xeon+E5-2696+v4+%40+2.20GHz&amp;amp;id=2750"&gt;E5-2696 v4 (passmark 2115 and 24,643) [2]&lt;/a&gt;. I chose the E5-2696 v4 because I was looking for a E5-2699 v4 and found an ebay seller who had them at $140 but was offering the E5-2696 v4 for $99 and the passmark results for the two CPUs are almost identical.&lt;/p&gt;
&lt;p&gt;After buying the CPU and waiting for it to be delivered I realised that the Z640 doesn’t include it in the list of supported CPUs and that the maximum TDP of any supported CPU is 145W while according to passmark it has a TDP of 150W. I looked for information about it on Intel ARK (the official site for specs of Intel CPUs) and discovered that &lt;a href="https://community.intel.com/t5/Mobile-and-Desktop-Processors/where-is-Intel-Xeon-E5-2696-v4-CPU-specifications-on-INTEL-ark/td-p/1373164"&gt;“The Intel® Xeon® Processor E5-2696 v4 is designed to be used by system manufacturers (OEMs), and this means they can modify its specifications depending on the system where it will be implemented” and “The processor does not have an ARK page for this reason, since it has no standard specification from Intel, so depending on the original system, it is necessary to contact that system manufacturer for information” [3]&lt;/a&gt;. That’s the official response from an Intel employee saying that there are no standard specs for that CPU!!!&lt;/p&gt;
&lt;p&gt;Somehow I had used a E5-2696 v3 for 3 years without realising that &lt;a href="https://community.intel.com/t5/Mobile-and-Desktop-Processors/Can-not-find-specifications-of-Intel-Xeon-E5-2696-v3/m-p/636614"&gt;the same lack of support and specs applies to it [4]&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I installed the new CPU in another Z640 which had a E5-1620 v3 CPU and it worked. I was a little surprised to discover that the hole in the corner is in the bottom right (according to the alignment of the printed text on the top) for all my E5-26xx CPUs while it’s in the top left on the E5-1620 v3. Google searches for things like “e5-2600 e5-1600 difference” and “e5-2600 e5-1600 difference hole in corner” didn’t turn up any useful information. The best information I found was from the &lt;a href="https://linustechtips.com/topic/820213-why-is-there-a-hole-in-my-cpu-is-this-normal/"&gt;Linus Tech Tips forum which says that the hole is to allow gasses to escape when the CPU package is glued together [5]&lt;/a&gt; which implies (but doesn’t state) that the location of the hole has no meaning. I had previously thought that the hole was to indicate the location of “pin 1” and was surprised when the new CPU had the hole in the opposite corner. Hopefully in future when people have such concerns they can find this post and not be worried that they are about to destroy their CPU, PC, or both when upgrading the CPU.&lt;/p&gt;
&lt;p&gt;The previous Z640 was one I bought from Facebook marketplace for $50 in “unknown condition” in the expectation that I would get at least $50 of parts but it worked perfectly apart from one DIMM socket. The Z640 I’m using now is one I bought from Facebook marketplace for $200 and it’s working perfectly with 4 DIMMs, 128G of RAM, and the E5-2696 v4 CPU. $300 for a workstation with ECC RAM and a 22 core CPU is good value for money!&lt;/p&gt;
&lt;p&gt;There are some accounts of the E5-2696 v4 not working on white-box motherboards including a claim that when it was selling for $4000US someone’s motherboard destroyed one. The best plan for such CPUs is to google for someone who’s already got it working in the same machine, which means a name-brand server. That doesn’t guarantee that it will work (Intel refuses to supply specs and states that different items may work differently) but greatly improves the probability.&lt;/p&gt;
&lt;p&gt;This system has the HP BIOS version 2.61, note that the Linux &lt;b&gt;fwupd&lt;/b&gt; package doesn’t seem to update the BIOS on HP workstations so you need to manually download it and install it. There is a possibility that a Z640 with an older BIOS won’t work with this CPU.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://etbe.coker.com.au/2025/04/05/hp-ml110-gen9-z640/"&gt;Here is the previous post in my Z640 saga [6]&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href="https://www.cpubenchmark.net/cpu.php?cpu=Intel+Xeon+E5-2696+v3+%40+2.30GHz&amp;amp;id=2526"&gt; https://tinyurl.com/2hrrnqfr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href="https://www.cpubenchmark.net/cpu.php?cpu=Intel+Xeon+E5-2696+v4+%40+2.20GHz&amp;amp;id=2750"&gt; https://tinyurl.com/2j2gg3es&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3]&lt;a href="https://community.intel.com/t5/Mobile-and-Desktop-Processors/where-is-Intel-Xeon-E5-2696-v4-CPU-specifications-on-INTEL-ark/td-p/1373164"&gt; https://tinyurl.com/2742z4qm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4]&lt;a href="https://community.intel.com/t5/Mobile-and-Desktop-Processors/Can-not-find-specifications-of-Intel-Xeon-E5-2696-v3/m-p/636614"&gt; https://tinyurl.com/25nzpa5t&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5]&lt;a href="https://linustechtips.com/topic/820213-why-is-there-a-hole-in-my-cpu-is-this-normal/"&gt; https://tinyurl.com/25ebra97&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6]&lt;a href="https://etbe.coker.com.au/2025/04/05/hp-ml110-gen9-z640/"&gt; https://etbe.coker.com.au/2025/04/05/hp-ml110-gen9-z640/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list"&gt;

&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2025/04/05/hp-ml110-gen9-z640/" rel="bookmark" title="More About the HP ML110 Gen9 and z640"&gt;More About the HP ML110 Gen9 and z640&lt;/a&gt; &lt;small&gt;In May 2021 I bought a ML110 Gen9 to use...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2025/04/05/hp-z840/" rel="bookmark" title="HP z840"&gt;HP z840&lt;/a&gt; &lt;small&gt;Many PCs with DDR4 RAM have started going cheap on...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2023/02/12/t320-idrac-failure-hp-z640/" rel="bookmark" title="T320 iDRAC Failure and new HP Z640"&gt;T320 iDRAC Failure and new HP Z640&lt;/a&gt; &lt;small&gt;The Dell T320 Almost 2 years ago I made a...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Thu, 09 Apr 2026 23:33:19 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Dowland: nvim-µwiki</title>
	<guid>https://jmtd.net/log/nvim-%C2%B5wiki/</guid>
	<link>https://jmtd.net/log/nvim-µwiki/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/jmtd.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;In January 2025,
as a pre-requisite for something else, I published a minimal &lt;a href="https://jmtd.net/log/neovim/"&gt;neovim&lt;/a&gt;
plugin called &lt;a href="https://github.com/jmtd/nvim-microwiki"&gt;nvim-µwiki&lt;/a&gt;. It's essentially just the features from
&lt;a href="https://jmtd.net/log/vimwiki/"&gt;vimwiki&lt;/a&gt; that I regularly use, which is a small fraction them.
I forgot to blog about it. I recently dusted it off and cleaned it up.
You can find it here, along with a longer list of its features and
how to configure it: &lt;a href="https://github.com/jmtd/nvim-microwiki"&gt;https://github.com/jmtd/nvim-microwiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had a couple of design goals. I didn't want to define a new &lt;code&gt;filetype&lt;/code&gt;,
so this is designed to work with the existing markdown one. I'm
using neovim, so I wanted to leverage some of its features: this plugin
is written in &lt;a href="https://jmtd.net/lua/"&gt;Lua&lt;/a&gt;, rather than vimscript. I use the parse trees
provided by &lt;a href="https://neovim.io/doc/user/treesitter.html"&gt;TreeSitter&lt;/a&gt; to navigate the structure of a document.
I also decided to "plug into" the existing tag stack navigation, rather
than define another dimension of navigation (along with buffers, etc.)
to track: Following a wiki-link pushes onto the tag stack, just as if
you followed a tag.&lt;/p&gt;

&lt;p&gt;This was my first serious bit of &lt;a href="https://jmtd.net/lua/"&gt;Lua&lt;/a&gt; programming, as well as my first
dive into neovim (or even vim) internals.
&lt;a href="https://jmtd.net/lua/"&gt;Lua&lt;/a&gt; is quite reasonable. Most
of the vim and neovim architecture is reasonable. The emerging conventions
about structuring neovim plugins are mostly reasonable. TreeSitter is, well,
interesting, but the devil is very much in the details. Somehow all
together the experience for me was largely just frustrating, and I didn't
really enjoy writing it.&lt;/p&gt; </description> 
	<pubDate>Wed, 08 Apr 2026 20:31:44 +0000</pubDate>

</item> 
<item>
	<title>Thorsten Alteholz: My Debian Activities in March 2026</title>
	<guid>http://blog.alteholz.eu/?p=2795</guid>
	<link>http://blog.alteholz.eu/2026/04/my-debian-activities-in-march-2026/</link>
     <description>  &lt;h3&gt;&lt;strong&gt;Debian LTS/ELTS&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;/p&gt;&lt;p&gt;This was my hundred-forty-first month that I did some work for the Debian LTS initiative, started by Raphael Hertzog at Freexian.
&lt;/p&gt;
&lt;p&gt;
During my allocated time I uploaded or worked on:  
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;[&lt;a href="https://lists.debian.org/debian-lts-announce/2026/03/msg00005.html"&gt;DLA 4500-1&lt;/a&gt;] gimp security update to fix four CVEs related to denial of service or execution of arbitrary code.
&lt;/li&gt;&lt;li&gt;[&lt;a href="https://lists.debian.org/debian-lts-announce/2026/03/msg00007.html"&gt;DLA 4503-1&lt;/a&gt;] evolution-data-server to fix one CVE related to a missing canonicalization of a file path.
&lt;/li&gt;&lt;li&gt;[&lt;a href="https://lists.debian.org/debian-lts-announce/2026/03/msg00016.html"&gt;DLA 4512-1&lt;/a&gt;] strongswan security update to fix one CVE related to a denial of service.
&lt;/li&gt;&lt;li&gt;[ELA-1656-1] gimp security update to fix four CVEs in Buster and Stretch related to denial of service or execution of arbitrary code.&lt;/li&gt;&lt;li&gt;[ELA-1660-1] evolution-data-server security update to fix one CVE in Buster and Stretch related to  a missing canonicalization of a file path.&lt;/li&gt;&lt;li&gt;[ELA-1665-1] strongswan security update to fix one CVE in Buster related to a denial of service.&lt;/li&gt;&lt;li&gt;[ELA-1666-1] libvpx security update to fix one CVE in Buster and Stretch related to a denial of service or potentially execution of arbitrary code.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;
I also worked on the &lt;i&gt;check-advisories&lt;/i&gt; script and proposed a fix for cases where issues would be assigned to the coordinator instead of the person who forgot doing something. 
I also did some work for a kernel update and packages &lt;i&gt;snapd&lt;/i&gt; and &lt;i&gt;ldx&lt;/i&gt; on security-master and attended the monthly LTS/ELTS meeting. Last but not least I started to work on &lt;i&gt;gst-plugins-bad1.0&lt;/i&gt;&lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;Debian Printing&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;This month I uploaded a new upstream versions:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/epson-inkjet-printer-escpr"&gt;epson-inkjet-printer-escpr&lt;/a&gt; to unstable.&lt;/li&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/sane-airscan"&gt;sane-airscan&lt;/a&gt; to unstable.&lt;/li&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/printer-driver-oki"&gt;printer-driver-oki&lt;/a&gt; to unstable.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;Several packages take care of group lpadmin in their maintainer scripts. With the upload of version 260.1-1 of &lt;i&gt;systemd&lt;/i&gt; there is now a central package (&lt;i&gt;systemd | systemd-standalone-sysusers | systemd-sysusers&lt;/i&gt;) that takes care of this. Other dependencies like &lt;i&gt;adduser&lt;/i&gt; can now be dropped.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;This work is generously funded by &lt;a href="https://www.freexian.com"&gt;Freexian&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;Debian Lomiri&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;This month I continued to work on unifying packaging on Debian and Ubuntu. This makes it easier to work on those packages independent of the used platform. I am also able to upload Debian packages to the corresponding Ubuntu PPA now. A small bug had to be fixed in the python script to allow the initial configuration in Launchpad. &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;This work is generously funded by &lt;a href="https://freiesoftware.gmbh/"&gt;Fre(i)e Software GmbH&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;Debian Astro&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;This month I uploaded a new upstream version  or a bugfix version of:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/libplayerone"&gt;libplayerone&lt;/a&gt; to experimental. For a list of other packages please see below.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;I also uploaded lots of indi-drivers (&lt;i&gt;libplayerone, libsbig, libricohcamerasdk, indi-asi, indi-eqmod, indi-fishcamp, indi-inovaplx, indi-pentax, indi-playerone, indi-sbig, indi-mi, libahp-xc, indi-aagcloudwatcher, indi-aok, indi-apogee, libapogee3, indi-nightscape, libasi, libinovasdk, libmicam, indi-avalon, indi-beefocus, indi-bresserexos2, indi-dsi, indi-ffmv, indi-fli, indi-gige, info-gphoto, indi-gpsd, indi-gpsnmea, indi-limesdr, indi-maxdomeii, indi-mgen, indi-rtklib, indi-shelyak, indi-starbook, indi-starbookten, indi-talon6, indi-weewx-json, indi-webcam, indi-orion-ssg3, indi-armadillo-playtypus&lt;/i&gt; ) to experimental to make progress with the indi-transition. No problems with those drivers appeared and the next step would be the upload of indi version 2.x to unstable. I hope this will happen soon, as new drivers are already waiting in the pipeline. There have been also four packages, that migrated to the official indi package and are no longer needed as 3rdparty drivers (indi-astrolink4, indi-astromechfoc, indi-dreamfocuser, indi-spectracyber).&lt;/p&gt;



&lt;p&gt;While working on these packages, I thought about testing them. Unfortunately I don’t have enough hardware to really check out every package, so I can upload most of them only as is. In case anybody is interested in a better testing coverage and me being able to provide upstream patches, I would be very glad about hardware donations.&lt;/p&gt;



&lt;h3&gt;&lt;strong&gt;Debian IoT&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;This month I uploaded a new upstream version  or a bugfix version of:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/pywws"&gt;pywws&lt;/a&gt; to unstable.&lt;/li&gt;&lt;/ul&gt;



&lt;h3&gt;&lt;strong&gt;Debian Mobcom&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;This month I uploaded a new upstream version  or a bugfix version of:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/osmo-trx"&gt;osmo-trx&lt;/a&gt; to unstable.&lt;/li&gt;&lt;/ul&gt;



&lt;h3&gt;&lt;strong&gt;misc&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;This month I uploaded a new upstream version  or a bugfix version of:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/cc-tool"&gt;cc-tool&lt;/a&gt; to unstable.&lt;/li&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/mailio"&gt;mailio&lt;/a&gt; to unstable.&lt;/li&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/gnupksc11-scd"&gt;gnupg-pkcs11-scd&lt;/a&gt; to unstable.&lt;/li&gt;&lt;li&gt;… &lt;a href="https://tracker.debian.org/odoo"&gt;odoo&lt;/a&gt; to unstable.&lt;/li&gt;&lt;/ul&gt;



&lt;p&gt;I also sponsored the upload of Matomo. Thanks a lot to William for preparing the package.&lt;/p&gt; </description> 
	<pubDate>Mon, 06 Apr 2026 17:45:48 +0000</pubDate>

</item> 
<item>
	<title>Isoken Ibizugbe: Post Outreachy Activities</title>
	<guid>http://isokenibizugbe.wordpress.com/?p=29</guid>
	<link>https://isokenibizugbe.wordpress.com/2026/04/05/post-outreachy-activities/</link>
     <description>  &lt;h1 class="wp-block-heading"&gt;&lt;/h1&gt;



&lt;p class="wp-block-paragraph"&gt;It’s been about a month since I wrapped up my Outreachy internship, but my journey with &lt;strong&gt;Debian&lt;/strong&gt; is far from over. I planned to keep contributing and exploring the community, and these past few weeks have been busy&lt;/p&gt;



&lt;h3 class="wp-block-heading"&gt;&lt;strong&gt;Testing Locales and Solving Bug #1111214&lt;/strong&gt;&lt;/h3&gt;



&lt;p class="wp-block-paragraph"&gt;For the &lt;strong&gt;openQA&lt;/strong&gt; project, we decided to explore how accurate local language installations are and see if we can improve the translations. While exploring this, I started working on automating a test for a specific bug report:&lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1111214"&gt; &lt;strong&gt;Debian Bug #1111214&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p class="wp-block-paragraph"&gt;This is a test I had started by writing a detailed description of the installation process to confirm that selecting the &lt;strong&gt;Spanish_panama&lt;/strong&gt; locale works accurately. I spent time studying previous language installation tests, and I learned that I needed to add a specific tag (LANGUAGE-) to the “needles” (visual test markers).&lt;/p&gt;



&lt;p class="wp-block-paragraph"&gt;Since the installation wasn’t in English anymore, taking the correct screenshots and defining the areas took quite some time. I used the following command on the CLI to run the test:&lt;/p&gt;



&lt;p class="wp-block-paragraph"&gt;`openqa-cli api -X POST isos ISO=debian-live-testing-amd64-gnome.iso DISTRI=debian-live VERSION=forky FLAVOR=gnome LANGUAGE=spanish_panama ARCH=x86_64 BUILD=1311 CHECKSUM=unknown`&lt;/p&gt;



&lt;p class="wp-block-paragraph"&gt;While working on this, I got stuck at the &lt;strong&gt;complete_installation&lt;/strong&gt; step. Because the keyboard layout had changed to Spanish, the commands required to confirm a successful install weren’t working as expected. Specifically, we had an issue typing the “greater than” sign (&amp;gt;).&lt;/p&gt;



&lt;p class="wp-block-paragraph"&gt;My mentor, &lt;strong&gt;Roland Clobus&lt;/strong&gt;, worked on a clever maneuver for the keys (AltGr-Shift-X), which was actually submitted &lt;strong&gt;upstream&lt;/strong&gt; to openSUSE.&lt;/p&gt;



&lt;p class="wp-block-paragraph"&gt;In this step, I also had to confirm that the locale was correctly set to LANG=”es_PA.UTF-8″. I had to dig into the scripts and Linux commands to make this work. It was a bit intimidating at first, but it turned out to be a great learning experience. You can follow my progress on this&lt;a href="https://salsa.debian.org/qa/openqa/openqa-tests-debian/-/merge_requests/130"&gt; &lt;strong&gt;Merge Request here&lt;/strong&gt;&lt;/a&gt;. I’m currently debugging a small issue where the “home” key seems to click twice in the final step, and after that, the test would be complete &lt;img alt="&#128512;" class="wp-smiley" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" style="height: 1em;" /&gt;.&lt;/p&gt;



&lt;h3 class="wp-block-heading"&gt;&lt;strong&gt;Community &amp;amp; Connections&lt;/strong&gt;&lt;/h3&gt;



&lt;p class="wp-block-paragraph"&gt;Beyond the code, I’ve been getting more involved in the social side of Debian:&lt;/p&gt;



&lt;ul class="wp-block-list"&gt;
&lt;li&gt;&lt;strong&gt;Debian Women:&lt;/strong&gt; I attended the monthly meeting and met &lt;strong&gt;Sruthi Chandran&lt;/strong&gt;. I’ve always seen her name as an Outreachy organizer, so it was great to meet her! She is currently running for Debian Project Leader (DPL). We also discussed starting technical sessions to introduce members to &lt;strong&gt;packaging&lt;/strong&gt;, which I am very excited to learn.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;DebConf Preparation:&lt;/strong&gt; I am officially preparing for my first &lt;strong&gt;DebConf&lt;/strong&gt;! My mentors, Tassia and Roland, along with my fellow intern Hellen, have been incredibly supportive in guiding me through the application and presentation process.&lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Sat, 04 Apr 2026 23:24:06 +0000</pubDate>

</item> 
<item>
	<title>Dima Kogan: Simple gpx export from ridewithgps</title>
	<guid>https://notes.secretsauce.net/notes/2026/04/04_simple-gpx-export-from-ridewithgps.html</guid>
	<link>http://notes.secretsauce.net/notes/2026/04/04_simple-gpx-export-from-ridewithgps.html</link>
     <description>  &lt;p&gt;
The &lt;a href="https://tourdelospadres.weebly.com/"&gt;Tour de Los Padres&lt;/a&gt; is coming! The race organizer post &lt;a href="https://ridewithgps.com/routes/54493422"&gt;the route on
ridewithgps&lt;/a&gt;. This works, but has convoluted interfaces for people not wanting to
use their service. I just wrote a simple script to export their data into a
plain .gpx file, &lt;i&gt;including&lt;/i&gt; all the waypoints; their exporter omits those.
&lt;/p&gt;

&lt;p&gt;
I've seen two flavors of their data, so here're two flavors of the
&lt;code&gt;gpx-from-ridewithgps.py&lt;/code&gt; script:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #cdcd00;"&gt;#&lt;/span&gt;&lt;span style="color: #cdcd00;"&gt;!/usr/bin/python3&lt;/span&gt;
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;import&lt;/span&gt; sys
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;import&lt;/span&gt; json

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: #0000ee; font-weight: bold;"&gt;quote_xml&lt;/span&gt;(s):
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;return&lt;/span&gt; s.replace(&lt;span style="color: #00cd00;"&gt;"&amp;amp;"&lt;/span&gt;, &lt;span style="color: #00cd00;"&gt;"&amp;amp;amp;"&lt;/span&gt;).replace(&lt;span style="color: #00cd00;"&gt;"&amp;lt;"&lt;/span&gt;, &lt;span style="color: #00cd00;"&gt;"&amp;amp;lt;"&lt;/span&gt;).replace(&lt;span style="color: #00cd00;"&gt;"&amp;gt;"&lt;/span&gt;, &lt;span style="color: #00cd00;"&gt;"&amp;amp;gt;"&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"Reading stdin"&lt;/span&gt;, &lt;span style="color: #0000ee; font-weight: bold;"&gt;file&lt;/span&gt;=sys.stderr)
&lt;span style="color: #cdcd00;"&gt;data&lt;/span&gt; = json.load(sys.stdin)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(r&lt;span style="color: #00cd00;"&gt;"""&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span style="color: #00cd00;"&gt;&amp;lt;gpx version="1.1" creator="gpx-from-ridewithgps.py" xmlns="http://www.topografix.com/GPX/1/1"&amp;gt;"""&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;for&lt;/span&gt; item &lt;span style="color: #00cdcd; font-weight: bold;"&gt;in&lt;/span&gt; data[&lt;span style="color: #00cd00;"&gt;"extras"&lt;/span&gt;]:
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;if&lt;/span&gt; item[&lt;span style="color: #00cd00;"&gt;"type"&lt;/span&gt;] != &lt;span style="color: #00cd00;"&gt;"point_of_interest"&lt;/span&gt;:
        &lt;span style="color: #00cdcd; font-weight: bold;"&gt;continue&lt;/span&gt;
    &lt;span style="color: #cdcd00;"&gt;poi&lt;/span&gt; = item[&lt;span style="color: #00cd00;"&gt;"point_of_interest"&lt;/span&gt;]
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'  &amp;lt;wpt lat="{poi["lat"]}" lon="{poi["lng"]}"&amp;gt;'&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;name&amp;gt;{quote_xml(poi["name"])}&amp;lt;/name&amp;gt;'&lt;/span&gt;)

    &lt;span style="color: #cdcd00;"&gt;desc&lt;/span&gt; = poi.get(&lt;span style="color: #00cd00;"&gt;"description"&lt;/span&gt;,&lt;span style="color: #00cd00;"&gt;""&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #0000ee; font-weight: bold;"&gt;len&lt;/span&gt;(desc):
        &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;desc&amp;gt;{quote_xml(desc)}&amp;lt;/desc&amp;gt;'&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'  &amp;lt;/wpt&amp;gt;'&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"  &amp;lt;trk&amp;gt;&amp;lt;trkseg&amp;gt;"&lt;/span&gt;)
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;for&lt;/span&gt; pt &lt;span style="color: #00cdcd; font-weight: bold;"&gt;in&lt;/span&gt; data.get(&lt;span style="color: #00cd00;"&gt;"route"&lt;/span&gt;, {}).get(&lt;span style="color: #00cd00;"&gt;"track_points"&lt;/span&gt;, []):
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;trkpt lat="{pt["y"]}" lon="{pt["x"]}"&amp;gt;&amp;lt;ele&amp;gt;{pt["e"]}&amp;lt;/ele&amp;gt;&amp;lt;/trkpt&amp;gt;'&lt;/span&gt;)
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"  &amp;lt;/trkseg&amp;gt;&amp;lt;/trk&amp;gt;"&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"&amp;lt;/gpx&amp;gt;"&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-python"&gt;&lt;span style="color: #cdcd00;"&gt;#&lt;/span&gt;&lt;span style="color: #cdcd00;"&gt;!/usr/bin/python3&lt;/span&gt;
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;import&lt;/span&gt; sys
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;import&lt;/span&gt; json

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: #0000ee; font-weight: bold;"&gt;quote_xml&lt;/span&gt;(s):
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;return&lt;/span&gt; s.replace(&lt;span style="color: #00cd00;"&gt;"&amp;amp;"&lt;/span&gt;, &lt;span style="color: #00cd00;"&gt;"&amp;amp;amp;"&lt;/span&gt;).replace(&lt;span style="color: #00cd00;"&gt;"&amp;lt;"&lt;/span&gt;, &lt;span style="color: #00cd00;"&gt;"&amp;amp;lt;"&lt;/span&gt;).replace(&lt;span style="color: #00cd00;"&gt;"&amp;gt;"&lt;/span&gt;, &lt;span style="color: #00cd00;"&gt;"&amp;amp;gt;"&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"Reading stdin"&lt;/span&gt;, &lt;span style="color: #0000ee; font-weight: bold;"&gt;file&lt;/span&gt;=sys.stderr)
&lt;span style="color: #cdcd00;"&gt;data&lt;/span&gt; = json.load(sys.stdin)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(r&lt;span style="color: #00cd00;"&gt;"""&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span style="color: #00cd00;"&gt;&amp;lt;gpx version="1.1" creator="gpx-from-ridewithgps.py" xmlns="http://www.topografix.com/GPX/1/1"&amp;gt;"""&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;for&lt;/span&gt; poi &lt;span style="color: #00cdcd; font-weight: bold;"&gt;in&lt;/span&gt; data[&lt;span style="color: #00cd00;"&gt;"points_of_interest"&lt;/span&gt;]:
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'  &amp;lt;wpt lat="{poi["lat"]}" lon="{poi["lng"]}"&amp;gt;'&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;name&amp;gt;{quote_xml(poi["name"])}&amp;lt;/name&amp;gt;'&lt;/span&gt;)

    &lt;span style="color: #cdcd00;"&gt;desc&lt;/span&gt; = poi.get(&lt;span style="color: #00cd00;"&gt;"description"&lt;/span&gt;,&lt;span style="color: #00cd00;"&gt;""&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #0000ee; font-weight: bold;"&gt;len&lt;/span&gt;(desc):
        &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;desc&amp;gt;{quote_xml(desc)}&amp;lt;/desc&amp;gt;'&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'  &amp;lt;/wpt&amp;gt;'&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;for&lt;/span&gt; poi &lt;span style="color: #00cdcd; font-weight: bold;"&gt;in&lt;/span&gt; data[&lt;span style="color: #00cd00;"&gt;"course_points"&lt;/span&gt;]:
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'  &amp;lt;wpt lat="{poi["y"]}" lon="{poi["x"]}"&amp;gt;'&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;name&amp;gt;{quote_xml(poi["n"])}&amp;lt;/name&amp;gt;'&lt;/span&gt;)
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'  &amp;lt;/wpt&amp;gt;'&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"  &amp;lt;trk&amp;gt;&amp;lt;trkseg&amp;gt;"&lt;/span&gt;)
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;for&lt;/span&gt; pt &lt;span style="color: #00cdcd; font-weight: bold;"&gt;in&lt;/span&gt; data[&lt;span style="color: #00cd00;"&gt;'track_points'&lt;/span&gt;]:
    &lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(f&lt;span style="color: #00cd00;"&gt;'    &amp;lt;trkpt lat="{pt["y"]}" lon="{pt["x"]}"&amp;gt;&amp;lt;ele&amp;gt;{pt["e"]}&amp;lt;/ele&amp;gt;&amp;lt;/trkpt&amp;gt;'&lt;/span&gt;)
&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"  &amp;lt;/trkseg&amp;gt;&amp;lt;/trk&amp;gt;"&lt;/span&gt;)

&lt;span style="color: #00cdcd; font-weight: bold;"&gt;print&lt;/span&gt;(&lt;span style="color: #00cd00;"&gt;"&amp;lt;/gpx&amp;gt;"&lt;/span&gt;)
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
You invoke it by downloading the route and feeding it into the script:
&lt;/p&gt;

&lt;div class="org-src-container"&gt;

&lt;pre class="src src-sh"&gt;curl -s https://ridewithgps.com/routes/54493422.json | ./ridewithgps-to-gpx.py &amp;gt; out.gpx
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Note that the route number 54493422 is in the url above.&lt;/p&gt; </description> 
	<pubDate>Sat, 04 Apr 2026 17:21:00 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: Sponsor me for Tour de Shore 2026 to support MFA</title>
	<guid>http://dirk.eddelbuettel.com/blog/2026/04/03#sponsor_tour_de_shore_2026</guid>
	<link>http://dirk.eddelbuettel.com/blog/2026/04/03#sponsor_tour_de_shore_2026</link>
     <description>  &lt;img src="http://planet.debian.org/heads/dirk.png" width="65" height="90" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;&lt;a href="https://www.letourdeshore.com/"&gt;
&lt;img alt="tour de shore 2026" src="https://eddelbuettel.github.io/images/2026-04-03/tour_de_shore_2026.png" style="float: left; margin: 10px 10px 10px 10px;" width="45%" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On June 19 and 20, I will cycle a little over 100 miles from downtown
Chicago and its wonderful Millenium Park to New Buffalo, Michigan, as
part of the &lt;a href="https://www.letourdeshore.com/"&gt;Tour de Shore
2026&lt;/a&gt;. The ride passes through northwest Indiana and the extended &lt;a href="https://www.nps.gov/indu/index.htm"&gt;Indiana Dunes National
Park&lt;/a&gt; ending the next morning in the southwestern Michigan town of
New Buffalo. I rode Tour de Shore once before in 2024 and had a
generally wonderful time (even considering some soreness after a century
of miles over 1 1/2 days).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.letourdeshore.com/"&gt;Tour de Shore&lt;/a&gt; is riding
in support of &lt;a href="https://maywoodfinearts.org/"&gt;Maywood Fine Arts
Center&lt;/a&gt;, a local arts and sports center in &lt;a href="https://en.wikipedia.org/wiki/Maywood,_Illinois"&gt;Maywood,
Illinois&lt;/a&gt;, a suburb one over from where I live and hence just a few
good miles west of downtown. &lt;a href="https://en.wikipedia.org/wiki/Maywood,_Illinois"&gt;Maywood,
Illinois&lt;/a&gt; is home to legends such as the late &lt;a href="https://en.wikipedia.org/wiki/John_Prine"&gt;John Prine&lt;/a&gt; as well
as several NBA players such as player and coach &lt;a href="https://en.wikipedia.org/wiki/Doc_Rivers"&gt;Doc Rivers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.pledgereg.com/536435"&gt;
&lt;img alt="tour de shore 2026 donation page" src="https://eddelbuettel.github.io/images/2026-04-03/tour_de_shore_2026_fundraising.png" style="float: right; margin: 10px 10px 10px 10px;" width="45%" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But &lt;a href="https://en.wikipedia.org/wiki/Maywood,_Illinois"&gt;Maywood,
Illinois&lt;/a&gt; is also little less well off than other western suburbs.
The &lt;a href="https://maywoodfinearts.org/"&gt;Maywood Fine Arts Center&lt;/a&gt;
is simply legendary is what they do for this community (and surrounding
communities), and especially the youth support. They can use a dollar a
two. &lt;a href="https://maywoodfinearts.org/why-we-ride-le-tour-de-shore/"&gt;Their
story about Tour de Shore&lt;/a&gt; is worth a read too for background and
motivation.&lt;/p&gt;
&lt;p&gt;I have bootstrapped &lt;a href="https://www.pledgereg.com/536435"&gt;my
donation page&lt;/a&gt; page with a dollar for each mile to be cycled. It
would be simply terrific if you could join me. A nickel, a dime, or a
quarter per mile cycled would help. Multiples of that help too: More is
of course still always better.&lt;/p&gt;
&lt;p&gt;Anything you can afford will go a long way towards a worthy goal in a
community that could use the help.&lt;/p&gt;
&lt;p&gt;Of and if you are local to the area, I believe you can &lt;a href="https://www.bikereg.com/letourdeshore"&gt;still register for Tour de
Shore 2026&lt;/a&gt;. So see you out there in June? And if not, maybe help
with a dollar or two?&lt;/p&gt;
&lt;p style="font-size: 80%; font-style: italic;"&gt;
This post by &lt;a href="https://dirk.eddelbuettel.com"&gt;Dirk
Eddelbuettel&lt;/a&gt; originated on his &lt;a href="https://dirk.eddelbuettel.com/blog/"&gt;Thinking inside the box&lt;/a&gt;
blog.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Sat, 04 Apr 2026 01:08:00 +0000</pubDate>

</item> 
<item>
	<title>Joerg Jaspert: Building a house - 1 year in</title>
	<guid>https://blog.ganneff.de/2026/04/house</guid>
	<link>https://blog.ganneff.de/2026/04/house.html</link>
     <description>  &lt;p&gt;Haven’t written here about it, but last March we finally started on
our journey to get our own house build, so we can move out of the
rented flat here.&lt;/p&gt;

&lt;p&gt;That will be a big step, both the actual building, but also the
moving - I am living at this one single place for 36 years now.&lt;/p&gt;

&lt;p&gt;If you can read german there is &lt;a href="https://haus.ganneff.de/"&gt;a dedicated
webpage&lt;/a&gt; where I sometimes write about the
process. Will have much more details (and way more ramblings) than the
following part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you can’t read german, a somewhat short summary follows&lt;/strong&gt;. Yes,
still a lot of text, but shortened, still.&lt;/p&gt;

&lt;h3 id="what-why-now"&gt;What? Why now?&lt;/h3&gt;
&lt;p&gt;Current flat has 83m² - which simply isn’t enough space. And
the number of rooms also doesn’t fit anymore. But it is hard to find a
place that fits our requirements (which do include location).&lt;/p&gt;

&lt;p&gt;Moving to a different rented place would also mean changed amount of
rent. And nowadays that would be huge increase (my current rent is
still the price from about 30 years ago!).&lt;/p&gt;

&lt;p&gt;So if we go and pay more - we could adjust and pay for something we
own instead. And both, my wife and I had changes in our jobs that made
it possible for us now, so we started looking.&lt;/p&gt;

&lt;h3 id="market"&gt;Market&lt;/h3&gt;
&lt;p&gt;Brrrr, looking is good, actually finding something that fits - not so.
We never found an offer that fit. Space wise, sure. But then location
was off, or price was idiotically high. Location fit, but then size
was a joke, and guess about the price… Who needs 200 square meters
with 3 rooms? Entirely stupid design choices there. Or how about 40
square meters of hallway - with 50m² of tiny rooms around. What are
they smoking? Oh, there, useful size, good rooms - but now you want
more money than a kidney is worth, or something. Thanks, no.&lt;/p&gt;

&lt;h3 id="new-place"&gt;New place&lt;/h3&gt;
&lt;p&gt;In February 2025 we finally got lucky and found a (newly opened) area
with a large number of places to build a house on. Had multiple talks
with someone from on of the companies developing that area (there are
two you can select from), then talked with banks and signed a contract
in March 2025. We got promised that actual house construction would be
first quarter of 2026, finished in second quarter.&lt;/p&gt;

&lt;h3 id="house-type"&gt;House type&lt;/h3&gt;
&lt;p&gt;There are basically 2 ways of building a new house (that matter here).
First is called “Massivhaus”, second is called “Fertighaus” in german,
roughly translating to solid and prefabricated. The latter commonly a
wood based construction, though it doesn’t need to be. The important
part of it is the prefabrication, walls and stuff get assembled in a
factory somewhere and then transported to your place, where they play
“big kid lego” for a day and suddenly a house is there.&lt;/p&gt;

&lt;p&gt;A common thought is “prefabricated” is faster, but that is only a half
true. Sure, the actual work on side is way shorter - usually one or
two days and the house is done - while a massive construction usually
takes weeks to build up. But that is only a tiny part of the time
needed, the major part goes of into planning and waiting and in there
it doesn’t matter what material you end up with.&lt;/p&gt;

&lt;h2 id="money-fun"&gt;Money fun&lt;/h2&gt;
&lt;p&gt;Last year already wasn’t the best time to start a huge loan - but
isn’t it always “&lt;em&gt;a few years ago would have been better&lt;/em&gt;”? So we had
multiple talks with different banks and specialised consultants until
we found something that we thought is good for us.&lt;/p&gt;

&lt;p&gt;Thinking about it now - we should have put even more money on top as
“reserve”, but who could have thought that 2026 turns into such a
shitshow? Does not help at all, quite the contrary. And that damn
lotto game always ends up with the wrong numbers, meh.&lt;/p&gt;

&lt;h1 id="plans-and-plans-and-more-plans---and-rules"&gt;Plans and plans and more plans - and rules&lt;/h1&gt;
&lt;p&gt;For whichever reason you can not just go and put something on your
ground and be happy. At least not if you are part of the normal people and not
enormously rich. There is a large set of rules to follow. Usually that
is a good thing, even though some rules are sometimes hard to understand.&lt;/p&gt;

&lt;p&gt;In Germany, besides the usual laws, we have something that is called
“Bebauungsplan”, which translates to “development plan” (don’t know if
that carries the right meaning, it’s a plan on what and how may be
build, which can have really detailed specifications in). It basically
tells you every aspect &lt;em&gt;on top&lt;/em&gt; of the normal law that you have to
keep in mind.&lt;/p&gt;

&lt;p&gt;In our case we have the requirement of 2 full floors and CAN have a
third smaller on top, it limits how high the house can be &lt;em&gt;and&lt;/em&gt; also
how high our ground floor may be compared to the street. It regulates
where on the property we may build and how much ground we may cover
with the house, it gives a set of colors we are allowed to use, it
demands a flat roof that we must have as a green roof and has a number
of things more that aren’t important enough to list here. If you do
want to see the full list, &lt;a href="https://haus.ganneff.de/baustellen/2025/03/bebauungsplan/"&gt;my german post on it has all the details
that matter to
us&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With all that stuff in mind - off to plans. Wouldn’t have believed how
many details there are to take in. Room sizes are simple, but how to
arrange them for ideal usage of the sun, useful ways inside the house,
but also keeping in mind that water needs to flow through and out.
Putting a bath room right atop a living room means a water pipe needs
to go down there. Switch the bath room side in the house, and it
suddenly is above the kitchen - means you can connect the pipes from
it to the ones from kitchen, which is much preferred than going
through the living room. And lots more such things.&lt;/p&gt;

&lt;p&gt;It took us until nearly end of October to finalize the plans! And we
learned a whole load from it. We started with a lot of wishes. The
planner tried to make them work. Then we changed our minds. Plans
changed. Minds changed again. Comparing the end result with the first
draft we changed most of the ground floor around, with only the stairs
and the entrance door at the same position. Less changes for the upper
floor, but still enough.&lt;/p&gt;

&lt;h1 id="side-quests"&gt;Side quests&lt;/h1&gt;
&lt;p&gt;The whole year was riddled with something my son named side quests. We
visited a construction exhibition near us, we went to the house
builders factory and took a look on how they work. We went to many
different other companies that do SOME type of work which we need
soon, say inside floors, painters, kitchen and more stuff.&lt;/p&gt;

&lt;p&gt;Of course the most important side quest was a visit to the notary to
finalize the contracts, especially for the plot of land (in Germany
you must have a notary for that to get entered into the governments
books). Creates lots of fees, of course, for the notary and also the
government (both fees and taxes here).&lt;/p&gt;

&lt;h1 id="building-permit"&gt;Building permit&lt;/h1&gt;
&lt;p&gt;We had been lucky and only needed a small change to the plans to get
the building permit - and the second part, the wastewater permit (yes,
you need a separate one for this) also got through without trouble.&lt;/p&gt;

&lt;h1 id="choices-so-many-of-them"&gt;Choices, so many of them&lt;/h1&gt;
&lt;p&gt;So in January we finally had an appointment for something that’s
called “Bemusterung” which badly translates to “Sampling”. Basically
two days at the house builders factory to select all of what’s needed
for the house that you don’t do in the plans. Doors, inside and out
and their type and color and handles. Same things for the windows and
the blinds and the protection level you want the windows to have.
Decide about stairs, design for the sanitary installations - and also
the height of the toilet! - and the tiles to put into the bathrooms.
Decisions on all the tech needed (heating system, ventilation and
whatnot.&lt;/p&gt;

&lt;p&gt;Two days, busy ones - and you can easily spend a lot of extra money
here if you aren’t careful. We managed to get “out of it” with only
about 4000€ extra, so pretty good.&lt;/p&gt;

&lt;h1 id="electro-and-automation"&gt;Electro and automation&lt;/h1&gt;
&lt;p&gt;Now, here I am special. Back when I was young the job I learned is
electrician. So here I have very detailed wishes. I am also running
lots of automatism in my current flat - obviously the new house should
be better than that. So I have a lot of ideas and thoughts on it, so
this is entirely extra and certainly out of the ordinary the house
builder usually see.&lt;/p&gt;

&lt;p&gt;Which means I do all of that on my own. Well, the planning and some of
the work, I must have a company at hand for certain tasks, it is
required by some rules. But they will do what I planned, as long as I
don’t violate regulations.&lt;/p&gt;

&lt;p&gt;Which means the whole electrical installation is … different.
Entirely planned for automatisms and using KNX for it. I am so happy
to ditch Homeassistant and the load of Homematic, Zigbee and ZWave
based wireless things.&lt;/p&gt;

&lt;p&gt;Ok, Homeassistant is a nice thing - it can do a lot. And it can bridge
between about any system you can find. But it is a central single point of
failure. And it is a system that needs constant maintenance. Not
touched for a while? Plan for a few hours playing update whack-a-mole.
And often enough a component here or there breaks with an update. Can
be fixed, but takes another hour or two.&lt;/p&gt;

&lt;p&gt;So I change. Away from wireless based stuff. To wires. To a system
thats a standard for decades already. And works entirely without a
SPOF. (Yes, you can add one here too). And, most important, should I
ever die - can easily be maintained by anyone out there dealing with
KNX, which is a large number of people and companies. Without digging
through dozens of specialised integrations and whatnot.&lt;/p&gt;

&lt;p&gt;I may even end up with Homeassistant again - but that will entirely be
as a client. It won’t drive automations. It won’t be the central point
to do anything for the house. It will be a logging and data collecting
thing that enables me to put up easy visualizations. It may be an easy
interface for smartphones or tablets to control parts of the house,
for those parts where one wants this to happen. Not the usual
day-to-day stuff, extras on top.&lt;/p&gt;

&lt;h1 id="actual-work-happening"&gt;Actual work happening&lt;/h1&gt;
&lt;p&gt;Since march there &lt;em&gt;finally&lt;/em&gt; is action visible. The base of the house
is getting build. Wednesday the 1st April we finally got the base
slab poured on the construction site and in another 10 days the house
is getting delivered and build up. A 40ton mobile crane will be there.&lt;/p&gt; </description> 
	<pubDate>Thu, 02 Apr 2026 21:23:23 +0000</pubDate>

</item> 
<item>
	<title>Samuel Henrique: Bringing HTTP/3 to curl on Amazon Linux</title>
	<guid>https://samueloph.dev/blog/bringing-http3-to-curl-on-amazon-linux/</guid>
	<link>https://samueloph.dev/blog/bringing-http3-to-curl-on-amazon-linux/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/samueloph.png" width="100" height="100" alt="" align="right" style="float: right;"&gt;  &lt;img alt="Screenshot of the top entry of the curl package's changelog, showing the following: Changelogs for curl-8.17.0-1.amzn2023.0.2.x86_64 * Mon Mar 16 00:00:00 2026 Samuel Henrique (samueloph) &amp;lt;samhn@amazon.com&amp;gt; - 8.17.0-1.amzn2023.0.2 - Enable HTTP/3 support in the full build using ngtcp2 and nghttp3 - HTTP/3 is explicitly disabled in the minimal build - Add runtime dependencies on libnghttp3 and libngtcp2 with minimum version pinning - Run tests in parallel via upstream make test-nonflaky, with serial fallback for race-prone tests" height="226" src="https://samueloph.dev/blog/bringing-http3-to-curl-on-amazon-linux/bringing-http3-to-curl-on-amazon-linux.webp" width="1596" /&gt;
&lt;h4 id="tl-dr"&gt;tl;dr&lt;/h4&gt;
&lt;p&gt;Starting with &lt;strong&gt;curl 8.17.0-1.amzn2023.0.2&lt;/strong&gt; in Amazon Linux 2023, you can now use HTTP/3.&lt;/p&gt;
&lt;pre class="giallo" style="color: #EBDBB2; background-color: #282828;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;dnf&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; swap&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; -y&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; libcurl-minimal libcurl-full&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;dnf&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; swap&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; -y&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; curl-minimal curl-full&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;curl&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; --http3-only&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; https://example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(HTTP/3 is only enabled in the curl -full builds)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Or, if you would like to try it out in a container:&lt;/p&gt;
&lt;pre class="giallo" style="color: #EBDBB2; background-color: #282828;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;podman&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; run amazonlinux:2023 /bin/sh&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; -c&lt;/span&gt;&lt;span style="color: #A89984;"&gt; '&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt;dnf upgrade -y --releasever=latest &amp;amp;&amp;amp; dnf swap -y libcurl-minimal libcurl-full &amp;amp;&amp;amp; dnf swap -y curl-minimal curl-full &amp;amp;&amp;amp; curl --http3-only https://example.com&lt;/span&gt;&lt;span style="color: #A89984;"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a list of test endpoints, you can refer to
&lt;a href="https://bagder.github.io/HTTP3-test/" rel="noopener external" target="_blank"&gt;https://bagder.github.io/HTTP3-test/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="the-upgrade-i-didn-t-have-to-make"&gt;The Upgrade I Didn't Have to Make&lt;/h1&gt;
&lt;p&gt;My teammate Steve Zarkos, who previously worked on upgrading OpenSSL in Amazon
Linux from 3.0 to 3.2, spent the last few months on the complex task of bumping
OpenSSL again, this time to 3.5. A bump like this only happens after extensive
code analysis and testing, something that I didn't foresee happening when
AL2023 was released but that was a notable request from users.&lt;/p&gt;
&lt;p&gt;Having &lt;a href="https://samueloph.dev/blog/debian-curl-now-supports-http3/" rel="noopener external" target="_blank"&gt;enabled HTTP/3 on
Debian&lt;/a&gt;, I was
always keeping an eye on when I would get to do the same for Amazon Linux (mind
you, I work at AWS, in the Amazon Linux org). The bump to OpenSSL 3.5 was the
perfect opportunity to do that, for the first time Amazon Linux is shipping an
OpenSSL version that is supported by ngtcp2 for HTTP/3 support.&lt;/p&gt;
&lt;h1 id="non-intrusive-change"&gt;Non-Intrusive Change&lt;/h1&gt;
&lt;p&gt;In order to avoid any intrusive changes to existing users of AL2023, I've only
enabled HTTP/3 in the full build of curl, not in the minimal one, this means
there is no change for the minimal images.&lt;/p&gt;
&lt;p&gt;The way curl handles HTTP/3 today also does not lead to any behavior changes
for those who have the full variants of curl installed, this is due to the fact
that HTTP/3 is only used if the user explicitly asks for it with the flags
&lt;code&gt;--http3&lt;/code&gt; or &lt;code&gt;--http3-only&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="side-quests"&gt;Side Quests&lt;/h1&gt;
&lt;p&gt;Supporting HTTP/3 on curl also requires building it with ngtcp2 and nghttp3,
two packages which were not shipped in Amazon Linux, besides, my team doesn't
even own the curl package, we are a security team so our packages are the
security related stuff such as OpenSSL and GnuTLS. Our main focus is the
services behind Amazon Linux's vulnerability handling, not package maintenance.&lt;/p&gt;
&lt;p&gt;I worked with the owners of the curl package and got approvals on a plan to
introduce the two new dependencies under their ownership and to enable the
feature on curl, I appreciate their responsiveness.&lt;/p&gt;
&lt;p&gt;Amazon Linux 2023 is forked from Fedora, so while introducing ngtcp2, I also
sent a couple of Pull Requests upstream to keep things in sync:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://src.fedoraproject.org/rpms/ngtcp2/pull-request/9" rel="noopener external" target="_blank"&gt;[ngtcp2] package latest release 1.21.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://src.fedoraproject.org/rpms/ngtcp2/pull-request/8" rel="noopener external" target="_blank"&gt;[ngtcp2] do not skip tests&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While building the curl package in Amazon Linux, I've noticed the build was
taking 1 hour from start to end, and the culprit was something well known to
me; tests.&lt;/p&gt;
&lt;p&gt;The curl test suite is quite extensive, with more than 1600 tests, all of that
running without parallelization, running two times for each build of the
package; once for the minimal build and again for the full build.&lt;/p&gt;
&lt;p&gt;I had previously enabled parallel tests in Debian back in 2024 but never got
around to submit the same improvements to Amazon Linux or Fedora, this is now
fixed. The build times for Amazon Linux came down to 10 minutes under the same
host (previously 1 hour), and Fedora promptly merged my PR to do the same
there:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://src.fedoraproject.org/rpms/curl/pull-request/80" rel="noopener external" target="_blank"&gt;[curl] run tests in parallel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All of this uncovered a test which is timing-dependent, meaning it's not
supposed to be run with high levels of parallelism, so there goes another PR,
this time to curl:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/curl/curl/pull/21155" rel="noopener external" target="_blank"&gt;Flag test 766 as timing-dependent#21155&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What started as enabling a single feature turned into improvements that landed
in curl, Fedora, and Amazon Linux alike. I did this in a mix of work and
volunteer time, mostly during work hours (work email address used when this was
the case), but I'm glad I put in the extra time for the sake of improving curl
for everyone.&lt;/p&gt;
&lt;h1 id="release-notes"&gt;Release Notes&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.10.20260330.html" rel="noopener external" target="_blank"&gt;Amazon Linux 2023 release notes for 2023.10.20260330&lt;/a&gt;&lt;/p&gt; </description> 
	<pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Reproducible Builds (diffoscope): diffoscope 316 released</title>
	<guid>https://diffoscope.org/news/diffoscope-316-released/</guid>
	<link>https://diffoscope.org/news/diffoscope-316-released/</link>
     <description>  &lt;p&gt;The diffoscope maintainers are pleased to announce the release of diffoscope
version &lt;code class="language-plaintext highlighter-rouge"&gt;316&lt;/code&gt;. This version includes the following changes:&lt;/p&gt;

&lt;div class="language-plaintext highlighter-rouge"&gt;&lt;div class="highlight"&gt;&lt;pre class="highlight"&gt;&lt;code&gt;[ Jelle van der Waa ]
* Fix compatibility with LLVM version 22.

[ Chris Lamb ]
* Add some debugging info for PyPI debugging.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You find out more by &lt;a href="https://diffoscope.org"&gt;visiting the project homepage&lt;/a&gt;.&lt;/p&gt; </description> 
	<pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Joey Hess: banning all Anthropic employees</title>
	<guid>http://joeyh.name/blog/entry/banning_all_Anthropic_employees/</guid>
	<link>http://joeyh.name/blog/entry/banning_all_Anthropic_employees/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/joeyh2.png" width="84" height="75" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;Per &lt;a href="https://joeyh.name/blog/entry/policy_on_adding_AI_generated_content_to_my_software_projects/"&gt;my policies&lt;/a&gt;,
I need to ban every employee and contractor of Anthropic Inc from ever
contributing code to any of my projects. Anyone have a list?&lt;/p&gt;

&lt;p&gt;Any project that requires a Developer Certificate of Origin or similar should
be doing this, because Anthropic is making tools that explicitly lie about
the origin of patches to free software projects.&lt;/p&gt;

&lt;blockquote&gt;&lt;h2&gt;UNDERCOVER MODE — CRITICAL&lt;/h2&gt;

&lt;p&gt;You are operating UNDERCOVER in a PUBLIC/OPEN-SOURCE repository. [...]
Do not blow your cover.&lt;/p&gt;

&lt;p&gt;NEVER include in commit messages or PR descriptions:&lt;/p&gt;

&lt;p&gt;[...]
The phrase 'Claude Code' or any mention that you are an AI&lt;br /&gt;
Co-Authored-By lines or any other attribution&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;-- &lt;a href="https://x.com/vedolos/status/2039028274047893798"&gt;via @vedolos&lt;/a&gt;&lt;/p&gt; </description> 
	<pubDate>Wed, 01 Apr 2026 16:36:16 +0000</pubDate>

</item> 
<item>
	<title>Ben Hutchings: FOSS activity in March 2026</title>
	<guid>https://www.decadent.org.uk/ben/blog/2026/04/01/foss-activity-in-march-2026</guid>
	<link>https://www.decadent.org.uk/ben/blog/2026/04/01/foss-activity-in-march-2026.html</link>
     <description>  &lt;img src="http://planet.debian.org/heads/benh.png" width="109" height="100" alt="" align="right" style="float: right;"&gt;  &lt;ul&gt;
  &lt;li&gt;Debian packages:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/firmware-nonfree"&gt;firmware-nonfree&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://bugs.debian.org/src:firmware-nonfree"&gt;Bugs&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/1064620"&gt;#1064620: firmware-nonfree: suggestions for the packaging, gencontrol.py and debian/rules&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/1126797"&gt;#1126797: firmware-intel-graphics: Please ship irci_irci_ecr-master_20161208_0213_20170112_1500.bin as ipu3-fw.bin&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/1131751"&gt;#1131751: ABI break in amdxdna npu firmware&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;Merge requests:
            &lt;ul&gt;
              &lt;li&gt;opened and merged &lt;a href="https://salsa.debian.org/kernel-team/firmware-nonfree/-/merge_requests/140"&gt;!140: Update to 20260309&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;opened and merged &lt;a href="https://salsa.debian.org/kernel-team/firmware-nonfree/-/merge_requests/141"&gt;!141: Clean up packaging (from Nicolas Boulenguez)&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;opened &lt;a href="https://salsa.debian.org/kernel-team/firmware-nonfree/-/merge_requests/142"&gt;!142: Replace copy-firmware.sh; install files and generate metainfo.xml at build time&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/firmware-nonfree/news/"&gt;Uploads&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;uploaded version 20260110-1~bpo13+1 to trixie-backports&lt;/li&gt;
              &lt;li&gt;uploaded version 20260221-1 to unstable&lt;/li&gt;
              &lt;li&gt;uploaded version 20260221-1~bpo13+1 to trixie-backports&lt;/li&gt;
              &lt;li&gt;uploaded version 20260309-1 to unstable&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/hexagon-dsp-binaries"&gt;hexagon-dsp-binaries&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://bugs.debian.org/src:hexagon-dsp-binaries"&gt;Bugs&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;replied to and reassigned &lt;a href="https://bugs.debian.org/1130844"&gt;#1130844: firmware-qcom-soc depends on unavailable package firmware-qcom-dsp&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/initramfs-tools"&gt;initramfs-tools&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;Merge requests:
            &lt;ul&gt;
              &lt;li&gt;merged &lt;a href="https://salsa.debian.org/kernel-team/initramfs-tools/-/merge_requests/172"&gt;!172: Use 3cpio for unmkinitramfs/lsinitramfs if available&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;merged &lt;a href="https://salsa.debian.org/kernel-team/initramfs-tools/-/merge_requests/186"&gt;!186: update-initramfs: support loading post-update hooks from /usr/share/ too&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;merged &lt;a href="https://salsa.debian.org/kernel-team/initramfs-tools/-/merge_requests/190"&gt;!190: autopkgtest: increase timeout to 240s on s390x&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/libtirpc"&gt;libtirpc&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://bugs.debian.org/src:libtirpc"&gt;Bugs&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;replied to and reassigned &lt;a href="https://bugs.debian.org/1132176"&gt;#1132176: rpc.mountd: symbol lookup error: rpc.mountd: undefined symbol: rpc_gss_getcred, version TIRPC_0.3.0&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/libvirt"&gt;libvirt&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://bugs.debian.org/src:libvirt"&gt;Bugs&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;replied to and reassigned &lt;a href="https://bugs.debian.org/1130974"&gt;#1130974: libvirt: Should use nftables for IP masquerading to work with PREEMPT_RT&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/linux"&gt;linux&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://bugs.debian.org/src:linux"&gt;Bugs&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;replied to &lt;a href="https://bugs.debian.org/1128861"&gt;#1128861: linux: when serving NFS, client attempts to lock served files fail with “No locks available”&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;replied to &lt;a href="https://bugs.debian.org/1130656"&gt;#1130656: [grub2] wrong kernel version order&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/1132224"&gt;#1132224: linux: nouveau regression on GK208B/GT 730 after kernel update: artifacts and X crashes&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;Merge requests:
            &lt;ul&gt;
              &lt;li&gt;reviewed &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1842"&gt;!1842: Merge kernel-wedge and use directly&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;reviewed and merged &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1849"&gt;!1849: Cleanup installer&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;merged &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1853"&gt;!1853: [amd64] drivers/platform/x86/uniwill: Enable UNIWILL_LAPTOP as module&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;opened and merged &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1854"&gt;!1854: Fix ordering of kernel version strings for multiple Debian revisions&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;reviewed and closed &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1857"&gt;!1857: crypto: padlock-sha - Disable for Zhaoxin processor&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;opened &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1862"&gt;!1862: Fix regressions in debian/bin/test-patches&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;opened &lt;a href="https://salsa.debian.org/kernel-team/linux/-/merge_requests/1865"&gt;!1865: Draft: hyperv-daemons: Build using upstream Makefile; install hv_fcopy_uio_daemon&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;(LTS) worked on backports to 5.10 and 6.1 of the fixes for
“&lt;a href="https://blog.qualys.com/vulnerabilities-threat-research/2026/03/12/crackarmor-critical-apparmor-flaws-enable-local-privilege-escalation-to-root"&gt;CrackArmor&lt;/a&gt;”
security flaws&lt;/li&gt;
          &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/linux/news/"&gt;Uploads&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;(LTS) uploaded version 5.10.251-1 to bullseye-security&lt;/li&gt;
              &lt;li&gt;uploaded version 6.12.74-2~bpo12+1 to bookworm-backports&lt;/li&gt;
              &lt;li&gt;uploaded version 6.18.15-1~bpo13+1 to trixie-backports&lt;/li&gt;
              &lt;li&gt;uploaded version 6.19.6-2~bpo13+1 to trixie-backports&lt;/li&gt;
              &lt;li&gt;uploaded version 6.19.8-1~bpo13+1 to trixie-backports&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;(LTS) &lt;a href="https://tracker.debian.org/pkg/linux-6.1"&gt;linux-6.1&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/linux-6.1/news/"&gt;Uploads&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;uploaded version 6.1.164-1~deb11u1 to bullseye-security&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/linux-base"&gt;linux-base&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/linux-base/news/"&gt;Uploads&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;uploaded version 4.12.1~bpo12+1 to bookworm-backports&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/sgt-puzzles"&gt;sgt-puzzles&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://bugs.debian.org/src:sgt-puzzles"&gt;Bugs&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/363441"&gt;#363441: It’s too easy to quit&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/550311"&gt;#550311: slant: Please make shading of filled squares configurable&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/1079717"&gt;#1079717: sgt-puzzles: [Mozaic] crashes when copying the game&lt;/a&gt;&lt;/li&gt;
              &lt;li&gt;closed &lt;a href="https://bugs.debian.org/1116973"&gt;#1116973: sgt-puzzles: Loopy Spectres type&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
          &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/sgt-puzzles/news/"&gt;Uploads&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;uploaded version 20250730.a7c7826-1 to unstable&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/wireless-regdb"&gt;wireless-regdb&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://tracker.debian.org/pkg/wireless-regdb/news/"&gt;Uploads&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;(LTS) uploaded version 2026.02.04-1~deb11u1 to bullseye-security&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Debian non-packages:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://salsa.debian.org/kernel-team/kernel-team"&gt;kernel-team&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;added script to show status of all kernel team backports&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline"&gt;pipeline&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/issues/"&gt;Issues&lt;/a&gt;:
            &lt;ul&gt;
              &lt;li&gt;opened &lt;a href="https://salsa.debian.org/salsa-ci-team/pipeline/-/issues/552"&gt;#552: piuparts job fails to install dependencies outside of main&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Mailing lists:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href="https://lists.debian.org/debian-kernel/"&gt;debian-kernel&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;posted and replied to &lt;a href="https://lists.debian.org/85a5f56ec15a212d00e9e6ea8b117467a1ab4b78.camel@decadent.org.uk"&gt;Agenda items for kernel-team meeting on 2026-03-18&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;replied to &lt;a href="https://lists.debian.org/7cfabf67aee21b9e8bc64a777cd4b95e4e1ddf18.camel@decadent.org.uk"&gt;How is “keep two last kernels” policy implemented?&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://lists.debian.org/debian-lts-announce/"&gt;debian-lts-announce&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;posted &lt;a href="https://lists.debian.org/abQNlK3I7kb22ztP@decadent.org.uk"&gt;[SECURITY] [DLA 4498-1] linux security update&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;posted &lt;a href="https://lists.debian.org/abQNrf0ok3F3r0ID@decadent.org.uk"&gt;[SECURITY] [DLA 4499-1] linux-6.1 security update&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;posted &lt;a href="https://lists.debian.org/abWnpdMMHCmuNXXw@decadent.org.uk"&gt;[SECURITY] [DLA 4501-1] wireless-regdb new upstream version&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://lore.kernel.org/linux-bluetooth/"&gt;linux-bluetooth&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;(LTS) replied to &lt;a href="https://lore.kernel.org/linux-bluetooth/249b111f2618ea16b98201dae672b578d501ec4a.camel@decadent.org.uk/T/"&gt;[PATCH v3] Bluetooth: L2CAP: Fix invalid response to L2CAP_ECRED_RECONF_REQ&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://lore.kernel.org/netdev/"&gt;netdev&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;(LTS) replied to &lt;a href="https://lore.kernel.org/netdev/cfbb231e80caceb4138e37d036de7dca39ec7e7b.camel@decadent.org.uk/T/"&gt;[PATCH net v2] net: consume xmit errors of GSO frames&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;&lt;a href="https://lore.kernel.org/stable/"&gt;stable&lt;/a&gt;/&lt;a href="https://lore.kernel.org/patches/"&gt;patches&lt;/a&gt;:
        &lt;ul&gt;
          &lt;li&gt;(LTS) reviewed
&lt;a href="https://lore.kernel.org/stable/992df439ca66e562353d285642c6ab8e1c69e2e6.camel@decadent.org.uk/T/"&gt;5.10.252&lt;/a&gt;
and replied to
&lt;a href="https://lore.kernel.org/stable/f7285cc36ec39c4a6cef633add170518f2e34b3a.camel@decadent.org.uk/T/"&gt;various&lt;/a&gt;
&lt;a href="https://lore.kernel.org/stable/c48bc87973a165e0a944f7a7665338626187b4fd.camel@decadent.org.uk/T/"&gt;patches&lt;/a&gt;
&lt;a href="https://lore.kernel.org/patches/f7f34b5cf1ddd5a880e0ceba52670bb73f2d21e2.camel@decadent.org.uk/T/"&gt;included&lt;/a&gt;
&lt;a href="https://lore.kernel.org/patches/8b929c0ed7884212931668cc77074cbffa2b2d45.camel@decadent.org.uk/T/"&gt;in it&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Wed, 01 Apr 2026 15:30:53 +0000</pubDate>

</item> 
<item>
	<title>Matthew Garrett: Self hosting as much of my online presence as practical</title>
	<guid>https://codon.org.uk/~mjg59/blog/p/self-hosting-as-much-of-my-online-presence-as-practical/</guid>
	<link>https://codon.org.uk/~mjg59/blog/p/self-hosting-as-much-of-my-online-presence-as-practical/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/mjg59.png" width="69" height="85" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;Because I am bad at giving up on things, I’ve been running my own email
server for over 20 years. Some of that time it’s been a PC at the end of a
DSL line, some of that time it’s been a Mac Mini in a data centre, and some
of that time it’s been a hosted VM. Last year I decided to bring it in
house, and since then I’ve been gradually consolidating as much of the rest
of my online presence as possible on it. I mentioned this &lt;a class="link" href="https://nondeterministic.computer/@mjg59/116321518908968091" rel="noopener" target="_blank"&gt;on
Mastodon&lt;/a&gt; and a
couple of people asked for more details, so here we are.&lt;/p&gt;
&lt;p&gt;First: &lt;a class="link" href="https://www.monkeybrains.net/" rel="noopener" target="_blank"&gt;my ISP&lt;/a&gt; doesn’t guarantee a static
IPv4 unless I’m on a business plan and that seems like it’d cost a bunch
more, so I’m doing what I &lt;a class="link" href="https://mjg59.dreamwidth.org/72095.html" rel="noopener" target="_blank"&gt;described
here&lt;/a&gt;: running a Wireguard link
between a box that sits in a cupboard in my living room and the smallest
&lt;a class="link" href="https://us.ovhcloud.com/" rel="noopener" target="_blank"&gt;OVH&lt;/a&gt; instance I can, with an additional IP
address allocated to the VM and NATted over the VPN link. The practical
outcome of this is that my home IP address is irrelevant and can change as
much as it wants - my DNS points at the OVH IP, and traffic to that all ends
up hitting my server.&lt;/p&gt;
&lt;p&gt;The server itself is pretty uninteresting. It’s a refurbished HP EliteDesk
which idles at 10W or so, along 2TB of NVMe and 32GB of RAM that I found
under a pile of laptops in my office. We’re not talking rackmount Xeon
levels of performance, but it’s entirely adequate for everything I’m doing
here.&lt;/p&gt;
&lt;p&gt;So. Let’s talk about the services I’m hosting.&lt;/p&gt;
&lt;h2 id="web"&gt;Web
&lt;/h2&gt;&lt;p&gt;This one’s trivial. I’m not really hosting much of a website right now, but
what there is is served via Apache with a Let’s Encrypt certificate. Nothing
interesting at all here, other than the proxying that’s going to be relevant
later.&lt;/p&gt;
&lt;h2 id="email"&gt;Email
&lt;/h2&gt;&lt;p&gt;Inbound email is easy enough. I’m running Postfix with a pretty stock
configuration, and my MX records point at me. The same Let’s Encrypt
certificate is there for TLS delivery. I’m using Dovecot as an IMAP server
(again with the same cert). You can find plenty of guides on setting this
up.&lt;/p&gt;
&lt;p&gt;Outbound email? That’s harder. I’m on a residential IP address, so if I send
email directly nobody’s going to deliver it. Going via my OVH address isn’t
going to be a lot better. I have a Google Workspace, so in the end I just
made use of &lt;a class="link" href="https://knowledge.workspace.google.com/admin/gmail/advanced/route-outgoing-smtp-relay-messages-through-google" rel="noopener" target="_blank"&gt;Google’s SMTP relay
service&lt;/a&gt;. There’s
various commerical alternatives available, I just chose this one because it
didn’t cost me anything more than I’m already paying.&lt;/p&gt;
&lt;h2 id="blog"&gt;Blog
&lt;/h2&gt;&lt;p&gt;My blog is largely static content generated by
&lt;a class="link" href="https://gohugo.io/" rel="noopener" target="_blank"&gt;Hugo&lt;/a&gt;. Comments are &lt;a class="link" href="https://remark42.com/" rel="noopener" target="_blank"&gt;Remark42&lt;/a&gt;
running in a Docker container. If you don’t want to handle even that level
of dynamic content you can use a third party comment provider like
&lt;a class="link" href="https://disqus.com" rel="noopener" target="_blank"&gt;Disqus&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="mastodon"&gt;Mastodon
&lt;/h2&gt;&lt;p&gt;I’m deploying Mastodon pretty much along the lines of the &lt;a class="link" href="https://github.com/mastodon/mastodon/blob/main/docker-compose.yml" rel="noopener" target="_blank"&gt;upstream compose
file&lt;/a&gt;. Apache
is proxying /api/v1/streaming to the websocket provided by the streaming
container and / to the actual Mastodon service. The only thing I tripped
over for a while was the need to set the “X-Forwarded-Proto” header since
otherwise you get stuck in a redirect loop of Mastodon receiving a request
over http (because TLS termination is being done by the Apache proxy) and
redirecting to https, except that’s where we just came from.&lt;/p&gt;
&lt;p&gt;Mastodon is easily the heaviest part of all of this, using around 5GB of RAM
and 60GB of disk for an instance with 3 users. This is more a point of
principle than an especially good idea.&lt;/p&gt;
&lt;h2 id="bluesky"&gt;Bluesky
&lt;/h2&gt;&lt;p&gt;I’m arguably cheating here. Bluesky’s federation model is quite different to
Mastodon - while running a Mastodon service implies running the webview and
other infrastructure associated with it, Bluesky has split that into
&lt;a class="link" href="https://docs.bsky.app/docs/advanced-guides/federation-architecture" rel="noopener" target="_blank"&gt;multiple
parts&lt;/a&gt;. User
data is stored on Personal Data Servers, then aggregated from those by
Relays, and then displayed on Appviews. Third parties can run any of these,
but a user’s actual posts are stored on a PDS. There are various reasons to
run the others, for instance to implement alternative moderation policies,
but if all you want is to ensure that you have control over your data,
running a PDS is sufficient. I followed &lt;a class="link" href="https://cprimozic.net/notes/posts/notes-on-self-hosting-bluesky-pds-alongside-other-services/" rel="noopener" target="_blank"&gt;these
instructions&lt;/a&gt;,
other than using Apache as the frontend proxy rather than nginx, and it’s
all been working fine since then. In terms of ensuring that my data remains
under my control, it’s sufficient.&lt;/p&gt;
&lt;h2 id="backups"&gt;Backups
&lt;/h2&gt;&lt;p&gt;I’m using &lt;a class="link" href="https://torsion.org/borgmatic/" rel="noopener" target="_blank"&gt;borgmatic&lt;/a&gt;, backing up to a local
Synology NAS and also to my parents’ home (where I have another HP EliteDesk
set up with an equivalent OVH IPv4 fronting setup). At some point I’ll check
that I’m actually able to restore them.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Most of what I post is now stored on a system that’s happily living under a
TV, but is available to the rest of the world just as visibly as if I used a
hosted provider. Is this necessary? No. Does it improve my life? In no
practical way. Does it generate additional complexity? Absolutely. Should
you do it? Oh good heavens no. But you can, and once it’s working it largely
just keeps working, and there’s a certain sense of comfort in knowing that
my online presence is carefully contained in a small box making a gentle
whirring noise.&lt;/p&gt; </description> 
	<pubDate>Wed, 01 Apr 2026 02:35:43 +0000</pubDate>

</item> 
<item>
	<title>Junichi Uekawa: April already.</title>
	<guid>http://www.netfort.gr.jp/~dancer/diary/daily/2026-Apr-1.html.en#2026-Apr-1-08:27:51</guid>
	<link>http://www.netfort.gr.jp/~dancer/diary/daily/2026-Apr-1.html.en#2026-Apr-1-08:27:51</link>
     <description>  &lt;img src="http://planet.debian.org/heads/dancer.png" width="75" height="97" alt="" align="right" style="float: right;"&gt;  April already. Wondering how bazel update is going in Debian. Seems like a large undertaking.
        &lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Tue, 31 Mar 2026 23:27:51 +0000</pubDate>

</item> 
<item>
	<title>Benjamin Mako Hill: Quote #75514</title>
	<guid>https://mako.cc/copyrighteous/?p=3356</guid>
	<link>https://mako.cc/copyrighteous/quote-75514</link>
     <description>  &lt;img src="http://planet.debian.org/heads/mako.gif" width="65" height="93" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;Although I never submitted to it, I made several appearances in the now-defunct quote database on bash.org (QDB). I’m dealing with a broken keyboard now, and went to dig hard to find &lt;a href="https://web.archive.org/web/20221210050632/http://bash.org/?75514"&gt;this classic in the Wayback machine&lt;/a&gt;. I thought I would put it back on the web:&lt;/p&gt;



&lt;pre class="wp-block-code"&gt;&lt;code&gt;&lt;p class="quote"&gt;&amp;lt;mako&amp;gt; my letter "eye" stopped worng
&amp;lt;luca&amp;gt; k, too?
&amp;lt;mako&amp;gt; yeah
&amp;lt;luca&amp;gt; sounds like a mountain dew spill
&amp;lt;mako&amp;gt; and comma
&amp;lt;mako&amp;gt; those three
&amp;lt;mako&amp;gt; ths s horrble
&amp;lt;luca&amp;gt; tme for a new eyboard
&amp;lt;luca&amp;gt; 've successfully taen my eyboard apart and fxed t by cleanng t wth alcohol
&amp;lt;mako&amp;gt; stop mang fun of me
&amp;lt;mako&amp;gt; ths s a laptop!&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;It was, in fact, horrble.&lt;/p&gt;



&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Tue, 31 Mar 2026 21:13:00 +0000</pubDate>

</item> 
<item>
	<title>C.J. Collier: Finding: Promoting SeaBIOS Cloud Images to UEFI Secure Boot (Proxmox)</title>
	<guid>https://wp.c9h.org/cj/?p=2133</guid>
	<link>https://wp.c9h.org/cj/?p=2133</link>
     <description>  &lt;img src="http://planet.debian.org/heads/cj.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;h2 id="discovery"&gt;Discovery&lt;/h2&gt;
&lt;p&gt;Legacy cloud templates often lack the partitioning and bootloader&lt;br /&gt;
binaries required for UEFI Secure Boot. Attempting to switch such a VM&lt;br /&gt;
to OVMF in Proxmox results in “not a bootable disk.” We discovered that&lt;br /&gt;
a surgical promotion is possible by manipulating the block device and&lt;br /&gt;
EFI variables from the hypervisor.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;ol type="1"&gt;
&lt;li&gt;&lt;strong&gt;Protective MBR Flags:&lt;/strong&gt; Legacy installers often set&lt;br /&gt;
the &lt;code&gt;pmbr_boot&lt;/code&gt; flag on the GPT’s protective MBR. Strict UEFI&lt;br /&gt;
implementations (OVMF) will ignore the GPT if this flag is present.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing ESP:&lt;/strong&gt; Cloud images often lack a FAT32 EFI&lt;br /&gt;
System Partition (ESP).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variable Store:&lt;/strong&gt; A fresh Proxmox&lt;br /&gt;
&lt;code&gt;efidisk0&lt;/code&gt; is empty and lacks both the trust certificates&lt;br /&gt;
(PK/KEK/db) and the BootOrder entries required for an automated&lt;br /&gt;
boot.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-promotion-rule"&gt;The “Promotion” Rule&lt;/h2&gt;
&lt;p&gt;To upgrade a SeaBIOS VM to Secure Boot without a full OS reinstall:&lt;br /&gt;
1. &lt;strong&gt;Surgical Partitioning:&lt;/strong&gt; Map the disk on the host and&lt;br /&gt;
add a FAT32 partition (Type &lt;code&gt;EF00&lt;/code&gt;). Clear the&lt;br /&gt;
&lt;code&gt;pmbr_boot&lt;/code&gt; flag from the MBR. 2. &lt;strong&gt;Binary&lt;br /&gt;
Preparation:&lt;/strong&gt; Boot the VM in SeaBIOS mode to install&lt;br /&gt;
&lt;code&gt;shim&lt;/code&gt; and &lt;code&gt;grub-efi&lt;/code&gt; packages. Use&lt;br /&gt;
&lt;code&gt;grub2-mkconfig&lt;/code&gt; to populate the new ESP. 3. &lt;strong&gt;Trust&lt;br /&gt;
Injection:&lt;/strong&gt; Use the &lt;code&gt;virt-fw-vars&lt;/code&gt; utility on the&lt;br /&gt;
hypervisor to programmatically enroll the Red Hat/Microsoft CA keys and&lt;br /&gt;
any custom certificates (e.g., FreeIPA CA) into the VM’s&lt;br /&gt;
&lt;code&gt;efidisk&lt;/code&gt;. 4. &lt;strong&gt;Boot Pinning:&lt;/strong&gt; Explicitly set&lt;br /&gt;
the UEFI &lt;code&gt;BootOrder&lt;/code&gt; to point to the &lt;code&gt;shimx64.efi&lt;/code&gt;&lt;br /&gt;
path via &lt;code&gt;virt-fw-vars --append-boot-filepath&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="solution-example-command-sequence"&gt;Solution (Example Command&lt;br /&gt;
Sequence)&lt;/h2&gt;
&lt;p&gt;On the Proxmox Host (&lt;code&gt;root&lt;/code&gt;):&lt;/p&gt;
&lt;div class="sourceCode" id="cb1"&gt;
&lt;pre class="sourceCode bash"&gt;&lt;code class="sourceCode bash"&gt;&lt;span id="cb1-1"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-1" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;# Map and Clean MBR&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-2"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-2" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="va"&gt;DEV&lt;/span&gt;&lt;span class="op"&gt;=&lt;/span&gt;&lt;span class="va"&gt;$(&lt;/span&gt;&lt;span class="ex"&gt;rbd&lt;/span&gt; map pool/disk&lt;span class="va"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-3"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-3" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="ex"&gt;parted&lt;/span&gt; &lt;span class="at"&gt;-s&lt;/span&gt; &lt;span class="va"&gt;$DEV&lt;/span&gt; disk_set pmbr_boot off&lt;/span&gt;
&lt;span id="cb1-4"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-4" tabindex="-1"&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id="cb1-5"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-5" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="co"&gt;# Inject Trust and Boot Path (VM must be stopped)&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-6"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-6" tabindex="-1"&gt;&lt;/a&gt;&lt;span class="ex"&gt;virt-fw-vars&lt;/span&gt; &lt;span class="at"&gt;--inplace&lt;/span&gt; /dev/rbd/mapped_efidisk &lt;span class="dt"&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-7"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-7" tabindex="-1"&gt;&lt;/a&gt;  &lt;span class="at"&gt;--enroll-redhat&lt;/span&gt; &lt;span class="dt"&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-8"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-8" tabindex="-1"&gt;&lt;/a&gt;  &lt;span class="at"&gt;--add-db&lt;/span&gt; &lt;span class="op"&gt;&amp;lt;&lt;/span&gt;GUID&lt;span class="op"&gt;&amp;gt;&lt;/span&gt; /path/to/ipa-ca.crt &lt;span class="dt"&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-9"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-9" tabindex="-1"&gt;&lt;/a&gt;  &lt;span class="at"&gt;--append-boot-filepath&lt;/span&gt; &lt;span class="st"&gt;'\EFI\centos\shimx64.efi'&lt;/span&gt; &lt;span class="dt"&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id="cb1-10"&gt;&lt;a href="https://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#cb1-10" tabindex="-1"&gt;&lt;/a&gt;  &lt;span class="at"&gt;--sb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This workflow enables high-integrity Secure Boot environments using&lt;br /&gt;
existing SeaBIOS infrastructure templates.&lt;/p&gt;

&lt;div class="twitter-share"&gt;&lt;a class="twitter-share-button" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fwp.c9h.org%2Fcj%2F%3Fp%3D2133&amp;amp;via=cjamescollier"&gt;Tweet&lt;/a&gt;&lt;/div&gt; </description> 
	<pubDate>Tue, 31 Mar 2026 21:03:24 +0000</pubDate>

</item> 
<item>
	<title>Thomas Lange: FAIme using apt-cacher-ng</title>
	<guid>http://blog.fai-project.org/posts/acng/</guid>
	<link>http://blog.fai-project.org/posts/acng/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/mrfai.png" width="76" height="100" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;The &lt;a href="https://fai-project.org/FAIme"&gt;FAI.me service&lt;/a&gt;
has become faster over the past two months.&lt;/p&gt;

&lt;p&gt;First, the tool fai-mirror can now download all packages
in one go (with all their dependencies) instead of downloading one by
one. This helped a lot for the Linux Mint ISO because it uses a long
list of packages.&lt;/p&gt;

&lt;p&gt;I've also added a local apt cache (using &lt;a href="https://www.unix-ag.uni-kl.de/~bloch/acng/"&gt;apt-cacher-ng&lt;/a&gt;),
so the network speed does not matter any more in most cases.
This led to the following improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux Mint install ISOs went from around 6-7 min to now only 2min.&lt;/li&gt;
&lt;li&gt;Ubuntu install ISO went from average 3min to around 90 seconds.&lt;/li&gt;
&lt;li&gt;The average time for a Debian Linux install ISO dropped from 2min
to 40 seconds.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;So far we only had once a problem with apt-cacher-ng, because the
underlying partition was full.&lt;/p&gt;

&lt;p&gt;Building cloud and live images do not gain that much from the local
package cache, because most time is spend in extracting and installing
the packages.&lt;/p&gt; </description> 
	<pubDate>Tue, 31 Mar 2026 12:56:45 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: Code Blue—Emergency</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/0-7653-0663-8a.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/0-7653-0663-8a.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;Code Blue—Emergency&lt;/cite&gt;, by James White&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Series:&lt;/td&gt;
    &lt;td&gt;Sector General #7&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;Orb&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;1987&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Printing:&lt;/td&gt;
    &lt;td&gt;May 2003&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;0-7653-0663-8&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Trade paperback&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;252&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
&lt;cite&gt;Code Blue—Emergency&lt;/cite&gt; (annoying em-dash in original title) is the
seventh book of James White's Sector General science fiction series about
a vast multi-species hospital station. While there are some references to
(and spoilers for) earlier books in the series, you don't have to remember
the previous books to read this one. I had no trouble despite a nine-year
gap.
&lt;/p&gt;

&lt;p&gt;
I read this as part of the Orb &lt;cite&gt;General Practice&lt;/cite&gt; omnibus, which
collects this novel and &lt;cite&gt;The Genocidal Healer&lt;/cite&gt;.
&lt;/p&gt;

&lt;p&gt;
Cha Thrat is a Sommaradvan warrior-surgeon, member of a newly-discovered
species that is beginning the process of contact with the Federation. She
saved a Monitor corps human after an accident on her world, performing
some some highly competent surgery on a species she had never seen before.
That plus her somewhat outcast status on her own world due to her very
traditional attitude towards medical ethics led Sector General to extend
an offer of medical internship, and led her to leap into the unknown by
accepting. This may have been a mistake; there is a great deal that Sector
General does not understand about Sommaradvan medical ethics.
&lt;/p&gt;

&lt;p&gt;
This series entry is another proper (if somewhat episodic) novel and the
first book of the series that doesn't primarily focus on Conway. He makes
an appearance in his new role as Diagnostician, but only as a supporting
character. &lt;cite&gt;Code Blue—Emergency&lt;/cite&gt; is told in the tight third-person
perspective of Cha Thrat, an alien who finds many things about Sector
General baffling, confusing, and ethically troubling (and who therefore
provides a good reader surrogate for reintroducing the basics of how the
hospital works).
&lt;/p&gt;

&lt;p&gt;
Using an alien viewpoint is a more sophisticated narrative technique than
White has used previously. I'm glad he tried it, and it mostly works,
although I have some complaints. Cha Thrat comes from the middle caste of
a strictly hierarchical society of three castes, but is also immensely
stubborn and used to a medical system in which doctors take sole
responsibility for their patients. This creates a lot of cultural
conflicts, and I do enjoy science fiction where the human attitudes are
portrayed as the strange ones, but the cultural analysis offered by this
novel is not very deep.
&lt;/p&gt;

&lt;p&gt;
The pattern of this book is for Cha Thrat to stumble into a successful
approach to a problem while being either oblivious to or hostile to the
normal hierarchical structure expected of medical trainees. This is
believable as far as it goes. She is a skilled and intelligent doctor with
some good instincts and a strong commitment to patient care, but is also
culturally inclined to not ask for help. It makes sense for that to be a
serious problem in a hospital. Unfortunately, no one says this directly.
Sector General staff get quite upset in ways that seem more territorial
than oriented towards patient safety, no one directly explains to Cha
Thrat why following a process is important or shows examples of what could
go wrong, and plot armor means that her mistakes usually have positive
outcomes. One can extrapolate the reasons why she is not a good medical
student, but the reader is forced to do the extrapolation.
&lt;/p&gt;

&lt;p&gt;
This is the sort of book where the narration makes clear there are
unresolved cultural clashes that are going to cause problems but hides the
details. To Cha Thrat, her perspective is so obvious she never bothers to
explain it to the reader, so the specifics come as a surprise. As with the
alien perspective, I've seen this technique used with more subtlety and
sophistication in other books, but White's version mostly works. Cha Thrat
is a sympathetic protagonist because she is truly trying to take the most
ethical and empathetic action in every situation and is clearly competent.
Most of my frustration as a reader, ironically, lands on the other Sector
General doctors who seem to make little to no effort to understand her
perspective when she fails to conform to their expectations. This is
believable in the abstract, but the whole point of Sector General is that
they're supposed to be wiser about interspecies difference than this.
&lt;/p&gt;

&lt;p&gt;
Also, sometimes their reactions just seem petty. Cha Thrat has a very
hierarchical concept of medicine that matches the social classes of her
culture. For her, the highest tier of doctor are wizards who treat rulers,
because the work of rulers is mostly mental and intellectual and therefore
the diseases of rulers are treated with magic spells performed with words
to reshape their thinking rather than surgery on their bodies. O'Mara and
the other Sector General psychologists take great offense at this,
muttering about being called witch doctors, which I found completely
absurd. This is a comprehensible, if odd, description of psychology from a
wholly alien species. Surely one's first reaction should be that words
like "wizard" or "magic" are translation errors. Don't get offended; look
to see if the underlying substance matches, which it clearly does.
&lt;/p&gt;

&lt;p&gt;
Apart from cultural and psychological clashes, &lt;cite&gt;Code Blue—Emergency&lt;/cite&gt;
has the standard episodic Sector General structure of interesting medical
mysteries that require lateral thinking. I find this sort of puzzle story
satisfying, particularly given the firm belief of every character in an
essentially pacifist and empathetic approach to even the most alien of
creatures. This determined non-violence is one of the more interesting
things about this series, and it continues here.
&lt;/p&gt;

&lt;p&gt;
White does tend towards both biological and gender essentialism for
everyone other than the protagonist and main supporting characters, but he
seemed to be walking back some of the more outrageous limitations on women
that appeared in previous books. There is still some nonsense in here
about how females of any species can't be Diagnosticians, but then Cha
Thrat, who is female, seems to violate the justification for that rule
over the course of this novel (sadly without comment). Perhaps he's
setting up for proving Sector General wrong about this prejudice.
&lt;/p&gt;

&lt;p&gt;
I picked this up after reading Elizabeth Bear's &lt;a href="https://www.eyrie.org/~eagle/reviews/books/1-5344-0303-5.html"&gt;&lt;cite&gt;Machine&lt;/cite&gt;&lt;/a&gt;, which is essentially a (better written) Sector General
novel that got me in the mood for reading more. I wouldn't give &lt;cite&gt;Code
Blue—Emergency&lt;/cite&gt; any awards, but it delivered exactly what I was looking
for. This series is not as deep or well-written as some more recent SF,
but it is reliably itself and reliably entertaining. There are worse
things in a series. Recommended if you're in the mood for alien &lt;cite&gt;ER&lt;/cite&gt;
in space.
&lt;/p&gt;

&lt;p&gt;
The omnibus edition that I read has an introduction to both novels by John
Clute. It does add some interesting insights, but (as is somewhat typical
for Clute) it also spoils parts of both books. You may want to read it
after you read the novels.
&lt;/p&gt;

&lt;p&gt;
Followed by &lt;cite&gt;The Genocidal Healer&lt;/cite&gt;.
&lt;/p&gt;

&lt;p&gt;Rating: 7 out of 10&lt;/p&gt; </description> 
	<pubDate>Tue, 31 Mar 2026 03:08:00 +0000</pubDate>

</item> 
<item>
	<title>Jamie McClelland: Mailman3 has 2 databases. Whoops.</title>
	<guid>https://current.workingdirectory.net/posts/2026/mailman3-migration/</guid>
	<link>https://current.workingdirectory.net/posts/2026/mailman3-migration/</link>
     <description>  &lt;p&gt;At &lt;a href="https://mayfirst.coop/"&gt;May First&lt;/a&gt; we have been carefully planning our
migration of about 1200 lists from mailman2 to mailman3 for almost six months
now. We did a lot of user communications, had several months of beta testing
with a handful of lists ported over, and everything was looking good. So we
kicked off the migration!&lt;/p&gt;
&lt;p&gt;But, about 15% of the way through I started seeing sqlite lock errors. Wait,
what? I carefully re-configured mailman3 to use postgres, not sqlite. Well,
yes, but apparently that was for the database managing the email list
configuration, not the database powering the django web app, which,
incidentally, also includes hundresds of gigabytes of archives. In other words,
the one we &lt;em&gt;really&lt;/em&gt; need in postgres, not sqlite.&lt;/p&gt;
&lt;h2 id="moving-from-sqlite-to-postgres"&gt;Moving from sqlite to postgres&lt;/h2&gt;
&lt;p&gt;Well that sucks. We immediately stopped the migration to deal with this.&lt;/p&gt;
&lt;p&gt;I noticed that the web is full of useful django instructions on how to migrate
your database from one database to antoher. However, if you read the fine
print, those convenient looking “&lt;code&gt;dumpdata&lt;/code&gt; &lt;code&gt;loaddata&lt;/code&gt;” workflows are designed
to move the table definitions and a small amount of data. In our case, even
after just 15% of our lists moved, our sqlite database was about 30GB.&lt;/p&gt;
&lt;p&gt;I considered some of the hacks to manage memory and try to run this via django,
but eventually decided that &lt;a href="https://pgloader.io/"&gt;pgloader&lt;/a&gt; was a more robust
option. This option also allowed me to more easily test things out on a copy of
our sqlite database (made while mailman was turned off). This way I could
migrate and re-migrate the sqlite database over and over without impacting our
live installation until I was satisfied it was all working.&lt;/p&gt;
&lt;p&gt;My first decision was to opt out of pgloader’s schema creation. I used django’s
schema creation tool by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Turning off mailman3 and mailman3-web and changing the mailman web
configuration to use the new postgresql database.&lt;/li&gt;
&lt;li&gt;Running &lt;code&gt;mailman-web migrate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Changing the mailman web configuration back to sqlite and starting
everything again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: I tried just adding new database settings in the mailman web
configuration indexed to ’new’ - django has the ability to define different
databases by name, then you can run &lt;code&gt;mailman-web migrate --database new&lt;/code&gt;. But,
during the migration, I caught django querying the sqlite database for some
migrations that required referencing existing fields (specifically hyperkitty’s
&lt;code&gt;0003_thread_starting_email&lt;/code&gt;). I didn’t want any of these steps to touch the
live database so I opted for the cleaner approach.&lt;/p&gt;
&lt;p&gt;Once I had a clean postgres schema, I dumped it so I could easily return to
this spot.&lt;/p&gt;
&lt;p&gt;Next I started working on our &lt;code&gt;pgloader&lt;/code&gt; load file. After a lot of trial and
error, I ended with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;LOAD&lt;/span&gt; &lt;span class="n"&gt;DATABASE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sqlite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;///&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sqlite&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;migration&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman3web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;postgresql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;mailmanweb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xxxxxxxxxxx&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailmanweb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;reset&lt;/span&gt; &lt;span class="n"&gt;sequences&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;disable&lt;/span&gt; &lt;span class="n"&gt;triggers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;tables&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;MB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;prefetch&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;workers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;concurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;work_mem&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="s1"&gt;'64MB'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;maintenance_work_mem&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="s1"&gt;'512MB'&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CAST&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="ne"&gt;int&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;tinyint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;varchar&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;characters&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The batch, prefetch, workers and concurreny settings are all there to ensure
memory doesn’t blow up.&lt;/p&gt;
&lt;p&gt;I also discovered that I had to make some changes to the schema before loading
data. Mostly truncating tables that the django migrate command populated to
avoid duplicate key errors:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-zed"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;TRUNCATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;django_migrations&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;TRUNCATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;django_content_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;TRUNCATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auth_permission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&lt;/span&gt;&lt;span class="n"&gt;TRUNCATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;django_site&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And also, I had to change a column type. Apparently the mailman import process
allowed an attachment file name that exceeds the limit for postgres, but was
allowed into sqlite:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ALTER TABLE hyperkitty_attachment ALTER COLUMN name TYPE text
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When &lt;code&gt;pgloader&lt;/code&gt; runs, we still get a lot of warnings from pgloader, which wants
to cast columns differently than django does. These are harmless (I was able to
import the data without a problem).&lt;/p&gt;
&lt;p&gt;And there are still a lot of warnings along the lines of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2026-03-30T14:08:01.691990Z WARNING PostgreSQL warning: constraint “hyperkitty_vote_email_id_73a50f4d_fk_hyperkitty_email_id” of relation “hyperkitty_vote” does not exist, skipping&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;These are harmless as well. They appear because &lt;code&gt;disable triggers&lt;/code&gt; disables
foreign key constraints. Without it, we wouldn’t be able to load tables that
require values in tables that have not yet been populated.&lt;/p&gt;
&lt;p&gt;After all the tweaking, the import of our 30GB sqlite database took about 40
minutes.&lt;/p&gt;
&lt;h2 id="final-steps"&gt;Final Steps&lt;/h2&gt;
&lt;p&gt;I think the &lt;code&gt;reset sequences&lt;/code&gt; from &lt;code&gt;pgloader&lt;/code&gt; should take care of this, but just in case:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mailman-web sqlsequencereset hyperkitty mailman_django auth | mailman-web dbshell
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And, just to ensure postgres is optimized, run this in the psql shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="chroma" tabindex="0"&gt;&lt;code class="language-fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ANALYZE VERBOSE;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="last-thoughts"&gt;Last thoughts&lt;/h2&gt;
&lt;p&gt;I understand very well all the decisions the mailman3 devs made in designing
the next version of mailman, and if I was in the same place I may have made
them the same ones. For example, separating the code running the mailing list
from the code managing the archives and the web interface makes perfectly good
sense - many people might want to run just the mailing list part without a web
interface. And building the web interface in django makes a lot of sense as
well - why re-invent the wheel? I’m sure a lot of time and effort was saved by
simply using the built in features you get for free with django.&lt;/p&gt;
&lt;p&gt;But the unfortunate consequence of these decisions is that sys admins have a
much harder time. Almost everyone wants the email lists along with the web
interface and the archives. But nobody wants two different configuration files
with different syntaxes and logic, not to mention two different command lines
to use for maintenance and configuration with completely different APIs. Trying
to understand how to change a default template or set list defaults requires a
lot of research and usually you have to write a python script to do it.&lt;/p&gt;
&lt;p&gt;I have finally come to the conclusion that mailman2 is designed for sys admins,
while mailman3 is designed for developers.&lt;/p&gt;
&lt;p&gt;Despite these short comings, I am impressed with the community and their quick
and friendly responses to the questions of a confused sys admin. That might be
more valuable than anything else.&lt;/p&gt; </description> 
	<pubDate>Mon, 30 Mar 2026 12:27:10 +0000</pubDate>

</item> 
<item>
	<title>Utkarsh Gupta: FOSS Activites in March 2026</title>
	<guid>https://utkarsh2102.org/posts/foss-in-march-26/</guid>
	<link>https://utkarsh2102.org/posts/foss-in-march-26/</link>
     <description>  &lt;p&gt;Here’s my monthly but brief update about the activities I’ve done in the FOSS world.&lt;/p&gt;
&lt;h2 id="debian"&gt;Debian&lt;/h2&gt;
&lt;figure&gt;
&lt;img src="https://utkarsh2102.org/images/debian-logo-small.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;Whilst I didn’t get a chance to do much, here are still a few things that I worked on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A quick exchange with Xavier about node-lodash fixes for stable releases.&lt;/li&gt;
&lt;li&gt;Uploaded ruby-rack to CVE-2026-25500 &amp;amp; CVE-2026-22860 to sid, trixie, and bookworm.&lt;/li&gt;
&lt;li&gt;Started to work on the DebConf Bursary team along with PEB.&lt;/li&gt;
&lt;li&gt;Assited a few folks in getting their patches submitted via Salsa.&lt;/li&gt;
&lt;li&gt;Mentoring for newcomers.&lt;/li&gt;
&lt;li&gt;Moderation of -project mailing list.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="ubuntu"&gt;Ubuntu&lt;/h2&gt;
&lt;figure&gt;
&lt;img src="https://utkarsh2102.org/images/ubuntu-logo-small.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;I joined &lt;a href="https://utkarsh2102.org/posts/hello-canonical/"&gt;Canonical to work on Ubuntu full-time&lt;/a&gt; back in February 2021.&lt;/p&gt;
&lt;p&gt;Whilst I can’t give a full, detailed list of things I did, here’s a quick TL;DR of what I did:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Successfully released &lt;a href="https://discourse.ubuntu.com/t/ubuntu-26-04-lts-resolute-raccoon-beta-released/79205"&gt;26.04 LTS Beta&lt;/a&gt;!
&lt;ul&gt;
&lt;li&gt;This one was also done without the ISO tracker and cdimage access.&lt;/li&gt;
&lt;li&gt;We also worked very hard to build and promote all the image in due time.&lt;/li&gt;
&lt;li&gt;This was the first proper milestone with the Test Observer.&lt;/li&gt;
&lt;li&gt;We also did a retrospective: &lt;a href="https://discourse.ubuntu.com/t/26-04-beta-tests-ubuntu-com-retrospective/79853"&gt;https://discourse.ubuntu.com/t/26-04-beta-tests-ubuntu-com-retrospective/79853&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Worked further on the whole artifact signing story for cdimage.&lt;/li&gt;
&lt;li&gt;Assisted a bunch of folks with my Archive Admin and Release team hats to:
&lt;ul&gt;
&lt;li&gt;Review and grant FFes.&lt;/li&gt;
&lt;li&gt;Coordinating weekly syncs.&lt;/li&gt;
&lt;li&gt;Promoting/demoting binaries to/from main.&lt;/li&gt;
&lt;li&gt;Taking care of package removals and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Was pretty occupied with the new release processs architecture and design.&lt;/li&gt;
&lt;li&gt;Preparing for the 26.04 LTS final release.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id="debian-elts"&gt;Debian (E)LTS&lt;/h2&gt;
&lt;figure&gt;
&lt;img src="https://utkarsh2102.org/images/debian-lts-small.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;This month I have worked 50 hours
on &lt;a href="https://www.freexian.com/lts/debian/"&gt;Debian Long Term Support (LTS)&lt;/a&gt;
and on its sister &lt;a href="https://www.freexian.com/lts/extended/"&gt;Extended LTS&lt;/a&gt;
project and did the following things:&lt;/p&gt;
&lt;h3 id="released-security-updates"&gt;Released Security Updates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;libvirt&lt;/strong&gt;: Regression introduced by the linux kernel update via DLA 4404-1.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed the regression (Debian bug #1124549) via &lt;a href="https://tracker.debian.org/news/1732303/accepted-libvirt-700-3deb11u4-source-into-oldoldstable-security/"&gt;&lt;strong&gt;7.0.0-3+deb11u4&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4504-1"&gt;&lt;strong&gt;DLA 4504-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ruby-rack&lt;/strong&gt;: Path traversal and stored XSS vulnerabilities in directory handling.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-22860"&gt;CVE-2026-22860&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-25500"&gt;CVE-2026-25500&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1733701/accepted-ruby-rack-214-3deb11u5-source-into-oldoldstable-security/"&gt;&lt;strong&gt;2.1.4-3+deb11u5&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4505-1"&gt;&lt;strong&gt;DLA 4505-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[bookworm]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-22860"&gt;CVE-2026-22860&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-25500"&gt;CVE-2026-25500&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1735337/accepted-ruby-rack-2222-0deb12u1-source-into-oldstable-security/"&gt;&lt;strong&gt;2.2.2-0+deb12u1&lt;/strong&gt;&lt;/a&gt; for bookworm. This has been uploaded to oldstable-security and announced as &lt;a href="https://lists.debian.org/debian-security-announce/2026/msg00089.html"&gt;&lt;strong&gt;DSA 6180-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[trixie]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-22860"&gt;CVE-2026-22860&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-25500"&gt;CVE-2026-25500&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1735338/accepted-ruby-rack-3120-0deb13u1-source-into-stable-security/"&gt;&lt;strong&gt;3.1.2-0+deb13u1&lt;/strong&gt;&lt;/a&gt; for trixie. This has been uploaded to stable-security and announced as &lt;a href="https://lists.debian.org/debian-security-announce/2026/msg00089.html"&gt;&lt;strong&gt;DSA 6180-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vlc&lt;/strong&gt;: Out-of-bounds read and denial of service via a crafted MMS server response.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2025-51602"&gt;CVE-2025-51602&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1733900/accepted-vlc-3023-0deb11u1-source-into-oldoldstable-security/"&gt;&lt;strong&gt;3.0.23-0+deb11u1&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4507-1"&gt;&lt;strong&gt;DLA 4507-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ELTS]&lt;/strong&gt;: The 3.0.23 backport is ready but still in testing. Will be released in April.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;nss&lt;/strong&gt;: Integer overflow in the AES-GCM implementation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2781"&gt;CVE-2026-2781&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1734200/accepted-nss-3611deb11u5-source-into-oldoldstable-security/"&gt;&lt;strong&gt;2:3.61-1+deb11u5&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4508-1"&gt;&lt;strong&gt;DLA 4508-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;gst-plugins-base1.0&lt;/strong&gt;: Integer overflow in the RIFF parser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2921"&gt;CVE-2026-2921&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1734600/accepted-gst-plugins-base10-1184-2deb11u5-source-into-oldoldstable-security/"&gt;&lt;strong&gt;1.18.4-2+deb11u5&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4514-1"&gt;&lt;strong&gt;DLA 4514-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ELTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2921"&gt;CVE-2026-2921&lt;/a&gt; via &lt;strong&gt;1.14.4-2+deb10u6&lt;/strong&gt; for buster and &lt;strong&gt;1.10.4-1+deb9u7&lt;/strong&gt; for stretch. This has been released as &lt;a href="https://www.freexian.com/lts/extended/updates/ela-1669-1-gst-plugins-base1.0/"&gt;&lt;strong&gt;ELA 1669-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;gst-plugins-ugly1.0&lt;/strong&gt;: Heap-based buffer overflow and out-of-bounds write in media demuxers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2920"&gt;CVE-2026-2920&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2922"&gt;CVE-2026-2922&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1734700/accepted-gst-plugins-ugly10-1184-2deb11u2-source-into-oldoldstable-security/"&gt;&lt;strong&gt;1.18.4-2+deb11u2&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4516-1"&gt;&lt;strong&gt;DLA 4516-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ELTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2920"&gt;CVE-2026-2920&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-2922"&gt;CVE-2026-2922&lt;/a&gt; via &lt;strong&gt;1.14.4-1+deb10u3&lt;/strong&gt; for buster and &lt;strong&gt;1.10.4-1+deb9u3&lt;/strong&gt; for stretch. This has been released as &lt;a href="https://www.freexian.com/lts/extended/updates/ela-1670-1-gst-plugins-ugly1.0/"&gt;&lt;strong&gt;ELA 1670-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;phpseclib&lt;/strong&gt;: Name confusion in X.509 certificate verification and a padding oracle timing attack in AES-CBC.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2023-52892"&gt;CVE-2023-52892&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-32935"&gt;CVE-2026-32935&lt;/a&gt; via &lt;a href="https://tracker.debian.org/news/1734900/accepted-phpseclib-1019-3deb11u3-source-into-oldoldstable-security/"&gt;&lt;strong&gt;1.0.19-3+deb11u3&lt;/strong&gt;&lt;/a&gt; for bullseye. This has been released as &lt;a href="https://www.debian.org/lts/security/2026/DLA-4518-1"&gt;&lt;strong&gt;DLA 4518-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ELTS]&lt;/strong&gt;: Fixed &lt;a href="https://security-tracker.debian.org/tracker/CVE-2023-52892"&gt;CVE-2023-52892&lt;/a&gt; and &lt;a href="https://security-tracker.debian.org/tracker/CVE-2026-32935"&gt;CVE-2026-32935&lt;/a&gt; via &lt;strong&gt;1.0.19-3~deb10u4&lt;/strong&gt; for buster. This has been released as &lt;a href="https://www.freexian.com/lts/extended/updates/ela-1671-1-phpseclib/"&gt;&lt;strong&gt;ELA 1671-1&lt;/strong&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="work-in-progress"&gt;Work in Progress&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;knot-resolver&lt;/strong&gt;: Affected by CVE-2023-26249, CVE-2023-46317, and CVE-2022-40188, leading to Denial of Service.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: Still in back and forth discussion with maintainers on the best way to proceed for the bullseye upload. Git repository for bullseye: &lt;a href="https://salsa.debian.org/lts-team/packages/knot-resolver/-/tree/debian/bullseye"&gt;https://salsa.debian.org/lts-team/packages/knot-resolver/-/tree/debian/bullseye&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;node-lodash&lt;/strong&gt;: Affected by &lt;a href="https://security-tracker.debian.org/tracker/CVE-2025-13465"&gt;CVE-2025-13465&lt;/a&gt;, prototype pollution in the &lt;code&gt;baseUnset&lt;/code&gt; function.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[stable]&lt;/strong&gt;: Xavier from the JS team ACK’d the patch. The trixie and bookworm uploads will follow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: The bullseye test and upload will follow in April once the stable uploads are in and ACK’d by the SRMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vlc&lt;/strong&gt;: Affected by CVE-2025-51602, an out-of-bounds read and denial of service via a crafted 0x01 response from an MMS server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[LTS]&lt;/strong&gt;: 3.0.23 backport is ready but not tested. I’ll get this over the line in March.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[ELTS]&lt;/strong&gt;: 3.0.23 backport is ready but not very clean. Would like to complete LTS and get back to this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-activities"&gt;Other Activities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[ELTS]&lt;/strong&gt; Continued to review ruby-rack for ELTS – it has since received about 13 new CVEs, making it even more chaotic. Might consider releasing in batches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[E/LTS]&lt;/strong&gt; Monitored discussions on mailing lists, IRC, and all the documentation updates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[E/LTS]&lt;/strong&gt; Attended the monthly LTS meeting on IRC. &lt;a href="https://meetbot.debian.net/debian-lts/2026/debian-lts.2026-03-26-14.00.html"&gt;Summary here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[Other]&lt;/strong&gt; Spent quite some time debugging a bug in debusine. Filed &lt;a href="https://salsa.debian.org/freexian-team/debusine/-/issues/1412"&gt;https://salsa.debian.org/freexian-team/debusine/-/issues/1412&lt;/a&gt; for the same. Have worked on a preliminary patch but would like to submit something for Colin to review. Will follow up in April.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Until next time.&lt;br /&gt;
&lt;code&gt;:wq&lt;/code&gt; for today.&lt;/p&gt; </description> 
	<pubDate>Mon, 30 Mar 2026 05:41:11 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: The Cloak and Its Wizard</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/1-917849-15-X.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/1-917849-15-X.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;The Cloak and Its Wizard&lt;/cite&gt;, by R.Z. Nicolet&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;UpLit Press&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;February 2026&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;1-917849-15-X&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Kindle&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;423&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
&lt;cite&gt;The Cloak and Its Wizard&lt;/cite&gt; is a standalone (at least so far) urban
fantasy superhero (sort of) novel. R.Z. Nicolet is the marketing pseudonym
for Rachel Reddick. This is her first novel.
&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;
    I'm picky about wizards.
&lt;/p&gt;

&lt;p&gt;
    The wizards themselves will complain about that, but of course I'm
    picky. When I choose a wizard, barring utter abandonment of moral
    scruples, it's a till-death-do-us-part situation. (Their death, not
    mine. I'm the next best thing to indestructible.)
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
The Cloak of Sunset and Starlight is a major artifact, meaning that it has
its own preferences and is capable of independent action. It has been
sitting in a glass case in the wizards' library for about a hundred years,
waiting for someone interesting. (Well, mostly sitting. Occasionally it
sneaks out to eavesdrop or move the books around.)
&lt;/p&gt;

&lt;p&gt;
Veronica Noble is interesting. She's older than most initiates,
thoughtful, observant, and clearly had some mundane career before joining
the Order. Her aura is appealing, and her mental shields and resistance to
influence are intriguing. Normally, the Cloak would take its time
investigating a new potential wizard, but the Sword was making thoughtful
rattling sounds, and no way is the Cloak going to let the Sword claim her
first. Time to choose a new wizard!
&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;
    It was nice, being draped over warm shoulders, and feeling a heartbeat
    again.
&lt;/p&gt;

&lt;p&gt;
    I could tell she closed her eyes without even looking.
&lt;/p&gt;

&lt;p&gt;
    She sighed. "I just got picked by the intransigent one, didn't I?"
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;
The last time I picked a book from the Big Idea feature in Scalzi's
&lt;a href="https://whatever.scalzi.com/"&gt;Whatever blog&lt;/a&gt;, it
&lt;a href="https://www.eyrie.org/~eagle/reviews/books/1-958880-27-2.html"&gt;didn't go that well&lt;/a&gt;, but if you're going to
write a book specifically for me, I'm going to read it. There are very few
tropes of SFF that I love more than intelligent companion objects, and
Nicolet's
&lt;a href="https://whatever.scalzi.com/2026/02/23/the-big-idea-r-z-nicolet/"&gt;introduction to the story&lt;/a&gt; was compelling. So I gave this book discovery
method another chance.
&lt;/p&gt;

&lt;p&gt;
I'm glad I did, because this was exactly what I was in the mood for and a
delight from cover to cover.
&lt;/p&gt;

&lt;p&gt;
Veronica Noble is not a typical wizard. She's a surgeon and was quite
happy to be a surgeon until an unexpected encounter with a magical
creature killed her brother. The forgetting spell cast by the wizards who
came to handle the Cassandra wyrm didn't work on her, so she was dragged
reluctantly into the secret magical world of the Order. This long-lived
society of wizards quietly defends the world against magical intrusions
from other planes of existence. Now she's a wizard with a magical cloak,
which she is not at all sure she wants.
&lt;/p&gt;

&lt;p&gt;
Veronica is not the protagonist, though. The Cloak of Sunset and Starlight
is. As far as it is concerned, its job is to assist its wizard, enjoy
watching interesting feats of magic, and look fabulous doing so. It's
protective, dramatic, rather vain, endlessly curious, easily bored, and
intensely loyal. When it becomes clear that the Order has some serious
problems, the Cloak knows what side it's on.
&lt;/p&gt;

&lt;p&gt;
This sounds a bit like urban fantasy, so I was surprised when the first
superheroes showed up, although given the explicit Doctor Strange
inspiration I probably should have expected them. The Order and the
superheroes do not mix, at least at the start of the novel. The wizards
view the superheroes as a loud and irritating intrusion and hide magical
activities from them the same as they do the rest of the world. Veronica's
opening opinion on superheroes is based on being a trauma surgeon in a
hospital dealing with the aftermath of their fights (which makes me wonder
if the author has read &lt;a href="https://www.eyrie.org/~eagle/reviews/books/0-06-297859-4.html"&gt;&lt;cite&gt;Hench&lt;/cite&gt;&lt;/a&gt;, although
the idea is older than that book). As with the Order, the role of
superheroes in this world gets more complicated as the plot develops.
&lt;/p&gt;

&lt;p&gt;
There is a surprising amount of plot and some very nice world-building
here, including multiple twists that I was not expecting. Veronica is the
sort of stubborn and deeply ethical person who will not leave a problem
alone if she has the ability to fix it, which is a good recipe for getting
deeper and deeper into a complex plot. She's believable as a surgeon:
somewhat taciturn, calm in emergencies, detail-oriented, methodical, and
not at all dramatic. This makes the Cloak a perfect foil and complement.
Watching their partnership develop was very satisfying.
&lt;/p&gt;

&lt;p&gt;
This is a sidekick novel, and like the best sidekick novels it makes the
not-protagonist more interesting and more relatable by showing them from
an outside and skewed perspective. Piecing together what Veronica must be
thinking is part of the fun, as is sharing the Cloak's protectiveness
towards her as it becomes clear how much she's been through and how good
of a person she is. The Cloak's personality was a little too much like a
cat for me — I would have preferred a more unique viewpoint, fewer
cat-coded shenanigans, and a bit less of the running laundry machine joke.
But that's a quibble. Its endless curiosity drives the plot forward and
uncovers more of the world-building, and I just love reading stories from
the perspective of this sort of loyal and protective magical creature.
&lt;/p&gt;

&lt;p&gt;
I had so much fun with this book. It's a popcorn sort of book, and I
thought the ending sputtered a little, but overall it was great. Parts of
it could have been designed in a lab to appeal to me specifically, so I'm
not sure if other people will enjoy it as much, but its hit rate with my
friends so far has been good.
&lt;/p&gt;

&lt;p&gt;
Highly recommended, and I will be watching for any further novels from
Nicolet.
&lt;/p&gt;

&lt;p&gt;
&lt;cite&gt;The Cloak and Its Wizard&lt;/cite&gt; reaches a satisfying conclusion and
doesn't advertise itself as part of a series, but there is room for a
sequel. If Nicolet ever writes one, I'd read it.
&lt;/p&gt;

&lt;p&gt;Rating: 8 out of 10&lt;/p&gt; </description> 
	<pubDate>Mon, 30 Mar 2026 02:46:00 +0000</pubDate>

</item> 
<item>
	<title>Sahil Dhiman: MiniDebConf Kanpur 2026</title>
	<guid>https://blog.sahilister.in/2026/03/minidebconf-kanpur-2026/</guid>
	<link>https://blog.sahilister.in/2026/03/minidebconf-kanpur-2026/</link>
     <description>  &lt;p&gt;&lt;a href="https://kanpur2026.mini.debconf.org/"&gt;MiniDebConf Kanpur 2026&lt;/a&gt; was held on 14th and 15th March 2026 at the Indian Institute of Technology Kanpur.&lt;/p&gt;
&lt;p&gt;Having a Debian conference in the North was something many folks wanted. &lt;a href="https://ravidwivedi.in/"&gt;Ravi&lt;/a&gt; started the discussion (with local IIT Kanpur folks) almost 7 months before the conference. Lots of folks from Debian India joined in organizing the conference, which was nice. All the meeting notes and discussions were posted on the Debian India mailing list, a first.&lt;/p&gt;
&lt;p&gt;Despite all the efforts, the conference start was delayed due to logistical issues. Things went fine post Day 1 lunch. We had two days of almost &lt;a href="https://kanpur2026.mini.debconf.org/schedule/"&gt;full schedule&lt;/a&gt;. disaster’s &lt;a href="https://kanpur2026.mini.debconf.org/talks/20-decentralising-indian-communication/"&gt;&lt;em&gt;Decentralising Indian Communication&lt;/em&gt;&lt;/a&gt; was an interesting talk, diving into decentralized communication.&lt;/p&gt;
&lt;p&gt;IIT Kanpur is a huge campus with nice footpaths and greenery. We got the opportunity to explore their &lt;a href="https://www.iitk.ac.in/hpc/paramsanganak"&gt;HPC&lt;/a&gt; at Computer Center post conference.&lt;/p&gt;
&lt;p&gt;Work has been started for MiniDebCamp Kochi. More details can be found on the &lt;a href="https://wiki.debian.org/DebianEvents/in/2026/MiniDebCampKochi"&gt;wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Working to make this conference happen was different with all the challenges involved, but overall, everyone was happy with the outcome.&lt;/p&gt;
&lt;p&gt;&lt;img alt="MDC K group photo" src="https://blog.sahilister.in/img/mdc-k-2026-group-photo.png" /&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;
    &lt;i&gt;
    Group photo. &lt;a href="https://blog.sahilister.in/img/mdc-k-2026-group-photo.png"&gt;Click to enlarge&lt;/a&gt;
    &lt;/i&gt;
&lt;/div&gt; </description> 
	<pubDate>Mon, 30 Mar 2026 02:24:57 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: Ebook Readers in Debian</title>
	<guid>https://etbe.coker.com.au/?p=6006</guid>
	<link>https://etbe.coker.com.au/2026/03/29/ebook-readers-debian/</link>
     <description>  &lt;h2&gt;Laptop&lt;/h2&gt;
&lt;p&gt;For a while I’ve been using Calibre 8.5.0+ds-1+deb13u1 in Debian/Trixie running KDE for reading ebooks on my laptop, it generally works well and has a large font size. The only downsides of it for that use are taking more RAM than I would prefer (about 780M RSS which seems a lot for a relatively simple task) and having separate windows for the list of books and reading an actual book without any options to just open the last book and not delay me.&lt;/p&gt;
&lt;p&gt;I tried Arianna 25.04.0-1 in Debian/Trixie, it has a significantly smaller font size and doesn’t allow high contrast colors as the default is black on gray with the dark theme in KDE. It also only allows left and right arrows for moving through the book while Calibre uses up/down, left/right, or pgup/pgdn so whatever keys seem reasonable to you are going to work. The RSS was 762M which wasn’t great but wasn’t the real problem. Rumours of Arianna using less RAM than Calibre seem exaggerated.&lt;/p&gt;
&lt;h2&gt;Librem5&lt;/h2&gt;
&lt;p&gt;On my Librem5 phone with Plasma Mobile Calibre 8.5.0+ds-1+deb13u1 both the initial setup screen and the main screen for selecting a book to read don’t work in the width of portrait view on the phone. After putting it in landscape mode it worked, but I couldn’t touch on a book title to select it I had to touch on the number of the book at the left of the list box. But once it was loaded everything was fine. On the Librem5 Arianna 25.04.0-1 just worked fine, although only using left/right swipes to change pages instead of up/down was annoying.&lt;/p&gt;
&lt;h2&gt;Furilabs FLX1s&lt;/h2&gt;
&lt;p&gt;On my Furilabs FLX1s with phosh Arianna 25.04.0-1 and Calibre 8.16.2+ds+~0.10.5-3 both gave the same result of not displaying text or images from the book, I’m not sure if it’s phosh or some other aspect of the FLX1s configuration at fault.&lt;/p&gt;
&lt;h2&gt;PinePhonePro&lt;/h2&gt;
&lt;p&gt;On my PinePhonePro running Debian/Testing with Plasma Mobile Arianna 25.12.3-1 worked without any issue and up/down swipes worked. Calibre 9.5.0+ds+~0.10.5-1 had the initial screen work fine in portrait mode but the main screen was too wide and needed landscape. Also the issue of having to touch the number applied.&lt;/p&gt;
&lt;h2&gt;Laptop running Debian/Unstable&lt;/h2&gt;
&lt;p&gt;Calibre 9.6.0+ds+~0.10.5-2 and Arianna 25.12.3-1 worked quite nicely on a Thinkpad running Debian/Unstable. One thing I discovered while testing it is that Calibre supports the CTRL-PLUS and CTRL-MINUS key combinations to change font sizes and that also works on the version in Debian/Trixie. Arianna doesn’t support CTRL-PLUS/MINUS.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The problems I had were Arianna on a laptop, everything on the Furilabs FLX1s, and Calibre’s UI not being well adjusted for mobile devices.&lt;/p&gt;
&lt;div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list"&gt;

&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2006/12/22/encryption-speed-debian-vs-fedora/" rel="bookmark" title="encryption speed – Debian vs Fedora"&gt;encryption speed – Debian vs Fedora&lt;/a&gt; &lt;small&gt;I’m in the process of converting my Fedora/rawhide laptop to...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2026/01/05/phone-charging-speeds/" rel="bookmark" title="Phone Charging Speeds With Debian/Trixie"&gt;Phone Charging Speeds With Debian/Trixie&lt;/a&gt; &lt;small&gt;One of the problems I encountered with the PinePhone Pro...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2026/01/19/furilabs-flx1s/" rel="bookmark" title="Furilabs FLX1s"&gt;Furilabs FLX1s&lt;/a&gt; &lt;small&gt;The Aim I have just got a Furilabs FLX1s [1]...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Sun, 29 Mar 2026 12:29:53 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: The Sovereign</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/0-316-54286-5.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/0-316-54286-5.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;The Sovereign&lt;/cite&gt;, by C.L. Clark&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Series:&lt;/td&gt;
    &lt;td&gt;Magic of the Lost #3&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;Orbit&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;September 2025&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;0-316-54286-5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Kindle&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;575&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
&lt;cite&gt;The Sovereign&lt;/cite&gt; is the third and concluding book of C.L. Clark's
Magic of the Lost high fantasy trilogy. I recommend reading the books of
this series close together, since there are a lot of characters and a lot
of continuity between books that is helpful to remember, but it was not
quite as difficult this time to remember where the story left off.
&lt;/p&gt;

&lt;p&gt;
At the end of &lt;a href="https://www.eyrie.org/~eagle/reviews/books/0-316-54283-0.html"&gt;&lt;cite&gt;The Faithless&lt;/cite&gt;&lt;/a&gt;, the
political situation in Balladaire (not-France) was more stable, but the
threat of a plague lay on the horizon. That threat arrives in earnest in
this book, along with new threats from both Balladaire's former colonial
conscript soldiers and from neighboring Taargen (not-Germany, sort of,
although the parallel isn't as close). Luca and Touraine have finally
admitted that they're deeply in love, but they are still very different
people with different goals and ethics. Luca is determined to do anything
necessary to save her kingdom, but her definition of her kingdom is sharp
and brittle. Touraine is torn between far too many loyalties, plus the
lingering worry that her morals and Luca's may not be compatible.
&lt;/p&gt;

&lt;p&gt;
I think the hardest part of this sort of series is finding an ending the
reader will find satisfying. This one, unfortunately, did not work for me,
but that may be more due to personal preference than objective flaws.
&lt;/p&gt;

&lt;p&gt;
There have been two threads through this series: an improbable romance
embedded in a network of complex personal relationships, and a political
commentary on colonialism and post-colonial wars. I was enjoying the
former, but it was the latter that felt fresh and interesting to me. The
plot threads in &lt;cite&gt;The Faithless&lt;/cite&gt; outside of Balladaire expanded that
complexity, and I was hoping the final volume would continue in that
direction. How could a colonial power atone for its history? How does the
former colony establish its own governance? Is there a path to freedom
without violence? Are attempts to chart a more moral course doomed to open
lines of attack for one's other enemies?
&lt;/p&gt;

&lt;p&gt;
It's clear that Clark was thinking about similar themes, but &lt;cite&gt;The
Sovereign&lt;/cite&gt; narrows the field instead of widens it, restricts the political
options, and then resolves most questions in a massive war. This is not
that surprising of a conclusion, but it's one that I found unsatisfying
and, honestly, a little boring. Yes, one way to resolve all the competing
tensions is for everyone to try to kill each other and whoever survives
wins, and historically that's one of the more likely outcomes, but that
ending doesn't wrestle with the politics as much as it collapses them.
&lt;/p&gt;

&lt;p&gt;
Clark instead focuses this concluding volume on the romance, which becomes
even more fraught, tragic, and dramatic than it was in previous books (and
that's saying something). The hard questions of divided loyalties and
moral conflicts are mostly framed by questions about Touraine's loyalty to
Luca and Luca's trust of Touraine. This is all very Shakespearean, full of
hard choices, sudden reversals, miscommunication, and a very deep conflict
between Luca's realpolitik and Touraine's stubborn personal morality. If
this is what you were reading the series for, if you were hoping for a
maximum-drama sapphic relationship, you may thoroughly enjoy this. I
thought it had its moments, but I wish they had been balanced by more
moments of cool-headed practicality and creative political ingenuity.
&lt;/p&gt;

&lt;p&gt;
My biggest frustration with this ending is that the characters largely
stop doing politics. The political complexity was the strength of both
&lt;a href="https://www.eyrie.org/~eagle/reviews/books/0-316-54267-9.html"&gt;&lt;cite&gt;The Unbroken&lt;/cite&gt;&lt;/a&gt; and &lt;cite&gt;The Faithless&lt;/cite&gt;:
People who intensely dislike each other negotiate because there is
something larger to be gained, personal decisions made without considering
the political ramifications have costs, and multiple characters are trying
hard to find a way to turn a nasty, exploitative world into something
better without simply killing everyone who disagrees. Many of the
characters were objectively bad at politics, inexperienced and immature,
but they stumbled or dragged or fought their way into political solutions
anyway. I thought Clark moved too far away from that in &lt;cite&gt;The
Sovereign&lt;/cite&gt;. Everyone goes deep into their own emotions and desire for
vengeance or conquest or revolution and stops compromising. To a
depressingly large extent, the story is resolved by killing everyone who
disagrees. I think the story is poorer for it.
&lt;/p&gt;

&lt;p&gt;
One of the other threads of the series is Balladairan magic, or rather its
odd absence. Luca has one understanding of it, the rebels introduced in
&lt;cite&gt;The Faithless&lt;/cite&gt; have a different understanding of it, and its pursuit
is set up as critical to resolving the threat of a plague. We do get an
explanation of sorts, but it's not as complete or as satisfying as I was
hoping, and the symbolism of Balladaire's missing magic is left
frustratingly murky. For me, this has some of the same problems as the
political conclusion: I wanted an intellectual catharsis alongside the
emotional catharsis, but that was not the direction Clark was taking the
story.
&lt;/p&gt;

&lt;p&gt;
I like reading about these characters. All of Luca, Touraine, and Pruett
are complex, comprehensible, flawed, and often intriguing. But my favorite
character in the story, the person I latched on to as an emotional path
through the story, was Sabine. Her refreshingly straightforward loyalty
and lack of drama was a breath of fresh air. She has some great moments in
this book, but there too I got wrong-footed by the direction Clark went
with her arc and found its conclusion deeply unsatisfying.
&lt;/p&gt;

&lt;p&gt;
I'm not sure how many of these complaints are because of missed
opportunities in the novel, how many were due to a mismatch of taste, and
how many were due to not being in the right mood to read this conclusion.
I'm sure that it didn't help that I read this simultaneous with
&lt;a href="https://www.eyrie.org/~eagle/reviews/books/0-7653-1340-5.html"&gt;another novel in which the characters were
always miserable&lt;/a&gt;, or that I read it in early 2026 with, uh, all that
entails. I suspect that if you came away from the first two books invested
in the messy romance and wanting MOAR DRAMA, you may get exactly what you
were hoping for. That, sadly, was not what I was hoping for.
&lt;/p&gt;

&lt;p&gt;
I can't really recommend this. I thought it dragged in places and didn't
deliver the ending I wanted. But it has some great moments, it does wrap
up the threads of the trilogy as advertised, and at least the romance gets
a dramatic climax worthy of the tension that has been built through the
previous books. If that matches what you were enjoying in the previous
books, you may well enjoy this more than I did.
&lt;/p&gt;

&lt;p&gt;Rating: 5 out of 10&lt;/p&gt; </description> 
	<pubDate>Sun, 29 Mar 2026 04:51:00 +0000</pubDate>

</item> 
<item>
	<title>Samuel Henrique: Latest NVIDIA Drivers for Debian (Packaged with AI)</title>
	<guid>https://samueloph.dev/blog/latest-nvidia-drivers-for-debian-packaged-with-ai/</guid>
	<link>https://samueloph.dev/blog/latest-nvidia-drivers-for-debian-packaged-with-ai/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/samueloph.png" width="100" height="100" alt="" align="right" style="float: right;"&gt;  &lt;img alt="Two terminal windows side-by-side, on the left there's the Debian logo in ASCII art, and on the right it's the output of nvidia-smi, showing the driver version 595.58.03 running on a machine that has an NVIDIA RTS 5080" height="483" src="https://samueloph.dev/blog/latest-nvidia-drivers-for-debian-packaged-with-ai/latest-nvidia-drivers-for-debian-packaged-with-ai.webp" width="1200" /&gt;
&lt;h4 id="tl-dr"&gt;tl;dr&lt;/h4&gt;
&lt;p&gt;This is not an official package, it's good enough for me and it might be good
enough for you, confirmed as working in Debian Testing but I don't have a
Stable machine to test there.&lt;/p&gt;
&lt;p&gt;You can use my custom repo to install the latest NVIDIA drivers on Debian
Stable, Testing or Unstable (install from Sid repository):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/" rel="noopener external" target="_blank"&gt;https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The page above contains the APT sources you need, just add the one for your
release to &lt;code&gt;/etc/apt/sources.list.d/r-samueloph-nvidia-ai.sources&lt;/code&gt;, run &lt;code&gt;sudo apt update&lt;/code&gt; and install the packages, you might need to disable Secure Boot.&lt;/p&gt;
&lt;h1 id="this-is-not-about-ai"&gt;This is not about AI&lt;/h1&gt;
&lt;p&gt;Discussions about AI are quite divisive in the Free Software communities, and
there's so much to be said about it that I'm not willing to go into in this
blog post. This is rather just me telling people that if they need up-to-date
NVIDIA packages for Debian, they could check if my custom repository gets the
job done.&lt;/p&gt;
&lt;p&gt;The AI part is a means to an end, I've been careful to note in the repository
names that the packages were produced with AI to respect people who do not want
to run it for any reason.&lt;/p&gt;
&lt;h1 id="rtx-5000-series-support"&gt;RTX 5000 series support&lt;/h1&gt;
&lt;p&gt;Back in May 2025 I &lt;a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1101072" rel="noopener external" target="_blank"&gt;opened a bug
report&lt;/a&gt; asking for
the NVIDIA drivers on Debian to be updated to support the RTX 5000 series. The
Nouveau drivers might be good enough for some people, but I need the NVIDIA
drivers because I want to play games and do experiments with open weight
models.&lt;/p&gt;
&lt;p&gt;Opening a bug report doesn't guarantee anything, at the end of the day Debian
Developers are volunteers, so if I really wanted the newer drivers, I would
have to do something about it, ideally submitting a merge request.&lt;/p&gt;
&lt;p&gt;I briefly looked into the NVIDIA packaging, which involves 3 source packages
(and one extra git repo for tarballs), unfortunately this was going to take
more time and effort than what I was willing to spend.&lt;/p&gt;
&lt;h1 id="what-i-did"&gt;What I Did&lt;/h1&gt;
&lt;p&gt;After a few weeks of lamenting that I wasn't running the NVIDIA drivers, I
figured I was willing to put in more effort than I originally thought, just
enough to instruct the Claude Code agent to package the latest releases. I'm
skilled enough with agentic tools that I knew how to use it to save time;
providing a clear instruction on how to build the package and explaining the
packaging layout, then letting the agent iterate until it gets a working build.
The agent was running inside a VM that didn't have any of my credentials.&lt;/p&gt;
&lt;p&gt;After a little bit of back and forth, where I was reviewing the changes guiding
the agent into how to fix certain issues, I ended up with a working set of
packages.&lt;/p&gt;
&lt;p&gt;Once I installed it on my machine and confirmed they worked, I set up a
&lt;a href="https://debusine.debian.net/" rel="noopener external" target="_blank"&gt;debusine&lt;/a&gt; repository to make it easier to
install future updates, and let others test it out.&lt;/p&gt;
&lt;p&gt;Debusine is analogous to Ubuntu's famous PPA, or Fedora's EPEL, it's a
relatively new project but it has been working fine for this.&lt;/p&gt;
&lt;p&gt;Matheus Polkorny helped me test the packages and did spot a few issues which
are fixed now. The Debusine developers were also always quick to respond to my
questions and &lt;a href="https://salsa.debian.org/freexian-team/debusine/-/issues?sort=created_date&amp;amp;state=opened&amp;amp;author_username=samueloph&amp;amp;first_page_size=20" rel="noopener external" target="_blank"&gt;bug
reports&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="how-good-is-it"&gt;How Good Is It?&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Short answer: good enough for daily use, but not a substitute for an official Debian package.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The whole point of doing this is because I don't have enough free time to
maintain the package myself. All of this work was done as a volunteer, on my
personal time.&lt;/p&gt;
&lt;p&gt;This means I'm trusting the agent to some degree; I review its commits but I
don't go too deep into it, the quality will be dictated by the fact that I'm
a Debian Developer and so by how easily I can spot issues without double checking
everything.&lt;/p&gt;
&lt;p&gt;I only have a single machine with an NVIDIA GPU, this machine runs Debian
Testing and so I don't have a way to test the Stable packages. I can do my best
to address problems but at this point there is a risk that new updates break
something.&lt;/p&gt;
&lt;p&gt;Installing NVIDIA drivers has always been a bit risky regardless, if you're
comfortable with reverting updates and handling a system without a graphical
interface (in case you end up in a tty), you will be fine.&lt;/p&gt;
&lt;p&gt;You will likely need to disable Secure Boot in order to use them, or set up your
BIOS so that a MOK can be used to sign the DKMS modules.&lt;/p&gt;
&lt;p&gt;When choosing the version strings for the packages, I was careful enough to
pick something that would sort lower than an official Debian package, meaning
that whenever that same version is packaged in Debian, your system will see it
as an upgrade.&lt;/p&gt;
&lt;p&gt;If you have any other methods of installing the NVIDIA drivers on your Debian
system that is working for you, you should likely stick to that.&lt;/p&gt;
&lt;p&gt;I have a strong preference for installing them through .deb packages, making
the package sort out configuration changes and dependency updates, besides
handling the DKMS modules.&lt;/p&gt;
&lt;p&gt;Ultimately I'm not happy with the amount of difficulty that Debian users have in
installing up-to-date NVIDIA drivers, and I hope this makes it easier for some.&lt;/p&gt;
&lt;h1 id="how-to-install"&gt;How To Install&lt;/h1&gt;
&lt;p&gt;Head over to the Debusine page that contains both repos for Trixie (Debian
Stable) and Sid (for Debian Testing and Unstable):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/" rel="noopener external" target="_blank"&gt;https://deb.debusine.debian.net/debian/r-samueloph-nvidia-ai/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you are running Debian Testing, then pick the Sid repository.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That page contains the contents of the apt &lt;code&gt;.sources&lt;/code&gt; file you need, create the
file &lt;code&gt;/etc/apt/sources.list.d/r-samueloph-nvidia-ai.sources&lt;/code&gt; with the sources for your release.&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;sudo apt update&lt;/code&gt; and install the packages you need, if you already have a
previous version installed, &lt;code&gt;sudo apt upgrade --update&lt;/code&gt; would update them.&lt;/p&gt;
&lt;p&gt;If there are no upgrades, meaning you don't have a previous version installed,
then you need to explicitly install them.&lt;/p&gt;
&lt;pre class="giallo" style="color: #EBDBB2; background-color: #282828;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;sudo&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; apt install nvidia-open-kernel-dkms nvidia-driver&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you run into issues in Debian Stable, consider using the Linux kernel package
from the backports repository, if you need an up-to-date NVIDIA driver, you
likely should also be running the backports kernel package (if you can't
upgrade to Debian Testing).&lt;/p&gt;
&lt;h1 id="future-plans"&gt;Future Plans&lt;/h1&gt;
&lt;p&gt;I currently have no means of measuring how many people are using the debusine
repositories, so if you do end up using it feel free to let me know somehow.&lt;/p&gt;
&lt;p&gt;I don't know for how long I will keep managing this repository, and how much
effort I will spend, but my machine needs it and for now I will keep it
up-to-date with the latest production-grade NVIDIA drivers.&lt;/p&gt;
&lt;h1 id="sources"&gt;Sources&lt;/h1&gt;
&lt;p&gt;The sources of the packages are available under a namespace in Salsa (Debian's
GitLab instance):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://salsa.debian.org/samueloph-forks-team/nvidia-drivers-forks-with-ai" rel="noopener external" target="_blank"&gt;https://salsa.debian.org/samueloph-forks-team/nvidia-drivers-forks-with-ai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also get the exact sources used in the repositories from debusine:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/sid-nvidia-ai/search/?category=debian:source-package" rel="noopener external" target="_blank"&gt;https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/sid-nvidia-ai/search/?category=debian:source-package&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/trixie-nvidia-ai/search/?category=debian:source-package" rel="noopener external" target="_blank"&gt;https://debusine.debian.net/debian/r-samueloph-nvidia-ai/collection/debian:suite/trixie-nvidia-ai/search/?category=debian:source-package&lt;/a&gt;&lt;/p&gt; </description> 
	<pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Evgeni Golov: Converting Dovecot password schemes on the fly without (too much) cursing</title>
	<guid>https://www.die-welt.net/2026/03/converting-dovecot-password-schemes-on-the-fly-without-too-much-cursing/</guid>
	<link>https://www.die-welt.net/2026/03/converting-dovecot-password-schemes-on-the-fly-without-too-much-cursing/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/evgeni.png" width="100" height="100" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;I finally upgraded my mail server to Debian 13 and, as expected, the Dovecot part was quite a ride.&lt;/p&gt;
&lt;p&gt;The configuration syntax changed between Dovecot 2.3 (Debian 12) and Dovecot 2.4 (Debian 13),
so I started first with diffing my configuration against a vanilla Debian 12 one (this setup is slightly old) and then applied the same (logical) changes to a vanilla Debian 13 one.
This mostly went well.
Mostly because my user database is stored in SQL and while the &lt;a href="https://dovecot.org/upgrader/"&gt;Dovecot Configuration Upgrader&lt;/a&gt; says it can convert old &lt;code&gt;dovecot-auth-sql.conf.ext&lt;/code&gt; files to the new syntax,
it only does so for the structure, not the SQL queries themselves.
While I don't expect it to be able to parse the queries and adopt them correctly,
at least a hint that the field names in &lt;a href="https://doc.dovecot.org/2.4.3/core/config/auth/userdb.html"&gt;userdb&lt;/a&gt; changed and might require adjustment would've been cool.&lt;/p&gt;
&lt;p&gt;Once I got that all sorted, Dovecot would still refuse to let me in:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Error: sql: Invalid password in passdb: Weak password scheme 'MD5-CRYPT' used and refused
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Yeah, right.
Did I mention that this setup is old?&lt;/p&gt;
&lt;p&gt;The quick cure against this is a &lt;code&gt;auth_allow_weak_schemes = yes&lt;/code&gt; in &lt;code&gt;/etc/dovecot/conf.d/10-auth.conf&lt;/code&gt;,
but long term I really should upgrade the password hashes in the database to something more modern.&lt;/p&gt;
&lt;p&gt;And this is what this post is about.&lt;/p&gt;
&lt;p&gt;My database only contains hashed (and salted) passwords,
so I can't just update them without changing the password.
And while there are only 9 users in total,
I wanted to play nice and professional.
(LOL)&lt;/p&gt;
&lt;p&gt;There is a &lt;a href="https://doc.dovecot.org/2.4.3/howto/convert_password_schemes.html"&gt;Converting Password Schemes&lt;/a&gt; howto in the Dovecot documentation,
but it uses a rather odd looking PHP script, wrapped in a shell script which leaks the plaintext password to the process list,
and I really didn't want to remember how to write PHP to complete this task.&lt;/p&gt;
&lt;p&gt;Luckily, &lt;a href="https://xkcd.com/208/"&gt;I know Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The general idea is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As we're using plaintext authentication (&lt;code&gt;auth_mechanisms = plain login&lt;/code&gt;),
  the plaintext password is available during login.&lt;/li&gt;
&lt;li&gt;After Dovecot's &lt;code&gt;imap-login&lt;/code&gt; has verified the password against the old (insecure) hash in the database,
  we can &lt;a href="https://doc.dovecot.org/2.4.3/core/config/post_login_scripting.html"&gt;execute a post-login script&lt;/a&gt;,
  which will connect to the database and update it with a new hash of the plaintext password.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make the plaintext password available to the post-login script,
we add &lt;code&gt;'%{password}' as userdb_plain_pass&lt;/code&gt; to the &lt;code&gt;SELECT&lt;/code&gt; statement of our &lt;code&gt;passdb&lt;/code&gt; query.
The original howto also says to add a &lt;code&gt;prefetch&lt;/code&gt; &lt;code&gt;userdb&lt;/code&gt;, which we do.
The &lt;code&gt;sql&lt;/code&gt; &lt;code&gt;userdb&lt;/code&gt; remains, as otherwise Postfix can't use Dovecot to deliver mail.&lt;/p&gt;
&lt;p&gt;Now comes the interesting part.
We need to write a script that is executed by Dovecot's &lt;code&gt;script-login&lt;/code&gt; and that will update the database for us.
Thanks to Python's &lt;a href="https://passlib.readthedocs.io/"&gt;&lt;code&gt;passlib&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/PyMySQL/mysqlclient"&gt;&lt;code&gt;mysqlclient&lt;/code&gt;&lt;/a&gt;,
the database and hashing parts are relatively straight forward:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MySQLdb&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;passlib.hash&lt;/span&gt;

&lt;span class="n"&gt;DB_SETTINGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"database"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mail"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;SELECT_QUERY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT password_enc FROM mail_users WHERE username=&lt;/span&gt;&lt;span class="si"&gt;%(username)s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;UPDATE_QUERY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"UPDATE mail_users SET password_enc=&lt;/span&gt;&lt;span class="si"&gt;%(pwhash)s&lt;/span&gt;&lt;span class="s2"&gt; WHERE username=&lt;/span&gt;&lt;span class="si"&gt;%(username)s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;SCHEME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bcrypt"&lt;/span&gt;
&lt;span class="n"&gt;EXPECTED_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$2b$"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# https://doc.dovecot.org/2.4.3/core/config/post_login_scripting.html&lt;/span&gt;
    &lt;span class="c1"&gt;# https://doc.dovecot.org/2.4.3/howto/convert_password_schemes.html&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"USER"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;plain_pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"PLAIN_PASS"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;plain_pass&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MySQLdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;DB_SETTINGS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SELECT_QUERY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;current_pwhash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;current_pwhash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EXPECTED_PREFIX&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;hash_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;passlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCHEME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pwhash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash_module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plain_pass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"pwhash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pwhash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UPDATE_QUERY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;But if we add that as &lt;code&gt;executable = script-login /etc/dovecot/dpsu.py&lt;/code&gt; to our &lt;code&gt;imap-postlogin&lt;/code&gt; &lt;code&gt;service&lt;/code&gt;,
as the howto suggests, the users won't be able to login anymore:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Error: Post-login script denied access to user
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;WAT?&lt;/p&gt;
&lt;p&gt;Remember that shell script I wanted to avoid?
It ends with &lt;code&gt;exec "$@"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Turns out the &lt;code&gt;script-login&lt;/code&gt; "API" is rather interesting.
It's not "pass in a list of scripts to call and I'll call all of them".
It's "pass a list of scripts, I'll &lt;a href="https://linux.die.net/man/3/execv"&gt;&lt;code&gt;execv&lt;/code&gt;&lt;/a&gt; the first item and pass the rest as args, and every item is expected to &lt;code&gt;execv&lt;/code&gt; the next one again". &#129327;&lt;/p&gt;
&lt;p&gt;With that (cursed) knowledge, the script becomes:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MySQLdb&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;passlib.hash&lt;/span&gt;

&lt;span class="n"&gt;DB_SETTINGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"database"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"mail"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;SELECT_QUERY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT password_enc FROM mail_users WHERE username=&lt;/span&gt;&lt;span class="si"&gt;%(username)s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;UPDATE_QUERY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"UPDATE mail_users SET password_enc=&lt;/span&gt;&lt;span class="si"&gt;%(pwhash)s&lt;/span&gt;&lt;span class="s2"&gt; WHERE username=&lt;/span&gt;&lt;span class="si"&gt;%(username)s&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;SCHEME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bcrypt"&lt;/span&gt;
&lt;span class="n"&gt;EXPECTED_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"$2b$"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# https://doc.dovecot.org/2.4.3/core/config/post_login_scripting.html&lt;/span&gt;
    &lt;span class="c1"&gt;# https://doc.dovecot.org/2.4.3/howto/convert_password_schemes.html&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"USER"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;plain_pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"PLAIN_PASS"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;plain_pass&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MySQLdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;DB_SETTINGS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SELECT_QUERY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;current_pwhash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;current_pwhash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EXPECTED_PREFIX&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;hash_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;passlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SCHEME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pwhash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash_module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plain_pass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"pwhash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pwhash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UPDATE_QUERY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"__main__"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And the passwords are getting gradually updated as the users log in.
Once all are updated, we can remove the post-login script and drop the &lt;code&gt;auth_allow_weak_schemes = yes&lt;/code&gt;.&lt;/p&gt; </description> 
	<pubDate>Sat, 28 Mar 2026 22:11:57 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: Communication and Hostile AIs</title>
	<guid>https://etbe.coker.com.au/?p=5962</guid>
	<link>https://etbe.coker.com.au/2026/03/29/communication-hostile-ais/</link>
     <description>  &lt;p&gt;We seem to be entering an “AI” apocalypse of sorts, they aren’t going to kill us or even take our jobs. What they are doing is destroying the Internet commons by filling it with rubbish. This isn’t even real AI, just pattern matching and prediction systems, mostly LLMs.&lt;/p&gt;
&lt;h2&gt;The Problem&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/"&gt;Scott Shambaugh’s saga of being attacked and defamed by an OpenClaw AI bot is interesting and raises some disturbing possibilities for future online discussion [1]&lt;/a&gt;. Imagine what it would be like if everyone who was in any way notable for free software work had 100 such bots going after them.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.aikido.dev/blog/why-trying-to-secure-openclaw-is-ridiculous"&gt;Dania Dumas wrote an insightful blog post about why OpenClaw is impossible to secure and why it won’t go away [2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.schneier.com/blog/archives/2026/02/the-ai-generated-text-arms-race.html"&gt;Bruce Schneier and Nathan E. Sanders wrote an insightful article about the AI generated text arms race [3]&lt;/a&gt; primarily concentrating on situations in which text that was assumed to be written by humans but was actually written in bulk by bots was performing a DOS attack on people who were reviewing it. There are many situations such as book publishing and publishing letters to the editor of newspapers where getting new material from unknown people is an important part of the job but where there are also people making low quality submissions that are almost a DOS attack at the best of times.&lt;/p&gt;
&lt;p&gt;Currently the email spam problem continues to get worse and when LLM use increases it will get significantly worse. &lt;a href="https://soatok.blog/2026/01/04/everything-you-need-to-know-about-email-encryption-in-2026/"&gt;Email encryption isn’t viable [4]&lt;/a&gt;. The PGP web of trust never really worked well as it’s too difficult for most users.&lt;/p&gt;
&lt;p&gt;The amount of “AI” generated content that’s being recommended to users on platforms like YouTube and Facebook is steadily increasing and the amount of LLM generated commentary that purports to be from real people on Twitter and Facebook is also increasing. &lt;a href="https://www.vitavonni.de/blog/202602/20260213dogfood-the-AI.html"&gt;Here’s an informative blog post by Erich Schubert about this [5]&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Potential Solutions&lt;/h2&gt;
&lt;h3&gt;Surrender?&lt;/h3&gt;
&lt;p&gt;One option and possibly the default option is to surrender to this and just let everything we built on the Internet over decades get destroyed. Whether to surrender is a decision that can be made on a per-service basis.&lt;/p&gt;
&lt;p&gt;Twitter is pretty much useless anyway, &lt;a href="https://etbe.coker.com.au/2026/03/25/death-of-twitter/"&gt;I quit Twitter because Elon deliberately made it suck [6]&lt;/a&gt;. In my opinion this is not surrendering to what’s being done there, I’m just stopping wasting time on it and using better options. I used to have about 300 followers on Twitter and I don’t think that many of them would ever choose to stop following me, so I presume that about 1/3 of the people following me have decided to totally quit Twitter and delete their accounts. I also presume that some of the remainder have done the same as me and just kept a mostly inactive account. If Elon suddenly stopped being a stupid asshole it probably wouldn’t change anything as the value of the system was connections to others. Some people will consider my abandonment of Twitter as surrender and I accept that it’s not an unreasonable opinion. I think that the possibly 100 Twitter followers of mine who deleted their accounts surrendered.&lt;/p&gt;
&lt;p&gt;Facebook has been becoming a worse service, it’s business model is becoming increasingly exploitative and it’s interface is designed to be addictive. It’s probably best avoided unless you really need it. The only good thing about Facebook at the moment is that Facebook Marketplace doesn’t take a cut on sales and there are some really good deals on computers if you know what to look for. Unfortunately Facebook has a large number of users who are from marginalised communities and have no other alternatives for communication. It would be good to get them migrated to other platforms.&lt;/p&gt;
&lt;p&gt;We could just give up on a lot of general communications services and have everyone accept that good content is drowned out by rubbish and have the Internet become divided between people who accept the rubbish and those who cease using large portions of the Internet environment to avoid it.&lt;/p&gt;
&lt;h3&gt;Using Non Commercial Services&lt;/h3&gt;
&lt;p&gt;Lemmy is a good FOSS federated alternative to Reddit which also covers some of the uses of Facebook. It needs more users to get critical mass but is still quite usable. A post that might get a dozen comments on Reddit may get 1 comment on Lemmy but that one comment will be a good one. Reddit doesn’t appear to be attacked much by LLM generated content at least not yet. Even if the Reddit model proves to be resilient to LLM attack the Lemmy software can be used to replace some things that are done on Facebook, &lt;/p&gt;
&lt;p&gt;Mastodon is a good FOSS federated replacement for Twitter, it has a decent user-base including some VIPs. While it is aimed at the Twitter use case it can also cover a significant part of the Facebook use case.&lt;/p&gt;
&lt;p&gt;There are some other FOSS social media programs which could take over other parts of the commercial social media environment.&lt;/p&gt;
&lt;p&gt;Generally commercially run Internet services will have a financial incentive to allow the problems to get worse so we need to rely on FOSS software, non-commercial implementations, and government services.&lt;/p&gt;
&lt;h3&gt;Web Search&lt;/h3&gt;
&lt;p&gt;For a long time Google has had a monopoly on web search, but now they default to including an “AI Overview” at the start of the results which is sometimes useful but also sometimes very wrong. You can use the search URL “&lt;b&gt;https://www.google.com/search?q=%s&amp;amp;udm=web&lt;/b&gt;” to get google results without rubbish. But I presume that they will break that if it gets too popular.&lt;/p&gt;
&lt;p&gt;Searxng is a AGPL licensed metasearch engine that aggregates results from other engines, &lt;a href="https://github.com/searxng/searxng"&gt;here’s the Searxng source [7]&lt;/a&gt; and &lt;a href="https://searx.space/"&gt;here’s a list of Searxng instances if you want to try one [8]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Even using meta search engines like Searxng won’t help if the original data is overloaded with spam, but alleviating the problem is a good temporary measure.&lt;/p&gt;
&lt;h3&gt;Web of Trust for the Web?&lt;/h3&gt;
&lt;p&gt;I’ve idly considered the possibility of having some sort of rating system for web pages that uses a web of trust so that you can securely use trust ratings of friends of friends etc. But given all the difficulties in using a web of trust for signing GPG key for software developers (the demographic that is most skilled at doing such things) it doesn’t seem viable.&lt;/p&gt;
&lt;p&gt;Should we surrender the idea of having a usable public web?&lt;/p&gt;
&lt;p&gt;In the early days of the web (before Google) it was standard practice to rely on recommendations from other people or from trusted sites to find other sites, that could be considered to be an informal web of trust. We could go back to that sort of usage pattern if Google and many of the big sites get overwhelmed by LLM generated spam.&lt;/p&gt;
&lt;h3&gt;Wikipedia&lt;/h3&gt;
&lt;p&gt;I believe that Wikipedia will be at the front lines of this battle. It’s model has always included anonymous contributions. &lt;a href="https://mako.cc/copyrighteous/how-taboo-shapes-knowledge-production-on-wikipedia"&gt;Benjamin Mako Hill wrote an interesting blog post about research he did with Kaylea Champion into Wikipedia pages on taboo topics which have a larger portion of contributors choosing to be anonymous than non-taboo pages [9]&lt;/a&gt;. Wikipedia also has a long history of being abused for various reasons, one that I witnessed was someone putting false content into Wikipedia pages to immediately cite them in support of their facebook arguments. That sort of thing can be dealt with at human scale but a large scale attack by bots is a different problem to solve. Also with the recent developments in AI developing multiple web sites entirely populated for the purpose of supporting one fake entry in Wikipedia is plausible.&lt;/p&gt;
&lt;p&gt;The upside of these attacks that I predict is that they will attract the attention of all the people who have skills related to developing counter-measures. While LLM bots are filling the inboxes of publishers with rubbish and messing up the stackoverflow comments section not a lot of people are bothered, but once the attacks on Wikipedia get serious everyone will take notice.&lt;/p&gt;
&lt;h3&gt;National AI&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.schneier.com/blog/archives/2026/03/canada-needs-nationalized-public-ai.html"&gt;Bruce Schneier and Nathan E. Sanders wrote an interesting blog post about nationalised public AI [10]&lt;/a&gt;. While that won’t directly address this issue it will get the right technology in the hands of people who can use it in the right way.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This is going to be a difficult problem to solve, more difficult than the email spam problem we have been unable to solve after 30 years of working on it.&lt;/p&gt;
&lt;p&gt;This is also a very important problem, we are currently in an age where we have access to information that most people couldn’t even dream of 30 years ago. We also have disinformation that combines some of the worst aspects of authoritarian regimes throughout history combined with the worst aspects of cult brainwashing. If we lose access to the information but the disinformation remains (or get worse) then the result will be terrible.&lt;/p&gt;
&lt;p&gt;I don’t have great ideas for solving this. I have outlined some small ideas to mitigate things and I hope that others can expand on them.&lt;/p&gt;
&lt;p&gt;Please write comments with any good ideas you have, or even ideas that don’t totally suck. A problem this difficult is not going to be solved in a blog comment, but a blog comment might point in the right direction.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href="https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/"&gt; https://theshamblog.com/an-ai-agent-published-a-hit-piece-on-me/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href="https://www.aikido.dev/blog/why-trying-to-secure-openclaw-is-ridiculous"&gt; https://tinyurl.com/26wm43e2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3]&lt;a href="https://www.schneier.com/blog/archives/2026/02/the-ai-generated-text-arms-race.html"&gt; https://tinyurl.com/22ghka6s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4]&lt;a href="https://soatok.blog/2026/01/04/everything-you-need-to-know-about-email-encryption-in-2026/"&gt; https://tinyurl.com/29to4cw5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5]&lt;a href="https://www.vitavonni.de/blog/202602/20260213dogfood-the-AI.html"&gt; https://www.vitavonni.de/blog/202602/20260213dogfood-the-AI.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[6]&lt;a href="https://etbe.coker.com.au/2026/03/25/death-of-twitter/"&gt; https://etbe.coker.com.au/2026/03/25/death-of-twitter/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[7]&lt;a href="https://github.com/searxng/searxng"&gt; https://github.com/searxng/searxng&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[8]&lt;a href="https://searx.space/"&gt; https://searx.space/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[9]&lt;a href="https://mako.cc/copyrighteous/how-taboo-shapes-knowledge-production-on-wikipedia"&gt; https://tinyurl.com/26m98gca&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[10]&lt;a href="https://www.schneier.com/blog/archives/2026/03/canada-needs-nationalized-public-ai.html"&gt; https://tinyurl.com/24xt9gst&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="yarpp yarpp-related yarpp-related-rss yarpp-template-list"&gt;

&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2010/11/01/communication-shutdown/" rel="bookmark" title="Communication Shutdown and Autism"&gt;Communication Shutdown and Autism&lt;/a&gt; &lt;small&gt;The AEIOU Foundation The AEIOU Foundation [1] is a support...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2026/03/25/death-of-twitter/" rel="bookmark" title="The Death of Twitter"&gt;The Death of Twitter&lt;/a&gt; &lt;small&gt;At the end of last year I uninstalled the Twitter...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etbe.coker.com.au/2016/10/02/hostile-web-sites/" rel="bookmark" title="Hostile Web Sites"&gt;Hostile Web Sites&lt;/a&gt; &lt;small&gt;I was asked whether it would be safe to open...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Sat, 28 Mar 2026 15:08:11 +0000</pubDate>

</item> 
<item>
	<title>James Valleroy: Stagger v0.1.0</title>
	<guid>https://jvalleroy.fbx.one/wordpress/?p=91</guid>
	<link>https://jvalleroy.fbx.one/wordpress/?p=91</link>
     <description>  &lt;p&gt;I’ve decided it’s time to tag a v0.1.0 release on my roguelike game project, Stagger. It’s more of a small demo than a full game at this point. It is turn-based, and has purely text-based “graphics”, like the original Rogue.&lt;/p&gt;



&lt;p&gt;Here’s a “screenshot”:&lt;/p&gt;



&lt;pre class="wp-block-preformatted"&gt;&lt;code&gt;####################&lt;br /&gt;#..................#&lt;br /&gt;#.@................#&lt;br /&gt;#....|.............#&lt;br /&gt;#..................#&lt;br /&gt;#.........&amp;gt;........#&lt;br /&gt;#..................#&lt;br /&gt;#..................#&lt;br /&gt;#..................#&lt;br /&gt;####################&lt;br /&gt;&lt;br /&gt;HP: 10/10&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;You can find the repository at either of these locations:&lt;br /&gt;&lt;a href="https://git.sr.ht/~jvalleroy/stagger"&gt;https://git.sr.ht/~jvalleroy/stagger&lt;/a&gt;&lt;br /&gt;&lt;a href="https://codeberg.org/jvalleroy/stagger"&gt;https://codeberg.org/jvalleroy/stagger&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;The game is developed in Python, using ncurses. It is dual-licensed under AGPL and MPL.&lt;/p&gt; </description> 
	<pubDate>Sat, 28 Mar 2026 10:54:25 +0000</pubDate>

</item> 
<item>
	<title>Valhalla's Things: Ink Lightfastness Tests 2026</title>
	<guid>https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/index.html</guid>
	<link>https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/index.html</link>
     <description>  &lt;article&gt;
    &lt;section class="header"&gt;
        Posted on March 28, 2026
        &lt;br /&gt;
        
        Tags: &lt;a href="https://blog.trueelena.org/tags/madeof%3Aatoms.html" title="All pages tagged 'madeof:atoms'."&gt;madeof:atoms&lt;/a&gt;, &lt;a href="https://blog.trueelena.org/tags/topic%3Ainks.html" title="All pages tagged 'topic:inks'."&gt;topic:inks&lt;/a&gt;
        
    &lt;/section&gt;
    &lt;section&gt;
        &lt;p&gt;&lt;img alt="A borderless frame set on a table outdoors, with two sheets of paper a vertical half of which is covered by black paper, while the other half has lines with an ink name and a small filled rectangle, all in the ink itself." class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/test_setup.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;div class="note"&gt;
&lt;div class="title"&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This post will be updated in the next weeks with the test results as
they become available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="note"&gt;
&lt;div class="title"&gt;
&lt;p&gt;Note&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Most of the images in this post have no real alt-text: they are all
scans of the test sheet at various stages through the test, and the
results visible on them are described in detail at the end of the
post.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Most of the time, what people write by hand will either end up inside a
notebook in a drawer or cupboard where it’s well protected, or thrown in
the recycling where it doesn’t matter.
There are times, however, when things will be exposed to light: it
doesn’t matter whether it’s a work of artistic calligraphy that you want
to frame or a passive-aggressive notice left in the atrium of a
building; it is useful to know whether the work will remain legible or
it will fade into nothing in a short time.&lt;/p&gt;
&lt;p&gt;A few inks are tested by the producers for lightfastness according to
some established standard, a few others are declared lightfast in a
generic way, but a lot come with no indication at all.
Proper testing according to the &lt;a href="https://en.wikipedia.org/wiki/Lightfastness#Standards_and_measure_scales"&gt;standard scales&lt;/a&gt; requires significant
equipment to precisely control the exposure, but it’s significantly
easier — and fun — to do a simple test to divide the inks into three
categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;suitable for framed calligraphy, i.e. it looks the same after 3 months
of direct sun exposure;&lt;/li&gt;
&lt;li&gt;suitable for complaining about the way your neighbours deal with the
trash, i.e. still readable after 3 months of exposure;&lt;/li&gt;
&lt;li&gt;not suitable for either, i.e. has faded significantly in the same time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the past I’ve done some such tests by taping some sheets to a
south-east facing window, and I’ve noticed that most of the results were
already apparent after a month, and there was basically no difference
between two and three months of exposure, but spring equinox to summer
solstice is a nice timeframe to use for such a test (and it leaves time
for a second test of different materials from summer solstice to autumn
equinox), so this is what I’ve chosen to do this year.&lt;/p&gt;
&lt;p&gt;Rather than a window, now I have access to a south-facing covered
balcony that is protected from rain but receives quite a bit of direct
sun, so instead of taping sheets to the windows&lt;a class="footnote-ref" href="https://blog.trueelena.org#fn1" id="fnref1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; I’ve prepared a
sturdy cardboard panel that I can leave on a table on the balcony,
hopefully safe from the rain, but well exposed to the sun.&lt;/p&gt;
&lt;p&gt;And then made a quick test, and realized that without the window glass
in front, the black strip used to cover the unexposed half of the sample
doesn’t lay flat and lets some sun in, so I used an old cheap&lt;a class="footnote-ref" href="https://blog.trueelena.org#fn2" id="fnref2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;
glass frame instead of the panel.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The contents of an order from a fountain pen shop, spread out on a table: a couple of cheap pens, a couple bottles of ink, a converter, a small ritter sport chocolate and a bag full of 5 ml vials with 2 ml of ink each, and a thank-you note from the seller (Steffi)." class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/loot.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;The next step, already in January, was mentioning in a fountain-pen
enthusiasts forum that I planned such a test, and asking if people were
interested in having me buy a few samples of more inks when I was
buying my next pen.
The word “enthusiasts” is probably a hint of the reason why soon
afterwards I received a package with the pen I had planned to buy, its
converter, and a &lt;em&gt;couple dozens&lt;/em&gt; ink samples.
And then a couple envelopes with additional samples of inks that weren’t
available on the shops, from said enthusiasts.&lt;/p&gt;
&lt;p&gt;Added to the inks I already had acquired since the last lightfastness
test, it meant that they couldn’t all fit in one single page, and thus I
had some room to add some inks I had already tested: some were requests,
and for others I tried to select ones that felt relevant.
Since I’m changing the test setup, I’ve decided I should probably keep
doing this until I’ve tested again all of the inks I still have
available.&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_03-15.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_03-15.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;For the paper, I’ve used A4 sheets of &lt;a href="https://www.clairefontaine.com/gb/4350-papier-dessin-croquis-160g-1685c.html"&gt;Clairefontaine Dessin Croquis
160 g/m²&lt;/a&gt;,
one of my staples that I’m sure I will have available in the next years,
printed with a dot pattern with a laser printer, using &lt;a href="https://blog.trueelena.orgpointed-paper-4mm-a4.pdf"&gt;this pdf&lt;/a&gt;.
And as for the pen I’ve used a fresh Brause n°361 nib: loading a fountain pen
with all of these inks wouldn’t be a reasonable effort, and the 361 is
one of the writing implements I use most anyway. I also used a glass pen
to fill a couple of squares on the paper with more ink.
One side of each sheet was then covered with a strip of 300 g/m² black
paper (also from Clairefontaine), kept in place with three dots of
non-permanent two sided tape, put in the frame and set out in the sun on
the morning of 2026-03-20, the day of the spring equinox.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/liquid_resistance_tests.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;While I was filling the sheet for the lightfastness tests, I decided to
also prepare a second set of sheet, for a liquid resistance drop test.&lt;/p&gt;
&lt;p&gt;On each line, beside the name of the ink, I added five sets of crossing
parallel lines, and let everything dry for a few days.&lt;/p&gt;
&lt;p&gt;Then I used a syringe to put a drop of a liquid on each set of lines,
waited for it to be absorbed into the paper and to dry, at least
overnight, but sometimes also for a day or two (life happened), and then
looked at the results and did the next test.&lt;/p&gt;
&lt;p&gt;The first liquid was water, with the usual wild difference between
washable and permanent inks, and all of the intermediate possibilities.&lt;/p&gt;
&lt;p&gt;The second liquid was isopropyl alcohol, and I was surprised to see
that, with very few exceptions, most inks didn’t change at all. I
wonder whether that’s related to the fact that instead of forming a drop
it was absorbed almost immediately into the paper, and dried in a very
short time.&lt;/p&gt;
&lt;p&gt;The third liquid was hydrogen peroxide: beside the individual results I
noticed that its column yellowed visibly; I wonder whether that means
that the paper I used has optical brighteners, and it will also yellow
under the sun: that wouldn’t be ideal, but it would also be a surprise,
for paper that is acid free and sold for arts.&lt;/p&gt;
&lt;p&gt;The fourth liquid was citric acid, by mixing a bit less than a teaspoon
of citric acid granules in just enough very warm water (heated to 70°C,
i.e. the lowest temperature available on my kettle) to dissolve most of
the acid. I forgot that I had some old PH strips until one hour after
I’ve put the drop on the paper, and I don’t know whether something had
changed, but when I did remember about them it showed a deep red between
1 and 2. I don’t think I can &lt;em&gt;trust&lt;/em&gt; those strips too much, however.&lt;/p&gt;
&lt;p&gt;This backfired badly: the drop of citric acid never dried out, but
formed a sticky paste that prevented me from scanning the results,
and I’m not sure whether I’ll do the last test, which was supposed to be
household bleach.&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/liquids_a_3.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/liquids_b_3.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;Luckily I had scanned the partial results, and they are shown here.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_03-20.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_03-20.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;After one full day with plenty of sun, nothing really had changed,
except possibly for a vague hint that the Herbin Bleu Myosotis may have
have been a bit lighter than it started, but it may also have been a
suggestion.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_03-23.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_03-23.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;After three days, however, some results started to show, with the most
fugitive inks starting to be visibly changed, becoming either paler or
in some case duller.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_03-27.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_03-27.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;And the full week showed more of that, with a few more inks starting to
show visible change.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_04-04.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_04-04.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;After two weeks the paper had significantly yellowed, something I did
not expect from drawing paper (and which means that I will probably use
a different paper when making similar tests in the future).&lt;/p&gt;
&lt;p&gt;As for the inks, there were a couple more inks with visible changes, but
mostly it was more of the same as seen in the previous week.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_04-10.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_04-10.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;Three weeks started to show changes in the black and most irongall inks, and of course more changes in the even less resistant inks.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_a_04-17.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="see below" class="align-center" src="https://blog.trueelena.org/blog/2026/03/28-ink_lightfastness_tests_2026/lightfastness_b_04-17.jpg" style="width: 80.0%;" /&gt;&lt;/p&gt;
&lt;p&gt;Week four saw a bit more clouds and rain than the first few weeks, and
there weren’t big changes, but mostly more of what had already started
to happen earlier.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;These are the inks I’ve tested, and here I’ll add notes on the results,
as soon as they will be available, keeping this section updated.&lt;/p&gt;
&lt;p&gt;When nothing is mentioned, it means that there were no changes, either
under the light or under the various liquids.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Lamy Sepia&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After one week it started to be just slightly paler, more so after
three weeks.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Sheaffer Skrip Red&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After one week it started to be just slightly paler, more so after
three weeks.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Waterman Audacious Red&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After three days it started to be just slightly paler, after a week
visibly so. After four weeks it was very pale.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Waterman Harmonious Green&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide drop looks a bit lighter than the one with just
water.&lt;/p&gt;
&lt;p&gt;After one week it started to be just slightly paler, more so after
three weeks. After four weeks it was very pale.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Waterman Mysterious Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide drop is significantly lighter and tends towards
green.&lt;/p&gt;
&lt;p&gt;After two weeks it started to be just slightly paler, after three
weeks it was more gray. After four weeks it was very pale.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Waterman Serenity Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide drop is almost completely bleached to a light yellow.&lt;/p&gt;
&lt;p&gt;After one week it started to be a bit duller. After four weeks it was
paler and duller.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Visconti Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After one week it was visibly duller, looking darker than the
original. After three weeks it was duller, and lighter.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Montblanc Royal Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide drop is almost completely bleached to a light
yellow.&lt;/p&gt;
&lt;p&gt;After one week it started to be just slightly duller, more so after
two weeks. After three weeks it was also paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Montblanc Mystery Black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be a bit paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Aurora Nero&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be a bit more brown.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Online Duft Blueberry&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop looks very washed out, although a
hint of the original shape can be guessed; the hydrogen peroxide drop
is almost completely bleached to a light yellow.&lt;/p&gt;
&lt;p&gt;After one week it was visibly paler and duller. After three weeks
significantly so.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Forever Ink - Smoky Mauve&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Forever Ink - Honey Pot&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Forever Ink - Coral Blaze&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Forever Ink - Red Ochre&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Graphite&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Rustic Brown&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be very slightely paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine China Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide drop is almost completely bleached to a light
yellow.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be paler and duller.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Diamine Inkvent Purple Edition - Glacier&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, there is a drop of uniform colour, but it
maintains a somewhat recognisable shade of the original shape.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be lighter.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Fountainfeder STEVE&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, there is a drop of uniform colour, but it
maintains a somewhat recognisable shade of the original shape.&lt;/p&gt;
&lt;p&gt;After two weeks the base colour had changed to a pink rather than
purple.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Pilot Iroshizuku Syo Ro&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, there is a drop of uniform colour, but it
maintains a somewhat recognisable shade of the original shape.&lt;/p&gt;
&lt;p&gt;After four weeks it was very slightely paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Pilot Iroshizuku Shin-Kai&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, there is a drop of uniform colour, but it
maintains a somewhat recognisable shade of the original shape.&lt;/p&gt;
&lt;p&gt;After two weeks it had become lighter and more purple. After four
weeks it was a purple gray.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Rohrer &amp;amp; Klingner IG Ebony&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, there is a drop of uniform colour, but it
maintains a recognisable shade of the original shape; under
hydrogen peroxide the shade is significantly lighter.&lt;/p&gt;
&lt;p&gt;After four weeks it was a bit lighter&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;KWZ IG Orange&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide drop is significantly bleached to a light orange.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Kallipos.de Schwarze Eisengallus-Tinte&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water stains the paper, leaving however the original shape quite
visible; is it almost completely bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be very slightely lighter.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Kallipos.de Blaue Eisengallus-Tinte&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water stains the paper, leaving however the original shape quite
visible; is it almost completely bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After two weeks it had started to become lighter and more gray.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Rohrer &amp;amp; Klingner IG Salix&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water stains the paper, leaving however the original shape quite
visible; is it almost completely bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After two weeks it had become lighter and significantly more gray.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Rohrer &amp;amp; Klingner IG Scabiosa&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water stains the paper with a significant purple spot, leaving
however the original shape quite visible; is is a bit bleached by
hydrogen peroxide, but still quite readable.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Pelikan Edelstein Tanzanite&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, but
there is a visible trace of the original shape.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be slightly paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Montblanc Burgundy Red&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, with
just a hint of the original shape; slightly bleached by hydrogen
peroxide.&lt;/p&gt;
&lt;p&gt;After three weeks it started to be paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Cifra inchiostro finissimo verde alla lavanda&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot;
quite bleached to a light yellowish green by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After one week it was visibly paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Sennelier Abstract acrylic ink 917 purple&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;The Feather Pen Ink&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Eloquentia Inchiostro nero&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document BlueGrey&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Brown&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Fuchsia&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Grau&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Green Grey&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Light Grey&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Moosgrün&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Orange&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Purpurviolett&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Urban Sienna&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;KWZ Sheen Machine&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; the
hydrogen peroxide bleached away the red sheen. This was one of the
only two inks to react to isopropyl alcohol, which caused a pale cyan
halo around the lines.&lt;/p&gt;
&lt;p&gt;After three days it was still perfectly readable, but had visibly
lost some red sheen, after one week the red had completely gone and
it looked very dark blue (but still shiny)&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;KWZ Walk over Vistula&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After four weeks it looked a bit &lt;em&gt;darker&lt;/em&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;KWZ Warsaw Dreaming&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Octopus Neon Violett&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water very lightly stains the paper, leaving however the original
shape quite visible. The other ink that reacted to isopropyl alcohol,
with a pale purple halo around the lines.&lt;/p&gt;
&lt;p&gt;After two weeks it was paler, more pink.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Octopus Write &amp;amp; Draw Elephant Black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Platinum blue black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water stains the paper, leaving however the original shape quite
visible; it is significantly bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After three weeks it started to become gray.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Pelikan 4001 Brillant-Schwarz&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;p&gt;After three weeks it was a bit more brown than black.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Pelikan 4001 Blau-Schwarz&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water stains the paper, leaving however the original shape quite
visible; it is significantly bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After three weeks it started to become gray.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Pelikan 4001 Königsblau&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, with
just a hint of the original shape; significantly bleached by hydrogen
peroxide.&lt;/p&gt;
&lt;p&gt;After three days it had started to be slightly paler.
After three weeks it was significantly desaturated.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Herbin Bleu Myosotis&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform pink spot,
significantly bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After three days it was already visibly paler, after one week it was
a pale grey.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Faber Castell Royal Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, with
just a hint of the original shape; significantly bleached by hydrogen
peroxide.&lt;/p&gt;
&lt;p&gt;After three days it was slightly duller, after two weeks definitely
so.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Koh-I-Noor Fountain pen ink blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, with
just a hint of the original shape; significantly bleached by hydrogen
peroxide.&lt;/p&gt;
&lt;p&gt;After three days it had started to be slightly paler, more so after
one week when it had also turned grey. After four weeks it was very
pale.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Koh-I-Noor Document Ink Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Koh-I-Noor Document Ink Black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Water leaves a very light stain, but the original shape doesn’t look
changed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;DeAtramentis Document Black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Waterman Intense Black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, with
a trace of the original shape still visible; very lightly bleached by
hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After three weeks it started to look a bit more brown.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Herbin Perle Noir&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot, with
a trace of the original shape still visible.&lt;/p&gt;
&lt;p&gt;After three weeks it started to look a bit more brown.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Parker Quink black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Platinum Carbon black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Rohrer &amp;amp; Klingner Documentus Black&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Sailor Pigment Kiwaguro&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Platinum Dyestuff Red&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Not resistant to water, the drop becomes an uniform colour spot; very
lightly bleached by hydrogen peroxide.&lt;/p&gt;
&lt;p&gt;After three weeks it was a bit paler.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Noodler’s Eternal Polar Blue&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;section class="footnotes footnotes-end-of-document"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn1"&gt;&lt;p&gt;which would be spend the day covered by mostly closed
shutters anyway, because they receive quite a bit of direct sun, and
we don’t want that to enter the house during the summer.&lt;a class="footnote-back" href="https://blog.trueelena.org#fnref1"&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li id="fn2"&gt;&lt;p&gt;and thus, I hope, not especially UV-filtering.&lt;a class="footnote-back" href="https://blog.trueelena.org#fnref2"&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
    &lt;/section&gt;
&lt;/article&gt; </description> 
	<pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Dowland: Digital gardening</title>
	<guid>https://jmtd.net/log/gardening/</guid>
	<link>https://jmtd.net/log/gardening/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/jmtd.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;I was reading &lt;a href="https://alexwlchan.net/2026/mosaic/"&gt;a post&lt;/a&gt; on &lt;a href="https://alexwlchan.net/"&gt;Alex Chan's
website&lt;/a&gt;&lt;sup id="fnref:1"&gt;&lt;a href="https://jmtd.net/log/#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; that referenced the concept of
&lt;a href="https://tomcritchlow.com/2019/02/17/building-digital-garden/"&gt;digital gardens&lt;/a&gt;,
a concept/analogy for organising information which dates back to the 90s.
This old concept is getting new traction today by contrasting the approach
with "endless stream" as used and abused by social media, but also how blogs
are typically presented.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This site&lt;/em&gt;, my homepage, has a blog, and that's the bit that most people who
interact with the site will experience. Partly, because it's the bit that gets
syndicated out: via &lt;a href="https://jmtd.net/log/feed/"&gt;feeds&lt;/a&gt;; on &lt;a href="https://planet.debian.org"&gt;Planet
Debian&lt;/a&gt; and downstream from it; once upon a time on
Twitter; nowadays on &lt;a href="https://pleroma.debian.social/jmtd"&gt;the Fediverse&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However there's more to my homepage than that. The rest of it may be of little
interest to anyone beside me, but it's useful to me, at least. So I may switch
focus a little bit from mainly writing blog posts, and tend to the rest of the
garden a bit more.&lt;/p&gt;

&lt;p&gt;Some recent seeding and pruning:
Recently my guest status at Newcastle University came up for renewal, so I
wrote down my goals in the Historic Computing Committee for the next year or
so, and put them here: &lt;a href="https://jmtd.net/nuhcc/"&gt;nuhcc&lt;/a&gt;. I've also been pondering what I'm up to in
&lt;a href="https://jmtd.net/debian/"&gt;Debian&lt;/a&gt; at the moment, so took some time to add my current projects to
that page.&lt;/p&gt;
&lt;div class="footnotes"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
I'm reminded that I should really publish a "blog roll" of cool
  blogs I'm following at the moment, of which Alex Chan's is one.&lt;a href="https://jmtd.net/log/#fnref:1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Fri, 27 Mar 2026 22:05:39 +0000</pubDate>

</item> 
<item>
	<title>Bits from Debian: New Debian Developers and Maintainers (January and February 2026)</title>
	<guid>tag:bits.debian.org,2026-03-27:/2026/03/new-developers-2026-03.html</guid>
	<link>https://bits.debian.org/2026/03/new-developers-2026-03.html</link>
     <description>  &lt;img src="http://planet.debian.org/heads/dwn.png" width="77" height="85" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;The following contributors got their Debian Developer accounts in the last two
months:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jongmin Kim (jmkim)&lt;/li&gt;
&lt;li&gt;Yifei Zhan (yifei)&lt;/li&gt;
&lt;li&gt;Sébastien Noel (twolife)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following contributors were added as Debian Maintainers in the last two
months:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Andreas Dolp&lt;/li&gt;
&lt;li&gt;Dandan Zhang&lt;/li&gt;
&lt;li&gt;M Hickford&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Congratulations!&lt;/p&gt; </description> 
	<pubDate>Fri, 27 Mar 2026 22:00:00 +0000</pubDate>

</item> 
<item>
	<title>Paul Tagliamonte: librtlsdr.so for fun and profit</title>
	<guid>https://k3xec.com/sparky-rtlsdr/</guid>
	<link>https://k3xec.com/sparky-rtlsdr/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/paultag.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;div class="hz-alert-ok"&gt;
Interested in future updates? Follow me on mastodon at
&lt;a href="https://soylent.green/@paul"&gt;@paul@soylent.green&lt;/a&gt;. Posts about
&lt;code&gt;hz.tools&lt;/code&gt; will be tagged
&lt;a href="https://soylent.green/@paul/tagged/hztools"&gt;#hztools&lt;/a&gt;.&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;It’s well known and universally agreed that radios are cool. Among the
contested field of coolest radios, Software Defined Radios (SDRs) are
definitely the most interesting to me. Out of all of my (entirely too many)
SDRs I own, the &lt;code&gt;rtlsdr&lt;/code&gt; is still my #1. It’s just &lt;em&gt;good&lt;/em&gt;. It’s a great price,
extremely capable, reliable, well-supported, and compact. Why bother with
anything else? Sure, it can’t transmit, uses a (fairly weird) &lt;a href="https://k3xec.com/packrat-processing-iq/#rtl-sdr"&gt;8 bit unsigned
integer IQ representation&lt;/a&gt;,
limited sampling rate, limited frequency range – but even with all that, it’s
still the radio I will pack first. Don’t get me wrong, I love my Ettus radios,
PlutoSDRs, HackRFs, my AirspyHF+ - they’re great! I just always find myself
falling back to an &lt;code&gt;rtl-sdr&lt;/code&gt;, every time.&lt;/p&gt;
&lt;p&gt;Perhaps the best reason to use an &lt;code&gt;rtlsdr&lt;/code&gt; is the absolutely mind-boggling
amount of cool stuff people have written for it. The &lt;code&gt;rtlsdr&lt;/code&gt; API is super easy
to use, widely supported if you’re building on top of existing radio processing
frameworks – it’s still a &lt;em&gt;shock&lt;/em&gt; to me when something omits &lt;code&gt;rtlsdr&lt;/code&gt; support.&lt;/p&gt;
&lt;h1 id="sparky"&gt;sparky&lt;/h1&gt;
&lt;p&gt;Over the last 7 years, I’ve been learning about radios – I got my ham radio
license (&lt;code&gt;de K3XEC&lt;/code&gt;), &lt;a href="https://k3xec.com/christmas/"&gt;hacked&lt;/a&gt;
&lt;a href="https://k3xec.com/power-output/"&gt;on&lt;/a&gt; &lt;a href="https://k3xec.com/hztools/"&gt;some&lt;/a&gt;
&lt;a href="https://k3xec.com/td158/"&gt;cool&lt;/a&gt; &lt;a href="https://k3xec.com/su68g/"&gt;stuff&lt;/a&gt; where I’ve
learned how radios work by “doing”, and even was lucky enough to give my first
rf-centric &lt;a href="https://k3xec.com/paging-all-radio-curious-hackers/"&gt;talk at districtcon&lt;/a&gt;.
Embarrassingly, I still haven’t gotten around to learning how the fancy stuff
like &lt;a href="https://www.gnuradio.org/"&gt;GNU Radio&lt;/a&gt; works. I’m sure I’m going to love
it when I do.&lt;/p&gt;
&lt;p&gt;As part of this, I’ve also cooked up some very unprofessional formats and
protocols I use for convenience. Locally, all my on-disk captures are stored in
&lt;a href="https://k3xec.com/rfcap/"&gt;rfcap&lt;/a&gt; or more recently &lt;a href="https://k3xec.com/arf/"&gt;arf&lt;/a&gt;,
while direct SDR access at my house is almost entirely a mix of
the widely used &lt;a href="https://k3xec.com/rtl-tcp/"&gt;rtl-tcp&lt;/a&gt; protocol, and my
“&lt;code&gt;riq&lt;/code&gt;” protocol (post on this coming soon). Both &lt;code&gt;rtl-tcp&lt;/code&gt; and &lt;code&gt;riq&lt;/code&gt; operate
over the network, so I don’t have to bother with plugging things into USB ports,
and I can share my radios with &lt;a href="https://notes.pault.ag/tpl/"&gt;my friends&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of that work sits in my current generation of radio processing code,
“sparky” (a reference to
&lt;a href="https://en.wikipedia.org/wiki/Spark-gap_transmitter"&gt;spark-gap transmitters&lt;/a&gt;),
which is a heap of Rust, supporting everything from &lt;code&gt;no_std&lt;/code&gt; for embedded
experiments, conditional support for interfacing with all the radios I
own, and &lt;code&gt;tokio&lt;/code&gt;-based async support in addition to blocking i/o
for highly concurrent daemons. This quickly advanced beyond my old Go-based
code (&lt;a href="https://github.com/hztools/go-sdr"&gt;hz.tools/go-sdr&lt;/a&gt;), which I archived
so I can focus on learning. I still think Go is a great language to write RF
code in – but I can’t focus on that tech tree anymore.&lt;/p&gt;
&lt;p&gt;Of course, this now poses a new problem – no one supports my format(s) or
radio protocol(s), since, well, I’m the only one using them. I’ve committed a
fair amount of my hardware to this setup, and yanking it from the rack to try
something out does pose a bit of a pickle. This isn’t a huge deal for learning,
but it does make it tedious to try out something from the internets.&lt;/p&gt;
&lt;h1 id="librtlsdrso"&gt;librtlsdr.so&lt;/h1&gt;
&lt;p&gt;Thankfully, Rust has robust support for
&lt;a href="https://faultlore.com/blah/c-isnt-a-language/"&gt;wrap[ping itself] in a grotesque simulacra of C’s skin and mak[ing its] flesh undulate&lt;/a&gt;,
which is an attractive nuisance if i’ve ever seen one. Naturally, my ability
to restrain myself from engaging in ill-advised rf adventures is basically
zero, so it’s time to do the thing any similarly situated person would do –
reimplement the API and ABI of &lt;code&gt;librtlsdr.so&lt;/code&gt;, backed with &lt;code&gt;sparky&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;Since enumeration of devices is going to be annoying (specifically, they’re
over the network), I decided early-on to rely on an explicit list of
devices via a configuration file. I’d rather only load that once so programs
don’t get confused, so I opted to use a
&lt;a href="https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_26.html"&gt;CTOR&lt;/a&gt;
to run a stub when the ELF is linked at runtime.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-rust"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;// lightly edited for clarity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[used]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[expect(unused)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[unsafe(link_section = &lt;/span&gt;&lt;span style="color: #e6db74;"&gt;".init_array"&lt;/span&gt;&lt;span style="color: #75715e;"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;pub&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;INITIALIZE&lt;/span&gt;: &lt;span style="color: #a6e22e;"&gt;extern&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"C"&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;fn&lt;/span&gt;() &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; sparky_rtlsdr_ctor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;pub&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"C"&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;fn&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;sparky_rtlsdr_ctor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; config: &lt;span style="color: #a6e22e;"&gt;Config&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; Ok(config_bytes) &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; std::fs::read(&lt;span style="color: #e6db74;"&gt;"/etc/sparky-rtlsdr.toml"&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; toml::from_slice(&lt;span style="color: #f92672;"&gt;&amp;amp;&lt;/span&gt;config_bytes).unwrap()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; } &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; Config { device: &lt;span style="color: #a6e22e;"&gt;vec&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;[] }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;CONFIG&lt;/span&gt;.set(config);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, it’s time to start with the basics. Opening and closing a handle using
&lt;code&gt;rtlsdr_open&lt;/code&gt; and &lt;code&gt;rtlsdr_close&lt;/code&gt;. Given we don’t control the runtime, and the
&lt;code&gt;rtl-sdr&lt;/code&gt; device handle is opaque (for good reason!), I opted to smuggle a rust
&lt;code&gt;Box&amp;lt;Device&amp;gt;&lt;/code&gt; non-FFI safe heap-allocated struct through the device handle
pointer, and let C take ownership of the &lt;code&gt;Box&lt;/code&gt;. No one should be looking in
there anyway.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-rust"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;// lightly edited for clarity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;pub&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"C"&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;fn&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;rtlsdr_open&lt;/span&gt;(dev: &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; Handle, index: &lt;span style="color: #66d9ef;"&gt;u32&lt;/span&gt;) -&amp;gt; &lt;span style="color: #a6e22e;"&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; config &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;CONFIG&lt;/span&gt;.device[index &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;usize&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; sdr &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;match&lt;/span&gt; config.load() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; Ok(v) &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; v,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; Err(err) &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; handle &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; Box::new(Handle { config, sdr });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; { &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;dev &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; Box::into_raw(handle) };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;pub&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"C"&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;fn&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;rtlsdr_close&lt;/span&gt;(dev: &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; Handle) -&amp;gt; &lt;span style="color: #a6e22e;"&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; dev &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; { Box::from_raw(dev) };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; drop(dev);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With that in place, we can chip away at the API surface, translating calls
as best as we can. I won’t bother listing it all, since it’s not very
interesting – but here’s an example implementation of &lt;code&gt;rtlsdr_set_sample_rate&lt;/code&gt;
and &lt;code&gt;rtlsdr_get_sample_rate&lt;/code&gt;. These calls are translating from an rtl-sdr
frequency (which is a &lt;code&gt;u32&lt;/code&gt; containing the value as Hz) into a sparky Frequency
type, and invoking &lt;code&gt;get_sample_rate&lt;/code&gt; or &lt;code&gt;set_sample_rate&lt;/code&gt; on the device’s
rust handle. Since each device implements the sparky &lt;code&gt;Sdr&lt;/code&gt; trait, the actual
underlying device doesn’t matter much here.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-rust"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;pub&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"C"&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;fn&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;rtlsdr_set_sample_rate&lt;/span&gt;(dev: &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; Handle, rate: &lt;span style="color: #66d9ef;"&gt;u32&lt;/span&gt;) -&amp;gt; &lt;span style="color: #a6e22e;"&gt;int&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; dev &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; { &lt;span style="color: #f92672;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;dev };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; rate &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; Frequency::from_hz(rate &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;i64&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; Err(err) &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; dev.sdr.set_sample_rate(dev.channel, rate) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #75715e;"&gt;#[unsafe(no_mangle)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;&lt;span style="color: #66d9ef;"&gt;pub&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"C"&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;fn&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;rtlsdr_get_sample_rate&lt;/span&gt;(dev: &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; Handle) -&amp;gt; &lt;span style="color: #66d9ef;"&gt;u32&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; dev &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;unsafe&lt;/span&gt; { &lt;span style="color: #f92672;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;mut&lt;/span&gt; &lt;span style="color: #f92672;"&gt;*&lt;/span&gt;dev };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;let&lt;/span&gt; freq &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;match&lt;/span&gt; dev.sdr.get_sample_rate(dev.channel) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; Ok(freq) &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; freq,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; Err(err) &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; freq.as_hz() &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;u32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After repeating this process for the rest of the stubs I could (and otherwise
setting error conditions if the functionality is not supported), I was ready to
try it out. Within sparky, I patched my “MockSDR” (basically a &lt;code&gt;Sdr&lt;/code&gt; traited
Mock type) to implement the same testmode IQ protocol that the RTL-SDR has, and
decided to see if &lt;code&gt;rtl_test&lt;/code&gt; from &lt;code&gt;apt&lt;/code&gt; without any changes could be fooled.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;$ rtl_test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;No supported devices found.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great, cool. No devices plugged in. Looks great. Let’s try it with my
&lt;code&gt;librtlsdr.so&lt;/code&gt; &lt;code&gt;LD_PRELOAD&lt;/code&gt;-ed into the binary first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;$ LD_PRELOAD=target/release/librtlsdr.so rtl_test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Found 1 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; 0: hz.tools, mock sdr, SN: totally legit no tricks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Using device 0: sparky mock sdr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Supported gain values (0):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Sampling at 2048000 S/s.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Info: This tool will continuously read from the device, and report if
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;samples get lost. If you observe no further output, everything is fine.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Reading samples in async mode...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;^CSignal caught, exiting!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;User cancel, exiting...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Samples per million lost (minimum): 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Outstanding. Even more outstandingly, if I change my testmode implementation to
skip samples, &lt;code&gt;rtl_test&lt;/code&gt; correctly reports the errors – I think it’s showing
promise! On to try the real endgame here – let’s have our new &lt;code&gt;librtlsdr.so&lt;/code&gt;
connect to an &lt;code&gt;rtl-tcp&lt;/code&gt; endpoint and see if &lt;code&gt;rtl_fm&lt;/code&gt; works:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-txt"&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;LD_PRELOAD=target/release/librtlsdr.so \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; rtl_fm -d 1 -s 120k -E deemp -M fm -f 90.9M | \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; ffplay -f s16le -ar 120k -i -
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Found 2 device(s):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; 0: hz.tools, mock sdr, SN: totally legit no tricks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt; 1: hz.tools, rtl-tcp, SN: node2.rf.lan:1202
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Using device 1: sparky rtltcp node2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Tuner gain set to automatic.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Tuned to 91170000 Hz.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Oversampling input by: 9x.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Oversampling output by: 1x.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Buffer size: 7.59ms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Sampling at 1080000 S/s.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display: flex;"&gt;&lt;span&gt;Output at 120000 Hz.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And there it was! Not the best audio quality (mostly due to my inability to
correctly read the &lt;code&gt;rtl_fm&lt;/code&gt; manpage to tune the filter and
downsample/oversampling rates to audio), but it’s &lt;em&gt;definitely&lt;/em&gt; passable.
I figured I’d try something that was a bit more interesting next – &lt;code&gt;gqrx&lt;/code&gt;,
since it’s super handy, I use it a ton, and will definitely amuse me to no
end. To my surprise and delight, &lt;code&gt;LD_PRELOAD=target/release/librtlsdr.so gqrx&lt;/code&gt;
wound up running, and I saw my devices pop right up in the setting menu:&lt;/p&gt;
&lt;img alt="" src="https://k3xec.com/imgs/sparky-rtlsdr/gqrx-settings.png" /&gt;
&lt;p&gt;Huge. Huge. Amazing. It did crash as soon as I tried to actually &lt;em&gt;use&lt;/em&gt; the
radio, but after fixing a few dangling bugs in the API surface (and some
assumptions I think some underlying gnuradio driver may be making that I need
to double check in the code), I was able to get a super solid stream of
broadcast fm radio, with gqrx being none the wiser. It thought it was
“just” talking to the device it knows as &lt;code&gt;rtl=1&lt;/code&gt;.&lt;/p&gt;
&lt;img alt="" src="https://k3xec.com/imgs/sparky-rtlsdr/gqrx-waterfall.png" /&gt;
&lt;p&gt;Nice. I can’t wait to try this with the rest of the rtl-sdr based tools I like
having around using my &lt;code&gt;riq&lt;/code&gt; protocol next. I don’t think that’ll be worth a
post, but hopefully I’ll get around to publishing details on that stack next.&lt;/p&gt;
&lt;h1 id="epilogue"&gt;epilogue&lt;/h1&gt;
&lt;p&gt;Well. That’s it. End of story. A bit anti-climatic, sure. While this new shim
will provide me endless minutes of mild amusement, I could see using this to
expose my sparky testing utilities via &lt;code&gt;librtlsdr.so&lt;/code&gt; – my “mock sdr” driver
allows for replaying captures off disk, which could be interesting to make sure
that signals are still properly decoded after changes, or instrument
performance changes (via SNR, BER, packets observed, etc) on reference samples
I have on my NAS. Maybe that’ll come in handy one day!&lt;/p&gt;
&lt;p&gt;Truth be told, I’m not sure I actually want to encourage anyone to do this for
real (although I think I’ll definitely be using it on my LAN to see what
happens). I also don’t have a repo to share – I don’t particularly feel with
dealing with the secondary effects of publishing &lt;code&gt;sparky&lt;/code&gt; (and &lt;code&gt;sparky-rtlsdr&lt;/code&gt;)
yet, since i’m still getting my feet under me on the radio aspect of all this.&lt;/p&gt;
&lt;p&gt;I’ll be sure to post updates if anything changes with this here (tagged
&lt;a href="https://k3xec.com/tags/sparky/"&gt;sparky&lt;/a&gt;) and at
&lt;a href="https://soylent.green/@paul"&gt;@paul@soylent.green&lt;/a&gt;.
I can’t wait to post more about some of the odd sidequests (like this one!)
i’ve completed over the last few years – I’ve been waiting to feel
confident that my work has matured and was withstood the new problems i’ve
thrown at it, and it largely has.&lt;/p&gt;
&lt;p&gt;It’s my hope that these projects (and this project in particular) has provided
a glimpse into the world of software defined radio for my systems friends, and
a bit about systems for my radio friends. It’s not &lt;em&gt;all&lt;/em&gt; magic, and I hope
someone out there feels inclined to have some fun with radios themselves!&lt;/p&gt; </description> 
	<pubDate>Fri, 27 Mar 2026 17:30:00 +0000</pubDate>

</item> 
<item>
	<title>Arturo Borrero González: New job at Chainguard</title>
	<guid>https://ral-arturo.org/2026/03/27/chainguard.html</guid>
	<link>https://ral-arturo.org/2026/03/27/chainguard.html</link>
     <description>  &lt;p&gt;&lt;img alt="Chainguard logo" src="https://ral-arturo.org/assets/chainguard-logo.png" /&gt;&lt;/p&gt;

&lt;p&gt;A few months ago, in June 2025, I joined &lt;a href="https://www.chainguard.dev"&gt;Chainguard&lt;/a&gt;, a company focused on software supply chain security.
This post is a reflection on how I got here, what I’ve been doing, and why this role feels like a natural
fit for my interests in Linux and open source technology.&lt;/p&gt;



&lt;h2 id="the-company-and-its-mission"&gt;The company and its mission&lt;/h2&gt;

&lt;p&gt;Chainguard’s mission is to make the software supply chain secure by default. The company is built around
the idea that the software we all depend on — from operating system packages to container base images — carries
hidden risk in the form of vulnerabilities, unverified provenance, and untrusted build processes.&lt;/p&gt;

&lt;p&gt;The company is perhaps best known for &lt;a href="https://www.chainguard.dev/chainguard-images"&gt;Chainguard Images&lt;/a&gt;: a catalog of minimal, hardened container
base images that are continuously rebuilt and kept free of known CVEs. Each image is accompanied by a signed
&lt;a href="https://www.cisa.gov/sbom"&gt;SBOM&lt;/a&gt; (Software Bill of Materials) and a verifiable &lt;a href="https://slsa.dev"&gt;provenance attestation&lt;/a&gt;, making it possible
to cryptographically verify what went into a given image and how it was built.&lt;/p&gt;

&lt;p&gt;Chainguard has an extensive catalog of software, and maintaining it up-to-date and CVE-free is a significant
engineering challenge.&lt;/p&gt;

&lt;h2 id="what-i-do"&gt;What I do&lt;/h2&gt;

&lt;p&gt;I joined the Chainguard Sustaining Engineering team as a Senior Software Engineer. We are responsible
for maintaining packages and images in the software catalog up-to-date and CVE-free. The core of the business, basically.&lt;/p&gt;

&lt;p&gt;We focus on the horizontal dimension of the catalog (pretty much all packages and images).&lt;/p&gt;

&lt;p&gt;With +30,000 packages and +2,000 images, this is indeed an interesting task.&lt;/p&gt;

&lt;p&gt;My role as Debian Developer, and my experiencie in the &lt;a href="https://ral-arturo.org/2025/04/17/lts.html"&gt;Debian LTS project&lt;/a&gt; was extremely valuable when joning this
new team.&lt;/p&gt;

&lt;h2 id="looking-ahead"&gt;Looking ahead&lt;/h2&gt;

&lt;p&gt;Software supply chain is truly a deep topic, gaining more and more relevance every day, especially as new technologies emerge
and get adopted everywhere.&lt;/p&gt;

&lt;p&gt;Since early in my career, I saw a recurrent problem of how companies, enterprises, or even governments, relate to and consume
open source software, in a reliable, secure way. I believe Chainguard is doing the right things in the ecosystem,
and I’m happy to be participating in the effort.&lt;/p&gt; </description> 
	<pubDate>Fri, 27 Mar 2026 08:00:00 +0000</pubDate>

</item> 
<item>
	<title>Samuel Henrique: I use curl with ECH btw (in Debian)</title>
	<guid>https://samueloph.dev/blog/i-use-curl-with-ech-btw-in-debian/</guid>
	<link>https://samueloph.dev/blog/i-use-curl-with-ech-btw-in-debian/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/samueloph.png" width="100" height="100" alt="" align="right" style="float: right;"&gt;  &lt;h4 id="tl-dr"&gt;tl;dr&lt;/h4&gt;
&lt;p&gt;This is an experimental feature that, for the first time, brings full ECH
support to curl on Debian using OpenSSL.&lt;/p&gt;
&lt;p&gt;Starting with &lt;strong&gt;curl 8.19.0-3+exp2&lt;/strong&gt; (Debian Experimental), you can now use
ECH, with HTTPS-RR and DoH for maximum privacy.&lt;/p&gt;
&lt;p&gt;curl 8.19.0-3+exp2 is quite fresh at the time of writing, bear in mind that your
repository might not have synced the package yet, all mirrors should have it by
March 27th 14:00 UTC.&lt;/p&gt;
&lt;pre class="giallo" style="color: #EBDBB2; background-color: #282828;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #928374; font-style: italic;"&gt;# defo.ie is a test server that confirms whether ECH was successfully used&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;curl&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; -v --ech&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; hard https://defo.ie/ech-check.php&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #928374; font-style: italic;"&gt;# For Encrypted Client Hello (ECH) + DNS over HTTPS (DoH)&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;curl&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; -v --ech&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; hard&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; --doh-url&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; https://1.1.1.1/dns-query https://defo.ie/ech-check.php&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;"--ech hard" tells curl to refuse the connection entirely if ECH cannot be negotiated.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Or, if you would like to try it out in a container:&lt;/p&gt;
&lt;pre class="giallo" style="color: #EBDBB2; background-color: #282828;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;podman&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt; run debian:experimental /bin/bash&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; -c&lt;/span&gt;&lt;span style="color: #A89984;"&gt; '&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt;apt install --update -t experimental -y curl &amp;amp;&amp;amp; curl -v --ech hard --doh-url https://1.1.1.1/dns-query https://defo.ie/ech-check.php&lt;/span&gt;&lt;span style="color: #A89984;"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(in case you haven't noticed, apt now has the &lt;code&gt;--update&lt;/code&gt; option for the
&lt;code&gt;upgrade&lt;/code&gt; and &lt;code&gt;install&lt;/code&gt; commands)&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="for-privacy"&gt;For Privacy&lt;/h1&gt;
&lt;p&gt;CloudFlare calls it "the last puzzle piece to privacy" in their must-read
announcement: &lt;a href="https://blog.cloudflare.com/announcing-encrypted-client-hello/" rel="noopener external" target="_blank"&gt;https://blog.cloudflare.com/announcing-encrypted-client-hello/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9849" rel="noopener external" target="_blank"&gt;Encrypted Client Hello (rfc9849)&lt;/a&gt; encrypts the
"which website are you connecting to?" part of the TLS handshake that was
previously visible in plaintext.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9460" rel="noopener external" target="_blank"&gt;HTTPS-RR (rfc9460)&lt;/a&gt; is a DNS record type that
publishes connection parameters for a service, including the public key clients
need to perform ECH.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc8484" rel="noopener external" target="_blank"&gt;DNS Over HTTPS (rfc8484)&lt;/a&gt; encrypts DNS queries
by tunneling them over HTTPS, hiding what domains you're looking up from
network observers.&lt;/p&gt;
&lt;p&gt;When all three operate together over a CDN with shared IP space, the target
domain name is hidden from passive observers; the HTTPS-RR record is queried
over DoH in order to &lt;a href="https://www.rfc-editor.org/rfc/rfc9848" rel="noopener external" target="_blank"&gt;retrieve the ECH key
(rfc9848)&lt;/a&gt; for the TLS handshake.&lt;/p&gt;
&lt;p&gt;Seems like quite an important feature, and in fact the major browsers have it
enabled for some time now, the trick is that they do not use OpenSSL (Chrome
uses BoringSSL and Firefox uses NSS).&lt;/p&gt;
&lt;p&gt;For everyone else, the only option is to patch OpenSSL or wait until 4.0.0 is
released, and so part of the reason Debian is the first distro to enable it
(curl + OpenSSL + ECH) is that the OpenSSL maintainer (Sebastian Andrzej
Siewior) packaged the alpha release just 3 days after it was published.&lt;/p&gt;
&lt;p&gt;Do not forget that ECH support is experimental and currently relies on the
alpha release of OpenSSL.&lt;/p&gt;
&lt;h1 id="wcurl-gets-it-too"&gt;wcurl Gets It Too&lt;/h1&gt;
&lt;p&gt;Considering &lt;a href="https://curl.se/wcurl/" rel="noopener external" target="_blank"&gt;wcurl&lt;/a&gt; is just a wrapper on curl, it gets
the feature for free:&lt;/p&gt;
&lt;pre class="giallo" style="color: #EBDBB2; background-color: #282828;"&gt;&lt;code&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #FABD2F;"&gt;wcurl&lt;/span&gt;&lt;span style="color: #D3869B;"&gt; --curl-options=&lt;/span&gt;&lt;span style="color: #A89984;"&gt;"&lt;/span&gt;&lt;span style="color: #B8BB26;"&gt;--ech hard --doh-url https://1.1.1.1/dns-query&lt;/span&gt;&lt;span style="color: #A89984;"&gt;"&lt;/span&gt;&lt;span style="color: #83A598;"&gt; $URL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you're using wcurl, you don't want to have to set parameters, this is just
to show that the feature is there and if you have a &lt;code&gt;.curlrc&lt;/code&gt; file, it can
enable the feature seamlessly.&lt;/p&gt;
&lt;h1 id="other-debian-releases"&gt;Other Debian Releases&lt;/h1&gt;
&lt;p&gt;Given the ECH feature requires OpenSSL &amp;gt;= 4, it will not make it to Debian 13,
having a small chance of going to Debian 13 Backports (emphasis on small).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It should get to Debian Unstable and Debian Testing within the next couple of
months&lt;/strong&gt; as the OpenSSL GA release happens and gets packaged, but you should be
able to install the package from Experimental in your Unstable and Testing
systems without issues. It will also be in Debian 14 once it becomes the new Stable.&lt;/p&gt;
&lt;h1 id="shoulders-of-giants"&gt;Shoulders of Giants&lt;/h1&gt;
&lt;p&gt;Stephen Farrell's presentation from OpenSSL Conference 2025 has a lot of
background on the work involved:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=wYQq8ozP3uE" rel="noopener external" target="_blank"&gt;Encrypted Client Hello – Lessons learned from trying to do something that was
probably too complicated&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;They have been working on implementing ECH in open-source projects for years,
something as big as this doesn't happen without lots of people dedicating both
their paid and free times over it.&lt;/p&gt;
&lt;p&gt;I ended up being the person who enabled it on Debian, which was pretty much the
least amount of work between everyone involved, but hey it's fun flipping the
switch and telling you about it.&lt;/p&gt;
&lt;h1 id="background"&gt;Background&lt;/h1&gt;
&lt;p&gt;Since 2025, the curl developers started organizing an yearly meeting with all
maintainers of curl in Operating Systems. The 2026 edition happened in March
26th:
&lt;a href="https://github.com/curl/curl/wiki/curl-distro-discussion-2026" rel="noopener external" target="_blank"&gt;https://github.com/curl/curl/wiki/curl-distro-discussion-2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Attendance was really good, and as you can imagine one of the topics of
discussion was ECH, in which it was pointed out that having OpenSSL 4 was
the main requirement but besides it nothing unusual was needed.&lt;/p&gt;
&lt;p&gt;In Debian Experimental, we have been enabling HTTPS-RR since March 2025, and
OpenSSL 4.0.0 alpha was packaged just recently (2026-03-13) by Sebastian
Andrzej Siewior, it's time for the next step.&lt;/p&gt;
&lt;p&gt;The curl distro meeting was just the motivation I needed to go ahead and
enable it in Debian Experimental, so as part of our Debian Brasil Weekly
Meetings I've prepared and uploaded the changes, while Carlos Henrique Lima
Melara worked on addressing a recent test regression for Debian Unstable.
Unfortunately sergiodj couldn't join and I'm sure he's jealous of the hacking
session now.&lt;/p&gt;
&lt;h1 id="appendix"&gt;Appendix&lt;/h1&gt;
&lt;p&gt;While writing this, I've noticed one of the authors of the CloudFlare blogpost
is the previous curl maintainer on Debian; Alessandro Ghedini let me take over
the maintenance back in 2021 and today curl is maintained by a team of 4
people, it's nice to see Alessandro's involvement.&lt;/p&gt; </description> 
	<pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Petter Reinholdtsen: The 2026 LinuxCNC Norwegian Developer Gathering</title>
	<guid>http://www.hungry.com/~pere/blog/The_2026_LinuxCNC_Norwegian_Developer_Gathering.html</guid>
	<link>http://www.hungry.com/~pere/blog/The_2026_LinuxCNC_Norwegian_Developer_Gathering.html</link>
     <description>  &lt;p&gt;&lt;a href="https://linuxcnc.org/"&gt;The LinuxCNC project&lt;/a&gt; continues
to thrive.  I believe this great software system for numerical control
of machines such as milling machines, lathes, plasma cutters, routers,
cutting machines, robots, and hexapods would benefit even more from
in-person developer gatherings.  Therefore, we plan to organise another
gathering this summer as well.&lt;/p&gt;

&lt;p&gt;We invite you to a small LinuxCNC and free software fabrication
workshop/gathering in Norway this summer, over the weekend starting
June 26th, 2026.  As last year, we maintain a slightly broader scope
and welcome people outside the LinuxCNC community.  As before, we
suggest to organise it as an
&lt;a href="https://en.wikipedia.org/wiki/Unconference"&gt;unconference&lt;/a&gt;,
where participants create the program upon arrival.&lt;/p&gt;

&lt;p&gt;The location is a metal workshop 15 minutes' drive from Gardermoen
airport (OSL), with plenty of space and a hotel just 5 minutes away by
car. We plan to fire up the barbecue in the evenings.  Please let us
know if you would like to join.  We track the list of participants on
&lt;a href="https://pad.efn.no/p/linuxcnc-2026-norway"&gt;a simple pad&lt;/a&gt;.
Please add yourself there if you are interested in joining.&lt;/p&gt;

&lt;p&gt;Our friends over at the
&lt;a href="https://codeberg.org/team_sonen/UiO_home_robotics"&gt;TS Robotics
team&lt;/a&gt; at the University of Oslo have offered to handle any money
involved with this gathering, that is, holding sponsor funds and
paying the bills.  We hope to secure enough sponsors to cover food, lodging,
and travel.  So far, Debian has offered to sponsor part of the
expenses, which should cover food and a bit more.  Please get in touch
if you would like to help sponsor the gathering.&lt;/p&gt;
 
&lt;p&gt;As usual, if you use Bitcoin and wish to show your support of my
activities, please send Bitcoin donations to my address
&lt;b&gt;&lt;a&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt; </description> 
	<pubDate>Thu, 26 Mar 2026 22:45:00 +0000</pubDate>

</item> 
<item>
	<title>John Goerzen: Artificial Intelligence: Shades of Gray</title>
	<guid>https://changelog.complete.org/?p=42503</guid>
	<link>https://changelog.complete.org/archives/42503-artificial-intelligence-shades-of-gray</link>
     <description>  &lt;p&gt;AI sure is a hot topic right now, and I see a lot of people arguing about it.  To a lot of people around here, I’m the “computer person” they know and I get asked a lot about AI.&lt;/p&gt;
&lt;p&gt;I’m going to suggest a lot of things can be true at once.  For instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLMs are changing how we work and will continue to do so.&lt;/li&gt;
&lt;li&gt;LLMs are vastly over-hyped by vested interests, and may be in a bubble.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or how about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Huge investment in GenAI is having many negative consequences, ranging from environmental to causing affordability problems in many industries that use hardware (ie, everywhere)&lt;/li&gt;
&lt;li&gt;Useful results can be had from models that run on local hardware, even battery-powered hardware, which may have negligible harm or even some benefit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GenAI is further concentrating wealth and power in megacorps, with the effect of squeezing out the smaller players even more.&lt;/li&gt;
&lt;li&gt;GenAI is lowering the cost of entry for people without a lot of resources already.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have sympathy for the naysayers; those that say it’s nothing but a stochastic parrot.  But I don’t have a lot of sympathy for the naysayers that deny ever using it; you can’t form a credible argument against something without having an understanding of it informed by experience.&lt;/p&gt;
&lt;p&gt;I also have sympathy for the cheerleaders.  I have seen some impressive things from AI; for instance, a story from an engineer who has a child with a rare disease without a credible cure.  The engineer did a lot of research on it, started feeding research papers into AI to analyze, and the AI started finding correlations between different areas of research that humans hadn’t yet found — leading to a positive result for the child.&lt;/p&gt;
&lt;p&gt;To be fair, I have rarely seen an AI deliver a 100% correct answer on anything with any real level of complexity.  I have seen it both waste more time than it saves, and save a ton of time.&lt;/p&gt;
&lt;p&gt;My point here is: It is neither always fantastic nor always terrible.&lt;/p&gt;
&lt;p&gt;Let me talk you through an example.&lt;/p&gt;
&lt;p&gt;I am a fan of inbox zero for email.  That is, the inbox should be empty.  Unfortunately, mine has 8000 messages in it.  According to the oldest messages in my inbox, I last had inbox zero 8 years ago.  But really, only a handful are older than 2020.  I guess something must have happened that year…&lt;/p&gt;
&lt;p&gt;I’ve been chipping away at this for quite some time now.  The problem is, there are certain emails in there that really do still need some action – maybe it’s photos to save off into our photo collection, for instance.  But when looking at things sorted by date or thread, there are old shipping confirmations next to phishing attempts and family photos.  One can’t just scan down the list.&lt;/p&gt;
&lt;p&gt;I’ve tried all the usual tricks, most of which involve selecting groups of message that are easy to bulk erase, or at least easy to scan visually for the occasional thing worth saving.  Sort by sender or subject line, for instance.  Then I can, for instance, delete all the old messages from the shopping sites I commonly use all at once.  But then they start using different senders and different subject lines and that doesn’t get all of them.  I’ve tried keyword searches for this sort of thing too.  Still, that got me down to about 8000 messages.&lt;/p&gt;
&lt;p&gt;So I thought: why not see if an LLM could help me classify these?  Maybe it could categorize them, and then I could look at emails grouped by category.&lt;/p&gt;
&lt;p&gt;I have one machine with a discrete GPU, an Nvidia RTX 4070.  It’s a desktop machine I don’t use all that often.  But I set up Ollama on it, running in a Docker container.  Ollama runs models locally.&lt;/p&gt;
&lt;p&gt;I should also mention at this point that we are solar-powered, and this time of year is a time of peak production of excess solar, because it is sunny and not much heat or AC is required.  So that machine is solar-powered and isn’t causing environmental harm.  In any case, charging the EV uses much more power than that GPU.&lt;/p&gt;
&lt;p&gt;I figured I would do this in two passes.  First, ask the LLM to classify each message (or a sampling of them would probably work too), letting it pick its own categories for each.  Then, look at the patterns that emerge and give it a single, much smaller, set of broad categories to use and rerun it over that.&lt;/p&gt;
&lt;p&gt;Then I can easily select messages from my Maildirs by category and process them in bulk.&lt;/p&gt;
&lt;p&gt;I used &lt;a href="https://github.com/OpenInterpreter/open-interpreter"&gt;open-interpreter&lt;/a&gt; pointing to that GPU on my network to help me write the scripts for this.  It didn’t get things right on its own; for instance, it didn’t call the Ollama API correctly, and insisted on appending “/cur” to the path to the Maildir (which was not going to fly with Python’s maildir module).  It took roughly an hour to classify those 8000 messages (or, as I had it do, the first 2000 characters of them), and then the same to do it a second time.  I had it output lines in the form of “filename\tcategory” and hand-wrote the shell script that processed those.&lt;/p&gt;
&lt;p&gt;In the end, was it useful?  Yes, quite.  Its classifications weren’t perfect (and it didn’t even follow my prompt perfectly; sometimes it would give me a long discussion on why it picked a certain category rather than just that category, and occasionally it picked categories not on the list).  But then, neither were my manual keyword searches.  So far I’ve gotten rid of nearly 1000 more messages.  Several categories were a “visual scan for sanity and then delete all” sort of thing.&lt;/p&gt;
&lt;p&gt;My emails never left my network.  I didn’t rely on a cloud AI to process them.  I didn’t contribute to global warming (this may have even been a case of saving energy, since it no doubt will offset quite a bit of manual time that would keep screens and room lights energized and so forth).  I used about as much energy as watching a movie on a TV.&lt;/p&gt;
&lt;p&gt;Did it complete the task for me entirely autonomously?  Also no.  AI isn’t a mind reader and it can’t possibly evaluate exactly what my thought process would be for a given task.  But it can do a decent enough job to save me some time.&lt;/p&gt;
&lt;p&gt;Still, this didn’t require hyperscaler datacenters.  AI even runs on-phone (Google Translate being one of the most useful AI-driven apps I’ve ever seen, and it can run on-device).&lt;/p&gt; </description> 
	<pubDate>Wed, 25 Mar 2026 04:12:18 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: A Shadow in Summer</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/0-7653-1340-5.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/0-7653-1340-5.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;A Shadow in Summer&lt;/cite&gt;, by Daniel Abraham&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Series:&lt;/td&gt;
    &lt;td&gt;Long Price Quartet #1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;Tor&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;March 2006&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;0-7653-1340-5&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Hardcover&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;331&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
&lt;cite&gt;A Shadow in Summer&lt;/cite&gt; is a high fantasy novel, the first of (as the
name implies) a completed four-book series. Daniel Abraham is perhaps
better known as half of the writing pair behind James S.A. Corey, author
of the &lt;a href="https://www.eyrie.org/~eagle/reviews/books/0-316-13467-8a.html"&gt;Expanse series&lt;/a&gt;. This was his first
novel.
&lt;/p&gt;

&lt;p&gt;
Otah was the sixth son of a Khai, sent like many of the unwanted later
children of the powerful to learn the secrets of the andat and be trained
as a poet. He learned his lessons well enough to reject the school and its
teachings and walk away.
&lt;/p&gt;

&lt;p&gt;
Amat Kyaan has worked her way up from nothing to become the senior
overseer of the foreign Galtic House Wilsin in the sun-drenched port city
of Saraykeht. Liat is her apprentice, distracted by young love. Maati is a
new apprentice poet, having endured his training and sent to learn from
Heshai how to eventually hold the andat Removing-The-Part-That-Continues,
better known as Seedless. None of them know they will find themselves
entangled in a plot to destroy the poet of Saraykeht and, through him, the
city's most potent economic tool.
&lt;/p&gt;

&lt;p&gt;
A poet in this world is not what we would think of a poet. They are, in
essence, magical slave-drivers who capture the essence of an andat, a
spirit embodying an idea that is coerced into the prison of volition and
obedience by the poet. The andat Seedless, the embodiment of the concept
of removing the spark of life, is central to the economic wealth of
Saraykeht in a way that is startling in its simplicity: Seedless can
remove the seeds from a warehouse full of cotton at a thought. This gives
Saraykeht a massive productivity advantage in the cotton trade.
&lt;/p&gt;

&lt;p&gt;
Seedless is also a powerful potential weapon. What he can do to cotton, he
could as easily do to any other crop, or to people. The Galts are not fond
of the independence and power of Saraykeht, but as long as the city
controls a powerful andat, they do not dare to attack it directly.
Indirectly, though... that's another matter.
&lt;/p&gt;

&lt;p&gt;
This is one of those fantasy novels with meticulous and thoughtful
world-building, careful and evocative prose, and a complex ensemble cast
of interesting characters that the novel then attempts to make utterly
miserable and complicit in their own misery. There should be a name for
this style of writing. It's not tragedy because the ending is not tragic,
precisely. It's not magic realism; the andats are openly magical, which
makes this clearly high fantasy. But Abraham approaches the story from the
type of realist frame that considers the pain and desperation of the
characters to be more interesting than their ability to overcome
challenges.
&lt;/p&gt;

&lt;p&gt;
Amat starts the story as an admirable, sharp-witted expert manager, so her
life is destroyed and she's subjected to sexual violence. Heshai loathes
himself and veers between a tragic figure and a wastrel as the story
systematically undermines opportunities for redemption. Maati is young and
idealistic, so of course every character in the book sets out to crush his
idealism under the weight of unforeseen consequences. There is a sad and
depressing love triangle, because this is exactly the sort of book that
has a sad and depressing love triangle. At the end of the novel, everyone
who survives is older and wiser in the sense that some stories seem to
think wisdom comes from the accumulation of trauma.
&lt;/p&gt;

&lt;p&gt;
I find books like this so immensely frustrating because their merits are
so clear. The world-building is careful and detailed in a way that
includes economic systems, unlike so much fantasy. It is full of small,
intriguing touches, such as the use of posture and gesture to communicate
the emotional valence of one's words. Abraham understands the moral
implications of poets and andats and the story tackles them head-on. The
writing flows beautifully and gave me a strong sense of the city. I wanted
to like this book for the obvious skill that went into it, and sometimes I
even managed.
&lt;/p&gt;

&lt;p&gt;
And yet, it's taken me three months to finish &lt;cite&gt;A Shadow in Summer&lt;/cite&gt;
because I simply do not want to spend this much time around miserable
people. I would get through one or two chapters in a night and then wanted
to read something happy or defiant or heroic, rather than watching
slow-motion train wrecks intermixed with desperate attempts to navigate
stifling layers of immoral systems. It's not that the story lacks a moral
compass. The characters are sincerely trying to make the world a better
place, with some success. It even delivers a happy ending of sorts. But so
much of the journey was watching the lives of the characters fall apart.
&lt;/p&gt;

&lt;p&gt;
I am completely unsurprised that some people loved this book. I'm still
intrigued enough by the world-building that I'm half-tempted to try to
read the sequel even after having to drag myself through this one. I had a
similar reaction to Abraham's &lt;a href="https://www.eyrie.org/~eagle/reviews/books/0-316-13467-8b.html"&gt;&lt;cite&gt;The
Dragon's Path&lt;/cite&gt;&lt;/a&gt;, though, so I think Abraham is just not for me. I may get
back to the Expanse at some point, but having to drag myself through both
of his solo novels I've tried, in two different series, probably indicates
an incompatibility between author and reader. That's a shame, given the
quality of the writing.
&lt;/p&gt;

&lt;p&gt;
Followed by &lt;cite&gt;A Betrayal in Winter&lt;/cite&gt;.
&lt;/p&gt;

&lt;p&gt;
Content notes: Sexual and reproductive violence as significant plot
elements.
&lt;/p&gt;

&lt;p&gt;Rating: 6 out of 10&lt;/p&gt; </description> 
	<pubDate>Tue, 24 Mar 2026 04:40:00 +0000</pubDate>

</item> 
<item>
	<title>Marco d'Itri: systemd has not implemented age verification</title>
	<guid>tag:https:,2026:id_473</guid>
	<link>https://blog.bofh.it/debian/id_473</link>
     <description>  &lt;img src="http://planet.debian.org/heads/md.jpg" width="96" height="95" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;This needs to be clear: systemd is under attack by a trolling campaign orchestrated by fascist elements. Nobody is forced to like or use systemd, but anybody who wants to pick a side should know the facts.&lt;/p&gt;

&lt;p&gt;Recently, the free software &lt;a href="https://en.wiktionary.org/wiki/Nazi_bar"&gt;Nazi bar&lt;/a&gt; crowd styling themselves as "concerned citizens" has tried to start a &lt;a href="https://en.wikipedia.org/wiki/Moral_panic"&gt;moral panic&lt;/a&gt; by saying that systemd is implementing age verification checks or that somehow it will require providing personally identifiable information.&lt;/p&gt;

&lt;p&gt;This is a lie: the facts are simply that the systemd &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemd-userdbd.service.html"&gt;users database&lt;/a&gt; has gained an optional "date of birth" field, which the desktop environments may use or not as they deem appropriate. Of course there is no "identity verification" or requirements to provide any data, which in any case would not be shared beyond authorized local applications.&lt;/p&gt;

&lt;p&gt;While the multiple recent bills proposing that general purpose operating systems implement age verification mechanisms are often concerning, both from a social and technical point of view, this is not the topic being discussed here. They are often suboptimal, but for a long time I have been opposing attempts to implement parental control at the network level and argued that it should be managed locally, by parents on their own machines: I cannot see why I should outright reject an attempt to implement the infrastructure to do that.&lt;/p&gt;

&lt;p&gt;If we want to keep age-appropriate controls out of the hands of centralized authorities, the alternative is giving families the means to manage it themselves: this is what this field enables. Whether desktop environments use it for parental controls, for birthday reminders, or for nothing at all, is their users' decision.&lt;/p&gt;

&lt;p&gt;By the way, the original UNIX users database has allowed storing PII in the &lt;a href="https://en.wikipedia.org/wiki/Gecos_field"&gt;GECOS field&lt;/a&gt; since it was invented in the '70s. Similar fields are also specified by many popular LDAP schemes: adding such an optional field is consistent with the UNIX tradition.&lt;/p&gt;

&lt;p&gt;And while we are at it, let's also refute the other smear campaign started by the same people: the systemd project is not accepting "AI slop". What happened is that &lt;a href="https://github.com/systemd/systemd/blob/main/AGENTS.md"&gt;a documentation file for the benefit of coding agents&lt;/a&gt; was added to the repository. To be clear: agents still cannot submit merge requests. The file itself remarks that all contributions must be reviewed in detail by humans, and this is basically the same policy used by the Linux kernel.&lt;/p&gt; </description> 
	<pubDate>Mon, 23 Mar 2026 15:47:22 +0000</pubDate>

</item> 
<item>
	<title>Benjamin Mako Hill: How taboo shapes knowledge production on Wikipedia</title>
	<guid>https://mako.cc/copyrighteous/?p=3351</guid>
	<link>https://mako.cc/copyrighteous/how-taboo-shapes-knowledge-production-on-wikipedia</link>
     <description>  &lt;img src="http://planet.debian.org/heads/mako.gif" width="65" height="93" alt="" align="right" style="float: right;"&gt;  &lt;p class="has-small-font-size"&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; I have not published blog posts about my academic papers over the past few years. To ensure that my blog contains a more comprehensive record of my published papers and to surface them for folks who missed them, I will periodically (re) publish blog posts about some “older” published projects. This post draws material from &lt;a href="https://blog.communitydata.science/lets-talk-about-taboo-a-new-paper-on-how-taboo-shapes-activity-on-wikipedia/"&gt;a previously published post&lt;/a&gt; by &lt;a href="https://zarine.net/"&gt;Kaylea Champion&lt;/a&gt; on &lt;a href="https://blog.communitydata.science/"&gt;the Community Data Science Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;



&lt;p id="block-419f7d04-082e-4c82-8605-89baefb2ee2d"&gt;Taboo subjects—such as sexuality and mental health—are as important to discuss as they are difficult to raise in conversation. Although many people turn to online resources for information on taboo subjects, censorship and low-quality information are common in search results. In two papers I recently published at CSCW—both led by Kaylea Champion—we presented a series of analyses showing how taboo shapes the process of collaborative knowledge building on English Wikipedia.&lt;/p&gt;



&lt;p id="block-419f7d04-082e-4c82-8605-89baefb2ee2d"&gt;The first study is a quantitative analysis showing that articles on taboo subjects are much more popular and are the subject of more vandalism than articles on non-taboo topics. In surprising news, we also found that they were edited more often and were of higher quality!&lt;/p&gt;



&lt;figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"&gt;&lt;div class="wp-block-embed__wrapper"&gt;

&lt;/div&gt;Short video of Kaylea’s presentation of the work given at Wikimania in August 2023.&lt;/figure&gt;



&lt;p id="block-2779c102-6740-41cc-a53f-e3fbe94131db"&gt;The first challenge we faced in conducting this work was identifying taboo articles. Kaylea had a brilliant idea for a new computational approach to doing so without relying on our individual intuitions about what qualifies as taboo (something we understood would be highly specific to our own culture, class, etc). Her approach was to make use of an insight from linguistics: &lt;em&gt;people develop euphemisms as ways to talk about taboos&lt;/em&gt; (i.e., think about all the euphemisms we’ve devised for death, or sex, or menstruation, or mental health).&lt;/p&gt;



&lt;p id="block-2779c102-6740-41cc-a53f-e3fbe94131db"&gt;We used this insight to build a new machine-learning classifier based on English Wiktionary definitions. If a ‘sense’ of a word was tagged as euphemistic, we treated the words in the definition as indicators of taboo. The end result was a series of words and phrases that most powerfully differentiate taboo from non-taboo. We then did a simple match between those words and phrases and the titles of Wikipedia articles. The topics were taboo enough that we were a little uncomfortable discussing them in our meetings! We built a comparison sample of articles whose titles are words that, like our taboo articles, appear in Wiktionary definitions.&lt;/p&gt;



&lt;p&gt;In the first paper, we used this new dataset to test a series of hypotheses about how taboo shapes collaborative production in Wikipedia. Our initial hypotheses were based on the idea that taboo information is often in high demand but that Wikipedians might be reluctant to associate their names (or usernames) with taboo topics. The result, we argued, would be articles that were in high demand but of low quality. &lt;/p&gt;



&lt;p&gt;We found that taboo articles are thriving on Wikipedia! In summary, we found that in comparison to non-taboo articles:&lt;/p&gt;



&lt;ul class="wp-block-list"&gt;
&lt;li&gt;Taboo articles are more popular  (&lt;em&gt;as expected&lt;/em&gt;).&lt;/li&gt;



&lt;li&gt;Taboo articles receive more contributions (&lt;em&gt;contrary to expectations&lt;/em&gt;).&lt;/li&gt;



&lt;li&gt;Taboo articles receive more low-quality contributions (&lt;em&gt;as expected&lt;/em&gt;).&lt;/li&gt;



&lt;li&gt;Taboo articles are higher quality (&lt;em&gt;contrary to expectations&lt;/em&gt;).&lt;/li&gt;



&lt;li&gt;Taboo article contributors are more likely to contribute without an account (&lt;em&gt;as expected&lt;/em&gt;), and have less experience (&lt;em&gt;as expected&lt;/em&gt;), but that accountholders are more likely to make themselves more identifiable by having a user page, disclosing their gender, and making themselves emailable (&lt;em&gt;all three of these are contrary to expectation&lt;/em&gt;!).&lt;/li&gt;
&lt;/ul&gt;



&lt;figure class="wp-block-image"&gt;&lt;img alt="" class="wp-image-3352" height="889" src="https://mako.cc/copyrighteous/wp-content/uploads/2026/03/screenshot-20260323_180937.png" width="916" /&gt;Image of the estimated qualiy of articles of the four articles in the second mixed-methods paper. Extreme dips reflect periods of frequent vandalism.&lt;/figure&gt;



&lt;p&gt;Kaylea attempted to understand these somewhat confusing results by designing a fantastic mixed-methods analysis that sought to unpack some of the nuance missing in the quantitative analysis by delving deep into the “life histories” of four articles on English Wikipedia: two on taboo topics related to women’s anatomy (&lt;a href="https://en.wikipedia.org/wiki/Clitoris"&gt;Clitoris&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Menstruation"&gt;Menstration&lt;/a&gt;) and two nontaboo articles chosen for comparison (&lt;a href="https://en.wikipedia.org/wiki/Cell_membrane"&gt;Cell membrance&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Philip_Pullman"&gt;Philip Pullman&lt;/a&gt;).&lt;/p&gt;



&lt;p&gt;Although the findings from the analysis can be difficult to summarize succinctly (as with many qualitative studies), we showed how the taboo example articles’ success was hard-won amid real challenges and attacks. The paper describes how challenges were overcome through resilient leadership, often provided by a single dedicated individual. The paper provides a template for how taboo can be—and frequently is—overcome by dedicated Wikipedians in ways that provide useful knowledge resources in real demand.&lt;/p&gt;



&lt;p&gt;For more details, visualizations, statistics, and more, we hope you’ll take a look at our papers, both linked below.&lt;/p&gt;



&lt;hr class="wp-block-separator has-alpha-channel-opacity" /&gt;



&lt;p class="has-small-font-size"&gt;The full citation for the papers are: (1) Champion, Kaylea, and Benjamin Mako Hill. 2023. “Taboo and Collaborative Knowledge Production: Evidence from Wikipedia.” &lt;em&gt;Proceedings of the ACM on Human-Computer Interaction&lt;/em&gt; 7 (CSCW2): 299:1-299:25. &lt;a href="https://doi.org/10.1145/3610090"&gt;https://doi.org/10.1145/3610090&lt;/a&gt;. (2) Champion, Kaylea, and Benjamin Mako Hill. 2024. “Life Histories of Taboo Knowledge Artifacts.” &lt;em&gt;Proceedings of the ACM: Human-Computer Interaction&lt;/em&gt; 8 (CSCW2): 505:1-505:32. &lt;a href="https://doi.org/10.1145/3687044"&gt;https://doi.org/10.1145/3687044&lt;/a&gt;. &lt;/p&gt;



&lt;p class="has-small-font-size"&gt;We have also released &lt;a href="https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/5OKEEO"&gt;replication materials for the paper&lt;/a&gt;, including all the data and code used to conduct the analyses.&lt;/p&gt;



&lt;p class="has-small-font-size"&gt;This blog post and the paper it describes are collaborative work by &lt;a href="https://kayleachampion.com/"&gt;Kaylea Champion&lt;/a&gt; and &lt;a href="https://mako.cc/academic/"&gt;Benjamin Mako Hill&lt;/a&gt;.&lt;/p&gt; </description> 
	<pubDate>Mon, 23 Mar 2026 09:33:53 +0000</pubDate>

</item> 
<item>
	<title>Vincent Bernat: Calculate “1/(40rods/hogshead) to L/100km” from your Zsh prompt</title>
	<guid>http://www.luffy.cx/en/blog/2026-zsh-calculator.html</guid>
	<link>https://vincent.bernat.ch/en/blog/2026-zsh-calculator</link>
     <description>  &lt;p&gt;I often need a quick calculation or a unit conversion. Rather than reaching for
a separate tool, a few lines of &lt;em&gt;Zsh&lt;/em&gt; configuration turn &lt;code&gt;=&lt;/code&gt; into a calculator.
Typing &lt;code&gt;= 660km / (2/3)c * 2 -&amp;gt; ms&lt;/code&gt; gives me &lt;code&gt;6.60457 ms&lt;/code&gt;&lt;sup id="fnref-marseille"&gt;&lt;a class="footnote-ref" href="https://vincent.bernat.ch#fn-marseille"&gt;1&lt;/a&gt;&lt;/sup&gt; without
leaving my terminal, thanks to the Zsh line editor.&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vincent.bernat.ch#the-equal-alias"&gt;The equal alias&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vincent.bernat.ch#the-quoting-problem"&gt;The quoting problem&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vincent.bernat.ch#automatic-quoting-with-zle"&gt;Automatic quoting with ZLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vincent.bernat.ch#storing-unquoted-history"&gt;Storing unquoted history&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id="the-equal-alias"&gt;The equal alias&lt;/h1&gt;
&lt;p&gt;The main idea looks simple: define &lt;code&gt;=&lt;/code&gt; as an alias to a calculator command. I
prefer &lt;a href="https://numbat.dev/" title="Numbat: a statically typed programming language for scientific computations"&gt;Numbat&lt;/a&gt;, a scientific calculator that supports unit conversions.
&lt;a href="https://qalculate.github.io/" title="Qalculate!: the ultimate desktop calculator"&gt;Qalculate&lt;/a&gt; is a close second.&lt;sup id="fnref-qalc"&gt;&lt;a class="footnote-ref" href="https://vincent.bernat.ch#fn-qalc"&gt;2&lt;/a&gt;&lt;/sup&gt; If neither is available, we fall back to
Zsh’s built-in &lt;em&gt;zcalc&lt;/em&gt; module.&lt;/p&gt;
&lt;p&gt;As the &lt;code&gt;alias&lt;/code&gt; built-in uses &lt;code&gt;=&lt;/code&gt; as a separator for name and value, we need to
alter the &lt;code&gt;aliases&lt;/code&gt; associative array:&lt;/p&gt;
&lt;div class="language-bash codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$+commands&lt;span class="o"&gt;[&lt;/span&gt;numbat&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;aliases&lt;span class="o"&gt;[=]=&lt;/span&gt;&lt;span class="s1"&gt;'numbat -e'&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$+commands&lt;span class="o"&gt;[&lt;/span&gt;qalc&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;aliases&lt;span class="o"&gt;[=]=&lt;/span&gt;&lt;span class="s1"&gt;'qalc'&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;autoload&lt;span class="w"&gt; &lt;/span&gt;-Uz&lt;span class="w"&gt; &lt;/span&gt;zcalc
&lt;span class="w"&gt;  &lt;/span&gt;aliases&lt;span class="o"&gt;[=]=&lt;/span&gt;&lt;span class="s1"&gt;'zcalc -f -e'&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With this in place, &lt;code&gt;= 847/11&lt;/code&gt; becomes &lt;code&gt;numbat -e 847/11&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id="the-quoting-problem"&gt;The quoting problem&lt;/h1&gt;
&lt;p&gt;The first problem surfaces quickly. Typing &lt;code&gt;= 5 * 3&lt;/code&gt; fails: Zsh expands the &lt;code&gt;*&lt;/code&gt;
character as a glob pattern before passing it to the calculator. The same issue
applies to other characters that Zsh treats specially, such as &lt;code&gt;&amp;gt;&lt;/code&gt; or &lt;code&gt;|&lt;/code&gt;. You
must quote the expression:&lt;/p&gt;
&lt;div class="language-bash-session codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'5 * 3'&lt;/span&gt;
&lt;span class="go"&gt;15&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We fix this by hooking into the Zsh line editor to &lt;strong&gt;quote the expression&lt;/strong&gt;
before executing it.&lt;/p&gt;
&lt;h2 id="automatic-quoting-with-zle"&gt;Automatic quoting with &lt;abbr title="Zsh Line Editor"&gt;ZLE&lt;/abbr&gt;&lt;/h2&gt;
&lt;p&gt;Zsh calls the &lt;code&gt;line-finish&lt;/code&gt; widget before submitting a command. We hook a
function that detects the &lt;code&gt;=&lt;/code&gt; prefix and quotes the expression:&lt;/p&gt;
&lt;div class="language-bash codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;_vbe_calc_quote&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BUFFER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"="&lt;/span&gt;*&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;typeset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;_vbe_calc_expr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BUFFER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# not used yet&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;BUFFER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"= &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;(q-)&lt;/span&gt;&lt;span class="si"&gt;${${&lt;/span&gt;&lt;span class="nv"&gt;BUFFER&lt;/span&gt;&lt;span class="p"&gt;#=&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;# &lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
add-zle-hook-widget&lt;span class="w"&gt; &lt;/span&gt;line-finish&lt;span class="w"&gt; &lt;/span&gt;_vbe_calc_quote
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When you type &lt;code&gt;= 5 * 3&lt;/code&gt; and press &lt;kbd&gt;↲&lt;/kbd&gt;, &lt;code&gt;_vbe_calc_quote&lt;/code&gt; strips the &lt;code&gt;=&lt;/code&gt;
prefix, quotes the remainder with the &lt;a href="https://manpages.debian.org/zshexpn.1.html#q~2" title="zshexpn(1) manual page"&gt;&lt;code&gt;(q-)&lt;/code&gt; parameter expansion flag&lt;/a&gt;,
and rewrites the buffer to &lt;code&gt;= '5 * 3'&lt;/code&gt; before Zsh submits the command. As a
bonus, you can save a few keystrokes with &lt;code&gt;=5*3&lt;/code&gt;! &#128640;&lt;/p&gt;
&lt;p&gt;You can now compute math expressions and convert units directly from your shell.
Zsh automatically quotes your expressions:&lt;/p&gt;
&lt;div class="language-bash-session codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1 + 2'&lt;/span&gt;
&lt;span class="go"&gt;3&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'pi/3 + pi |&amp;gt; cos'&lt;/span&gt;
&lt;span class="go"&gt;-0.5&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'17 USD -&amp;gt; EUR'&lt;/span&gt;
&lt;span class="go"&gt;14.7122 €&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'180*500mg -&amp;gt; g'&lt;/span&gt;
&lt;span class="go"&gt;90 g&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'5 gigabytes / (2 minutes + 17 seconds) -&amp;gt; megabits/s'&lt;/span&gt;
&lt;span class="go"&gt;291.971 Mbit/s&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'now() -&amp;gt; tz("Asia/Tokyo")'&lt;/span&gt;
&lt;span class="go"&gt;2026-03-22 22:00:03 JST (UTC +09), Asia/Tokyo&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'1 / (40 rods / hogshead) -&amp;gt; L / 100km'&lt;/span&gt;
&lt;span class="go"&gt;118548 × 0.01 l/km&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;figure&gt;&lt;div class="lf-media-outer"&gt;&lt;span class="lf-media-inner"&gt;&lt;img alt="“That's the way I like it!” says Grampa Simpson" class="lf-media lf-opaque" height="299" src="https://d2pzklc15kok91.cloudfront.net/images/simpson-s06e18@1x.27ade3072859d5.jpg" width="400" /&gt;&lt;/span&gt;&lt;/div&gt;The metric system is the tool of the devil! My car gets forty rods to the hogshead, and that's the way I like it! ― &lt;em&gt;Grampa Simpson&lt;/em&gt;, A Star Is Burns&lt;/figure&gt;
&lt;h2 id="storing-unquoted-history"&gt;Storing unquoted history&lt;/h2&gt;
&lt;p&gt;As is, Zsh records the &lt;em&gt;quoted&lt;/em&gt; expression in history. You must unquote it
before submitting it again. Otherwise, the &lt;abbr title="Zsh Line Editor"&gt;ZLE&lt;/abbr&gt; widget quotes it a second time.
&lt;a href="https://www.zsh.org/mla/users/2026/msg00021.html" title="Re: A ZLE widget for calculator"&gt;Bart Schaefer&lt;/a&gt; provided a solution to store the
original version:&lt;/p&gt;
&lt;div class="language-bash codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;_vbe_calc_history&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;+_vbe_calc_expr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
add-zsh-hook&lt;span class="w"&gt; &lt;/span&gt;zshaddhistory&lt;span class="w"&gt; &lt;/span&gt;_vbe_calc_history

_vbe_calc_preexec&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;+_vbe_calc_expr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;print&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$_vbe_calc_expr&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;unset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;_vbe_calc_expr
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
add-zsh-hook&lt;span class="w"&gt; &lt;/span&gt;preexec&lt;span class="w"&gt; &lt;/span&gt;_vbe_calc_preexec
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;zshaddhistory&lt;/code&gt; hook returns 1 if we are evaluating an expression, telling
&lt;em&gt;Zsh&lt;/em&gt; not to record the command. The &lt;code&gt;preexec&lt;/code&gt; hook then adds the original,
unquoted command with &lt;code&gt;print -s&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The complete code is available in my &lt;a href="https://github.com/vincentbernat/zshrc/blob/9af588820bed37b3b64b2f06777a77d32f4654c4/rc/alias.zsh#L451-L480"&gt;zshrc&lt;/a&gt;. A common alternative is the
&lt;a href="https://manpages.debian.org/zshmisc.1.html#noglob" title="zshmisc(1) manual page"&gt;&lt;code&gt;noglob&lt;/code&gt;&lt;/a&gt; precommand modifier. If you stick with &lt;code&gt;to&lt;/code&gt; instead of &lt;code&gt;-&amp;gt;&lt;/code&gt;
for unit conversion, it covers 90% of use cases. For a related Zsh line editor
trick, see how I use &lt;a href="https://vincent.bernat.ch/en/blog/2025-zsh-autoexpand-aliases" title="Auto-expanding aliases in Zsh"&gt;auto-expanding aliases&lt;/a&gt; to fix common typos.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn-marseille"&gt;
&lt;p&gt;This is the fastest a packet can travel back and forth between
Paris and Marseille over optical fiber. &lt;a class="footnote-backref" href="https://vincent.bernat.ch#fnref-marseille" title="Jump back to footnote 1 in the text"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn-qalc"&gt;
&lt;p&gt;Qalculate is less understanding with units. For example, it parses
“Mbps” as megabarn per picosecond: ☢️&lt;/p&gt;
&lt;div class="language-bash-session codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;numbat&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'5 MB/s -&amp;gt; Mbps'&lt;/span&gt;
&lt;span class="go"&gt;40 Mbps&lt;/span&gt;
&lt;span class="gp"&gt;$ &lt;/span&gt;qalc&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;MB/s&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;Mbps
&lt;span class="go"&gt;5 megabytes/second = 0.000005 B/ps&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a class="footnote-backref" href="https://vincent.bernat.ch#fnref-qalc" title="Jump back to footnote 2 in the text"&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Sun, 22 Mar 2026 13:37:09 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Dowland: Ladytron</title>
	<guid>https://jmtd.net/log/ladytron/</guid>
	<link>https://jmtd.net/log/ladytron/</link>
     <description>  &lt;img src="http://planet.debian.org/heads/jmtd.png" width="65" height="85" alt="" align="right" style="float: right;"&gt;  &lt;p&gt;I saw Ladytron perform in Digital, Newcastle last night. The
last time I saw them was, I think, at the same venue, 18 years ago. Time flies!&lt;/p&gt;

&lt;div class="centre"&gt;
&lt;div class="image+centre"&gt;
&lt;a href="https://jmtd.net/log/ladytron/2026-03-20.jpg"&gt;&lt;img alt="Photo of the trio performing on stage" class="img" height="281" src="https://jmtd.net/log/ladytron/500x-2026-03-20.jpg" width="499" /&gt;&lt;/a&gt;

&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Back in the day (perhaps their heyday, perhaps not!) Ladytron ploughed a
particular sonic furrow and did it very well. Going into the gig I had set my
expectations that, should they play just these hits, I'd have a good time.&lt;/p&gt;

&lt;p&gt;The gig exceeded my expectations. The setlist very much did &lt;em&gt;not&lt;/em&gt; lean into
their best-known period: the more recent few albums were very well represented
and to me this felt very confident. The lead singer, Helen Marnie, demonstrated
some excellent range, particularly on some of the new songs. Daniel Hunt did a
lot of backing vocals and they were really complementary to Helen's: underscoring
but not overpowering. I enjoyed nerding out watching Mira Ayoro's excellent
wrangling of her Korg MS-20. One highlight was an encore performance of
&lt;em&gt;Light &amp;amp; Magic&lt;/em&gt;, which was arguably the "alternate version" as available on the
expanded versions of that album or the &lt;em&gt;Remixed and Rare&lt;/em&gt; companion.&lt;/p&gt;

&lt;p&gt;I thought I'd try to put together a 5-track playlist for a friend who attended
the gig but isn't super familiar with them. As usual this is hard. I'm going
to avoid the obvious hits, try to represent their whole career and try to
ensure the current trio each get a vocal turn in the selection.&lt;/p&gt;

&lt;p&gt;They actually released their latest album, &lt;em&gt;Paradises&lt;/em&gt;, yesterday as well. One
track from it is in the list below.&lt;/p&gt;

&lt;a href="https://ladytron.bandcamp.com/album/velocifero"&gt;I'm Not Scared by Ladytron&lt;/a&gt;




&lt;a href="https://ladytron.bandcamp.com/album/paradises"&gt;Kingdom Undersea by Ladytron&lt;/a&gt;




&lt;a href="https://ladytron.bandcamp.com/album/light-magic"&gt;Blue Jeans by Ladytron&lt;/a&gt;




&lt;a href="https://ladytron.bandcamp.com/album/604"&gt;He took her to a movie by Ladytron&lt;/a&gt;




&lt;a href="https://ladytron.bandcamp.com/album/gravity-the-seducer"&gt;Transparent Days by Ladytron&lt;/a&gt;


&lt;p&gt;(If you can't see anything, the bandcamp embeds have been stripped out by
whatever you are viewing this with)&lt;/p&gt; </description> 
	<pubDate>Sat, 21 Mar 2026 22:18:11 +0000</pubDate>

</item> 
</channel>
</rss>