Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://planet.ubuntu.com/rss20.xml

  1. <?xml version="1.0"?>
  2. <rss version="2.0">
  3.  
  4. <channel>
  5. <title>Planet Ubuntu</title>
  6. <link>http://planet.ubuntu.com/</link>
  7. <language>en</language>
  8. <description>Planet Ubuntu - http://planet.ubuntu.com/</description>
  9.  
  10. <item>
  11. <title>Ubuntu Blog: What our users make with Ubuntu Pro – Episode 2</title>
  12. <guid isPermaLink="true">https://ubuntu.com//blog/what-our-users-make-with-ubuntu-pro-episode-2</guid>
  13. <link>https://ubuntu.com//blog/what-our-users-make-with-ubuntu-pro-episode-2</link>
  14. <description>&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;How Vaultara achieved FedRAMP compliance with Ubuntu Pro&lt;/strong&gt;&lt;/h2&gt;
  15. &lt;p&gt;&lt;a href=&quot;https://ubuntu.com/pro&quot;&gt;Ubuntu Pro&lt;/a&gt; helps businesses worldwide to innovate and shape the future. In this edition of &lt;em&gt;What our users make with Pro&lt;/em&gt;, we talk to &lt;strong&gt;Dave Monk&lt;/strong&gt;, CTO of &lt;strong&gt;Vaultara&lt;/strong&gt;, a &lt;a href=&quot;https://ubuntu.com/security/fedramp&quot;&gt;FedRAMP&lt;/a&gt; approved data-sharing platform trusted by the US government. Dave shares how Ubuntu Pro became a cornerstone of Vaultara’s security, compliance, and open-source ethos.&lt;/p&gt;
  16. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;Tell us about your project or business.&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  17. &lt;p&gt;I’m the CTO of Vaultara. We’ve built a secure data-sharing platform that helps clients and their partners exchange information across separate networks. Our solution is currently used by the US government, and we’ve achieved FedRAMP compliance – which is a major milestone for any technology company.&lt;/p&gt;
  18. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;strong&gt;&lt;em&gt;Are you a part of the Ubuntu or broader open-source community?&lt;/em&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  19. &lt;p&gt;I’ve been using Ubuntu for close to 20 years. I started in a Windows environment but quickly gravitated toward Linux because of the openness and flexibility. I wouldn’t call myself a programmer – more of a technologist – but I’ve built much of my career and our business around open source.&lt;/p&gt;
  20. &lt;p&gt;We contribute by giving feedback to projects we use, pushing PRs for open-source libraries, and supporting the community ethos. For me, giving back is essential, whether through technical contributions or simply sharing our story of how open source is used in real-world solutions.&lt;/p&gt;
  21. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;What challenges were you facing before engaging with Ubuntu Pro?&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  22. &lt;p&gt;Security and compliance were the big ones. When pitching to government clients, we needed FIPS-certified cryptography and timely vulnerability patching to meet strict requirements. Ubuntu Pro provided exactly that – certified components, regular security updates, and the assurances we needed to meet regulatory standards.&lt;/p&gt;
  23. &lt;p&gt;Equally important was the support. When we raise an issue, we don’t just get an automated response, we get timely, knowledgeable help. In fact, we often receive a response within 20 to 30 minutes. In our industry, where every delay matters, that kind of responsiveness is a game changer.&lt;/p&gt;
  24. &lt;p&gt;That combination of compliance, security, and rapid support gave us the confidence to stick with Ubuntu. Today, all our systems, from desktops in the office to the servers hosting our applications, run on Ubuntu, backed by Pro.&lt;/p&gt;
  25. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;Why did you choose Ubuntu Pro?&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  26. &lt;p&gt;I’ve always believed in doing things differently rather than just following the crowd. Ubuntu was the operating system I trusted and was comfortable with. Ubuntu Pro gave me the additional security, compliance, and support I needed to make it viable for highly regulated markets.&lt;/p&gt;
  27. &lt;p&gt;It also helped us prove to clients that Ubuntu is every bit as robust and secure as any other option – and in many ways, more streamlined for our needs.&lt;/p&gt;
  28. &lt;p&gt;We haven’t had one issue with our customer base turning around and saying, “You’re not dealing with this in a timely manner.” And I think that’s important. We’re reasonably small, we’re very nimble, and as a result, I like working with partners that are just as nimble. That’s a big thing to me because, at the end of the day, it’s how the customer responds to any pros or cons regarding a solution. And if you can respond in a timely manner that exceeds their expectations, you’re always going to win in my opinion.&lt;/p&gt;
  29. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;What’s the most important feature for your business?&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  30. &lt;p&gt;Timely security updates. Because we operate under FedRAMP, we’re required to resolve vulnerabilities within strict timeframes. Ubuntu Pro ensures we can patch quickly and reliably, while also giving us direct access to Canonical’s support team when something needs extra attention.&lt;/p&gt;
  31. &lt;p&gt;That responsiveness is critical. We’ve even had cases where our feedback on a vulnerability assessment influenced how quickly a patch was released. That kind of partnership keeps our solution secure and compliant.&lt;/p&gt;
  32. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;What business processes does Ubuntu Pro enhance? Does it save you time or resources?&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  33. &lt;p&gt;Simply put, we couldn’t operate in our market without it. Ubuntu Pro gives us the Linux security, consistency, and compliance we need to meet customer expectations. It allows us to reassure clients that vulnerabilities are being addressed as soon as they’re identified and that fixes will always be delivered on time.&lt;/p&gt;
  34. &lt;p&gt;About 90% of my focus is on ensuring our solution remains secure and stable. Ubuntu Pro makes that possible – and by extension, it helps us maintain the trust of our customers year after year.&lt;/p&gt;
  35. &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;strong&gt;&lt;em&gt;Have there been moments when Canonical went above and beyond?&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  36. &lt;p&gt;One small but memorable example: I had suggested improvements to the support ticketing system, like better text formatting, to make communication clearer. Not long after, those improvements were rolled out. It might seem minor, but it shows that feedback is taken seriously – and it makes a big difference when you’re providing detailed security reports.&lt;/p&gt;
  37. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  38. &lt;p&gt;Ubuntu Pro is always free for personal use – whether you’re experimenting, building, or running your own projects.&lt;a href=&quot;https://ubuntu.com/pro/subscribe&quot;&gt; &lt;/a&gt; Join a global community of Linux enthusiasts and builders who rely on Ubuntu every day. &lt;/p&gt;
  39. &lt;a href=&quot;https://ubuntu.com/pro/subscribe&quot;&gt;&lt;p class=&quot;p-button--positive&quot;&gt;Get Ubuntu Pro&lt;/p&gt;&lt;/a&gt;
  40. &lt;p&gt;Missed the last installation of &lt;em&gt;What our users make with Ubuntu Pro&lt;/em&gt;? &lt;a href=&quot;https://ubuntu.com/blog/what-our-users-make-with-ubuntu-pro-episode-1&quot;&gt;Read the blog&lt;/a&gt; for an insight into how Marc Grondin secured homelabs for him and his family.&lt;/p&gt;
  41. &lt;p&gt;Do you have an Ubuntu Pro story you want to share with us? Fill out &lt;a href=&quot;https://krzty8pox19.typeform.com/to/f0bimGuL&quot;&gt;this form&lt;/a&gt; and we will get in touch with you!&lt;/p&gt;</description>
  42. <pubDate>Thu, 11 Sep 2025 12:13:51 +0000</pubDate>
  43. </item>
  44. <item>
  45. <title>Podcast Ubuntu Portugal: E362 Malmen, Barbosa &amp; Simões Contra as Torres Do Técnico</title>
  46. <guid isPermaLink="false">https://hub.podcastubuntuportugal.org/s/pEYnEHygscmg3oB/download/e362.mp3</guid>
  47. <link>https://podcastubuntuportugal.org/e362/</link>
  48. <description>&lt;p&gt;Desta feita recebemos a visita do Malmen (em directo de São Miguel), do André Barbosa (Wikimedia) e da Joana Simões (OSgeo) para falarmos um pouco sobre as suas aventuras tecnológicas e do que esperam da Festa do Software Livre no Porto. O Diogo e o Miguel visitaram o interior do país e trouxeram de lá muitas novidades boas; pelo meio discutimos as catástrofes globais da semana trazidas pelo jogo Alentejo Tinto’s Law, dramas da Comunidade e até Tamagochis no Ubuntu Touch.&lt;/p&gt;
  49. &lt;p&gt;Já sabem: oiçam, subscrevam e partilhem!&lt;/p&gt;
  50. &lt;ul&gt;
  51. &lt;li&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/on-discourse-rules-about-politics/66986&quot;&gt;https://discourse.ubuntu.com/t/on-discourse-rules-about-politics/66986&lt;/a&gt;&lt;/li&gt;
  52. &lt;li&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/an-update-concerning-the-ubuntu-archive-service-disruption/66997&quot;&gt;https://discourse.ubuntu.com/t/an-update-concerning-the-ubuntu-archive-service-disruption/66997&lt;/a&gt;&lt;/li&gt;
  53. &lt;li&gt;&lt;a href=&quot;https://open-store.io/app/gearboy.bhdouglass&quot;&gt;https://open-store.io/app/gearboy.bhdouglass&lt;/a&gt;&lt;/li&gt;
  54. &lt;li&gt;&lt;a href=&quot;https://blog.mozilla.org/futurereleases/2025/09/05/firefox-32-bit-linux-support-to-end-in-2026/&quot;&gt;https://blog.mozilla.org/futurereleases/2025/09/05/firefox-32-bit-linux-support-to-end-in-2026/&lt;/a&gt;&lt;/li&gt;
  55. &lt;li&gt;&lt;a href=&quot;https://www.omgubuntu.co.uk/2025/09/firefox-32-bit-linux-support-ending&quot;&gt;https://www.omgubuntu.co.uk/2025/09/firefox-32-bit-linux-support-ending&lt;/a&gt;&lt;/li&gt;
  56. &lt;li&gt;&lt;a href=&quot;https://open-store.io/app/ovi.alaskalinuxuser&quot;&gt;https://open-store.io/app/ovi.alaskalinuxuser&lt;/a&gt;&lt;/li&gt;
  57. &lt;li&gt;&lt;a href=&quot;https://github.com/MalMen/HellYes/&quot;&gt;https://github.com/MalMen/HellYes/&lt;/a&gt;&lt;/li&gt;
  58. &lt;li&gt;&lt;a href=&quot;https://masto.pt/@MalMen&quot;&gt;https://masto.pt/@MalMen&lt;/a&gt;&lt;/li&gt;
  59. &lt;li&gt;&lt;a href=&quot;https://noc.social/@doublebyte&quot;&gt;https://noc.social/@doublebyte&lt;/a&gt;&lt;/li&gt;
  60. &lt;li&gt;&lt;a href=&quot;https://ciberlandia.pt/@Barbosa&quot;&gt;https://ciberlandia.pt/@Barbosa&lt;/a&gt;&lt;/li&gt;
  61. &lt;li&gt;&lt;a href=&quot;https://github.com/byteroad/pygeoapi_config&quot;&gt;https://github.com/byteroad/pygeoapi_config&lt;/a&gt;&lt;/li&gt;
  62. &lt;li&gt;&lt;a href=&quot;https://wiki.osgeo.org/wiki/OSGeo_Community_Sprint_2025&quot;&gt;https://wiki.osgeo.org/wiki/OSGeo_Community_Sprint_2025&lt;/a&gt;&lt;/li&gt;
  63. &lt;li&gt;Festa do Software Livre 2025, Porto, 3 a 5 de Outubro: &lt;a href=&quot;https://festa2025.softwarelivre.eu/pt/&quot;&gt;https://festa2025.softwarelivre.eu/pt/&lt;/a&gt;&lt;/li&gt;
  64. &lt;li&gt;Ubuntu Summit 2025, Londres, 23-24 de Outubro: &lt;a href=&quot;https://ubuntu.com/blog/ubuntu-summit-25-10-is-coming-to-your-circle-of-friends-from-london&quot;&gt;https://ubuntu.com/blog/ubuntu-summit-25-10-is-coming-to-your-circle-of-friends-from-london&lt;/a&gt;&lt;/li&gt;
  65. &lt;li&gt;LoCo PT: &lt;a href=&quot;https://loco.ubuntu.com/teams/ubuntu-pt/&quot;&gt;https://loco.ubuntu.com/teams/ubuntu-pt/&lt;/a&gt;&lt;/li&gt;
  66. &lt;li&gt;Mastodon: &lt;a href=&quot;https://masto.pt/@pup&quot;&gt;https://masto.pt/@pup&lt;/a&gt;&lt;/li&gt;
  67. &lt;li&gt;Youtube: &lt;a href=&quot;https://youtube.com/PodcastUbuntuPortugal&quot;&gt;https://youtube.com/PodcastUbuntuPortugal&lt;/a&gt;&lt;/li&gt;
  68. &lt;/ul&gt;
  69. &lt;h3 id=&quot;atribuição-e-licenças&quot;&gt;Atribuição e licenças&lt;/h3&gt;
  70. &lt;p&gt;Este episódio foi produzido por Diogo Constantino, Miguel e Tiago Carrondo e editado pelo &lt;a href=&quot;https://senhorpodcast.pt/&quot;&gt;Senhor Podcast&lt;/a&gt;.
  71. O website é produzido por Tiago Carrondo e o &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website&quot;&gt;código aberto&lt;/a&gt; está licenciado nos termos da &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website/main/LICENSE&quot;&gt;Licença MIT&lt;/a&gt;. (&lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/)&quot;&gt;https://creativecommons.org/licenses/by/4.0/)&lt;/a&gt;. A música do genérico é: “Won’t see it comin’ (Feat Aequality &amp;amp; N’sorte d’autruche)”, por Alpha Hydrae e está licenciada nos termos da &lt;a href=&quot;https://creativecommons.org/publicdomain/zero/1.0/&quot;&gt;CC0 1.0 Universal License&lt;/a&gt;.
  72. Os separadores de péssima qualidade foram tocados ao vivo e sem rede pelo Miguel (e há ali um cavaquinho desafinado do Barbosa), pelo que pedimos desculpa pelos incómodos causados. OS efeitos sonoros têm os seguintes créditos: Multidão com archotes e forquilhas: rowdy crowd.wav by xtrgamr – &lt;a href=&quot;https://freesound.org/s/243798/&quot;&gt;https://freesound.org/s/243798/&lt;/a&gt; – License: Attribution 4.0; Sad Trombone: wah wah sad trombone.wav by kirbydx – &lt;a href=&quot;https://freesound.org/s/175409/&quot;&gt;https://freesound.org/s/175409/&lt;/a&gt; – License: Creative Commons 0.
  73. Este episódio e a imagem utilizada estão licenciados nos termos da licença: &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/&quot;&gt;Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode&quot;&gt;cujo texto integral pode ser lido aqui&lt;/a&gt;. Estamos abertos a licenciar para permitir outros tipos de utilização, &lt;a href=&quot;https://podcastubuntuportugal.org/contactos&quot;&gt;contactem-nos&lt;/a&gt; para validação e autorização.
  74. A arte de episódio foi criada por encomenda pela Shizamura - artista, ilustradora e autora de BD. Podem ficar a conhecer melhor a &lt;a href=&quot;https://ciberlandia.pt/@shizamura&quot;&gt;Shizamura na Ciberlândia&lt;/a&gt; e no &lt;a href=&quot;https://sarilho.net/&quot;&gt;seu sítio web&lt;/a&gt;.&lt;/p&gt;</description>
  75. <pubDate>Thu, 11 Sep 2025 00:00:00 +0000</pubDate>
  76.        <enclosure url="https://hub.podcastubuntuportugal.org/s/pEYnEHygscmg3oB/download/e362.mp3" length="48274493" type="audio/mpeg"/>
  77. </item>
  78. <item>
  79. <title>Xubuntu: Guide Terbaru Slot Online, Versi Demo Tanpa Deposit, serta Platform Slot Online Gacor Versi Update</title>
  80. <guid isPermaLink="false">https://xubuntu.org/?p=5699</guid>
  81. <link>https://xubuntu.org/news/guide-terbaru-slot-online-versi-demo-tanpa-deposit-serta-platform-slot-online-gacor-versi-update/</link>
  82. <description>&lt;h1&gt;Panduan Asik Slot Online 2025&lt;/h1&gt;
  83. &lt;p&gt;Saat ini, &lt;a href=&quot;https://emirategate.com/&quot;&gt;demo slot pragmatic&lt;/a&gt; semakin booming di para pecinta hiburan. Ada banyak alasan yang bikin game slot jadi favorit, mulai dari praktis dimainkan, koleksi slot bejibun, hingga hadiah besar yang bikin penasaran. Gak heran kalau slot gacor selalu jadi buruan utama bagi pemain baru maupun pemain pro.&lt;/p&gt;
  84. &lt;h2&gt;Mengenal Game Slot&lt;/h2&gt;
  85. &lt;p&gt;Permainan slot online adalah bentuk digital dari mesin slot klasik yang dulunya cuma ada di rumah judi. Lewat internet, setiap orang bisa menikmati slot online hanya dengan laptop mereka. Inilah alasan game slot menjadi tren, karena gampang dimengerti, fleksibel, serta bikin nagih.&lt;/p&gt;
  86. &lt;p&gt;Daya tarik slot online juga ada di visual kece, soundtrack epik, dan koleksi tema unik. Dari retro vibes sampai slot modern, semua ada. Bahkan banyak developer game bikin slot bertema anime. Jadi, user bisa tentuin game favorit dengan bebas.&lt;/p&gt;
  87. &lt;h2&gt;Manfaat Slot Demo&lt;/h2&gt;
  88. &lt;p&gt;Mode gratis berguna banget buat pemula yang baru kenal slot. Dengan mode ini, pemain bisa mengetes mekanisme slot tanpa resiko kehilangan saldo. Mereka juga bisa belajar fitur scatter. Bahkan player berpengalaman sering menggunakan demo slot untuk uji RTP sebelum main sungguhan.&lt;/p&gt;
  89. &lt;p&gt;Kesimpulannya, slot demo adalah alat belajar yang bikin nyaman, bukan hanya untuk player baru tapi juga user senior. Dengan begitu, saat masuk ke slot online, mereka lebih paham.&lt;/p&gt;
  90. &lt;h2&gt;Fenomena Slot Gacor&lt;/h2&gt;
  91. &lt;p&gt;Di kalangan penggemar slot, istilah slot hoki jadi bahan obrolan. Banyak yang yakin kalau ada periode spesial di mana slot kasih big win. Walaupun hasilnya RNG, kemenangan besar bikin pemain makin percaya ada slot gacor. Itulah kenapa akses slot gacor selalu heboh pemain.&lt;/p&gt;
  92. &lt;h2&gt;Tips Cari Situs Slot Aman&lt;/h2&gt;
  93. &lt;p&gt;Platform permainan slot ada banyak banget sekarang, tapi gak semuanya aman. Makanya pemain wajib cermat sebelum main. Beberapa hal penting yang patut diperhatikan antara lain:&lt;/p&gt;
  94. &lt;ul&gt;
  95. &lt;li&gt;Proteksi data biar informasi pribadi tetap terjaga.&lt;/li&gt;
  96. &lt;li&gt;Support 24 jam yang cepat tanggap buat bantu masalah pemain.&lt;/li&gt;
  97. &lt;li&gt;Review positif supaya user lebih percaya diri saat main.&lt;/li&gt;
  98. &lt;li&gt;Transaksi lancar agar gak ribet untuk semua pemain.&lt;/li&gt;
  99. &lt;/ul&gt;
  100. &lt;h2&gt;Tren Toto Slot&lt;/h2&gt;
  101. &lt;p&gt;Game toto belakangan makin naik daun. Fitur inovatif dari jenis ini ada di bonus spesial yang seru. Berbeda dengan slot klasik, toto slot sering ngasih free spin, bikin user merasa semakin enjoy tiap kali nyoba.&lt;/p&gt;
  102. &lt;h3&gt;Panduan Bermain Slot Santai&lt;/h3&gt;
  103. &lt;p&gt;Supaya main makin menyenangkan, ada beberapa trik yang bisa diterapkan:&lt;/p&gt;
  104. &lt;ul&gt;
  105. &lt;li&gt;Mulai dari slot demo biar ngerti cara main dulu.&lt;/li&gt;
  106. &lt;li&gt;Kontrol budget dengan hati-hati, jangan terlalu napsu.&lt;/li&gt;
  107. &lt;li&gt;Jangan lupa, permainan slot itu bergantung hoki, jadi fokus ke hiburan daripada ngejar profit.&lt;/li&gt;
  108. &lt;/ul&gt;
  109. &lt;h2&gt;Penutup&lt;/h2&gt;
  110. &lt;p&gt;Game slot digital makin seru dengan teknologi baru. Dari demo slot untuk latihan, slot mudah jackpot yang banyak dicari, sampai toto slot yang lagi trend, semua tersedia buat pengguna. Yang penting, mainlah santai, pilih situs aman, dan selalu sadari kalau keseruan lebih utama daripada cari profit.&lt;/p&gt;</description>
  111. <pubDate>Wed, 10 Sep 2025 17:39:35 +0000</pubDate>
  112. </item>
  113. <item>
  114. <title>Ubuntu Blog: What’s the state of open source adoption in Europe?</title>
  115. <guid isPermaLink="true">https://ubuntu.com//blog/state-of-open-source-adoption-in-europe</guid>
  116. <link>https://ubuntu.com//blog/state-of-open-source-adoption-in-europe</link>
  117. <description>&lt;h4 class=&quot;wp-block-heading has-text-color has-link-color wp-elements-282567c4640b2fe29363af60bf6c3f6f&quot; style=&quot;color: #4f575d;&quot;&gt;New research suggests 86% of European organizations believe open source is valuable for the future of their industry – but only 34% have a clear and visible open source strategy &lt;/h4&gt;
  118. &lt;p&gt;The Linux Foundation’s latest report, &lt;em&gt;Open source as Europe’s strategic advantage: trends, barriers, and priorities for the European open source community amid regulatory and geopolitical shifts&lt;/em&gt;, provides key insights into how European enterprises are using open source software (OSS), as well as the barriers towards further development of open source in the continent. Released in collaboration with Canonical, the report surveyed 316 enterprises and interviewed experts to give a clear picture of the state of open source in Europe. &lt;/p&gt;
  119. &lt;p&gt;This blog gives a breakdown of the key findings of the report, answering how European enterprises are using open source, what the biggest opportunities and challenges are, and how organizations can benefit most from OSS adoption.&lt;/p&gt;
  120. &lt;p&gt;&lt;a href=&quot;https://pages.ubuntu.com/rs/066-EOV-335/images/Final%20report%20-%20WorldofOS_EUSpotlight_2025_081525.pdf?version=0&quot;&gt;Read the full report&lt;/a&gt;&lt;/p&gt;
  121. &lt;h3 class=&quot;wp-block-heading&quot;&gt;Is open source popular in Europe?&lt;/h3&gt;
  122. &lt;p&gt;Incorporating OSS into workflows and infrastructure has become increasingly common in organizations throughout Europe. The report indicates that 64% use OSS for their operating systems, 55% for cloud and container technologies, and 54% for web and application development. &lt;/p&gt;
  123. &lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;779&quot; src=&quot;https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1600/https%3A%2F%2Fubuntu.com%2Fwp-content%2Fuploads%2Fbc0c%2Fc9ebaadc-cc9e-4435-8780-24f5ace4c9ca.png&quot; width=&quot;1600&quot; /&gt;&lt;/figure&gt;
  124. &lt;p&gt;[Figure 1]&lt;/p&gt;
  125. &lt;p&gt;The rationale behind the popularity of OSS is clear, as the report suggests: by using OSS, respondents reported that they benefited from higher productivity (63%), higher quality software (75%), reduced vendor lock-in (62%) and lower software ownership costs (58%). In addition, OSS was considered a gateway to greater transparency (49%), innovation (58%), and collaboration across organizational boundaries (48%). Overall, 56% of those surveyed consider that the benefits of OSS exceed – or greatly exceed – the costs.&lt;/p&gt;
  126. &lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;773&quot; src=&quot;https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1600/https%3A%2F%2Fubuntu.com%2Fwp-content%2Fuploads%2F5f3c%2Fimage.png&quot; width=&quot;1600&quot; /&gt;&lt;/figure&gt;
  127. &lt;p&gt;[Figure 3]&lt;/p&gt;
  128. &lt;p&gt;Many organizations have adopted open source to improve their cost-effectiveness. For example, Nova, one of the leading telecommunications providers in Greece, adopted open source with Canonical. Nikolaos Dasyras, Senior Manager of Cloud Infrastructure &amp;amp; Services at Nova, emphasizes how Canonical’s straightforward planning and pricing has benefited Nova’s ability to control costs:&lt;/p&gt;
  129. &lt;p&gt;&lt;em&gt;“From a capital expenditure (CAPEX) perspective, Canonical’s roadmap is fully iterable …. This makes it simple for us to estimate the time and cost needed when embarking on new projects. From an operational expenditure (OPEX) perspective, the support from Canonical is directly related to the footprint and number of servers – with no additional cost for management software, as Juju and MAAS are free and open source tools. Without licensing fees, we’re paying for real expertise that enriches our team, rather than paying for access.” &lt;/em&gt;&lt;/p&gt;
  130. &lt;p&gt;Learn more in &lt;a href=&quot;https://canonical.com/case-study/nova-telecommunications&quot;&gt;the case study&lt;/a&gt;.&lt;/p&gt;
  131. &lt;h3 class=&quot;wp-block-heading&quot;&gt;Why is open source development a priority in Europe?&lt;/h3&gt;
  132. &lt;h4 class=&quot;wp-block-heading has-text-color has-link-color wp-elements-52c164e458cae19b4b971a2198796404&quot; style=&quot;color: #4f575d;&quot;&gt;55% consider open source alternatives a priority for European sovereignty&lt;/h4&gt;
  133. &lt;p&gt;Beyond its numerous benefits, recent geopolitical turbulence has catalyzed the importance of OSS for business leaders and policymakers alike. Concerns have arisen about trade disputes and political changes causing a sudden and disruptive loss of services and technology, leading to widespread trends such as &lt;a href=&quot;https://canonical.com/blog/what-is-geopatriation&quot;&gt;geopatriation&lt;/a&gt;. Open source offers a way of developing alternatives, reducing dependence on proprietary technologies and a small set of vendors. Awareness of this has led to investment and development of OSS being recognized as a critical element to achieving digital sovereignty.&lt;/p&gt;
  134. &lt;p&gt;Canonical has been at the forefront of enabling digital sovereignty through open source software. For instance, we have partnered with UNICC to build a sovereign cloud based on Canonical OpenStack, providing the UN with the data sovereignty they sought. Find out more in the &lt;a href=&quot;https://www.unicc.org/news/2023/10/19/unicc-partners-with-canonical-to-build-unicc-cloud/&quot;&gt;announcement&lt;/a&gt;.&lt;/p&gt;
  135. &lt;h2 class=&quot;wp-block-heading&quot;&gt;What are the most important opportunities developing in open source?&lt;/h2&gt;
  136. &lt;h4 class=&quot;wp-block-heading has-text-color has-link-color wp-elements-f44397a02c1bbbf7bb0b2a3ab603b96e&quot; style=&quot;color: #4f575d;&quot;&gt;41% use OSS for AI and Machine Learning&lt;/h4&gt;
  137. &lt;p&gt;In the light of DeepSeek’s release in January of 2025, open source AI in Europe – and public support for it – has blossomed. The report highlights this as the trigger for a growing interest in building European-based open source AI models. This trend links back to the growing interest in achieving digital sovereignty: 89% of respondents considered OSS the most important approach to sovereign AI.&lt;/p&gt;
  138. &lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;733&quot; src=&quot;https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1600/https%3A%2F%2Fubuntu.com%2Fwp-content%2Fuploads%2F8a87%2Fimage.png&quot; width=&quot;1600&quot; /&gt;&lt;/figure&gt;
  139. &lt;p&gt;[Figure 16]&lt;/p&gt;
  140. &lt;p&gt;Europe has an abundance of AI/ML talent and projects. &lt;a href=&quot;https://mistral.ai/&quot;&gt;Mistral AI&lt;/a&gt; is one of the leading examples. But there’s also rising public sector interest in AI Factories and similar initiatives, such as the &lt;a href=&quot;https://www.bsc.es/ai-factory&quot;&gt;Barcelona AI Factory&lt;/a&gt; and &lt;a href=&quot;https://www.ifabfoundation.org/it4lia-ai-factory/&quot;&gt;IT4LIA AI Factory&lt;/a&gt;.   &lt;/p&gt;
  141. &lt;p&gt;Organizations like the European Space Agency are also making headway into the use of AI. The European Space Operations Centre (ESOC), one of ESA’s premises in Germany, hosts the engineering teams that control spacecraft in orbit, manage the global tracking station network, and design and build the systems on the ground which support their missions in space. By 2030, ESA aims to significantly expand the number of satellites it currently launches. ESA relies on a number of AI-supported software tools during their missions. However, these tools require a platform on which to run. &lt;/p&gt;
  142. &lt;p&gt;ESA chose Canonical’s distributions of Kubeflow and Spark on top of Canonical Kubernetes, helping ESA to focus on optimizing their missions, rather than troubleshooting the supporting infrastructure. As Michael Hawkshaw, ESA Mission Operations Infrastructure IT Service Manager at ESOC put it, “we can sleep soundly knowing Canonical is supporting us and we won’t get a call at night telling us that something’s gone wrong.” &lt;/p&gt;
  143. &lt;p&gt;Find out the full story in the &lt;a href=&quot;https://canonical.com/case-study/esa&quot;&gt;case study&lt;/a&gt;, or check out our &lt;a href=&quot;https://canonical.com/solutions/ai&quot;&gt;webpages&lt;/a&gt; for more information about Canonical’s AI and ML solutions.&lt;/p&gt;
  144. &lt;p&gt;Whilst AI and ML pose significant opportunities in Europe, developing and adopting these technologies is not without challenges. Complex new legislation and regulations, like the &lt;a href=&quot;https://artificialintelligenceact.eu/&quot;&gt;AI act&lt;/a&gt;, are not broadly understood by organizations. Developing a formal OSS strategy, with robust security controls and a clear compliance roadmap is critical. &lt;/p&gt;
  145. &lt;h2 class=&quot;wp-block-heading&quot;&gt;What are the key challenges faced by enterprises using OSS?&lt;/h2&gt;
  146. &lt;h4 class=&quot;wp-block-heading has-text-color has-link-color wp-elements-02ba06a886d284c989ccb11594c27c79&quot; style=&quot;color: #72787d;&quot;&gt;66% of organizations lack a formal open source strategy &lt;/h4&gt;
  147. &lt;p&gt;Despite growing awareness of OSS benefits and adoption of OSS, over 50% of organizations contributed to OSS projects in either limited ways, did not contribute, or weren’t sure if they contributed. Of those who did engage significantly with OSS projects, by employing full-time contributions or maintainers, 81% saw high, or very high, value in their investment. Why, then, is contribution limited?&lt;/p&gt;
  148. &lt;figure class=&quot;wp-block-image size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;900&quot; src=&quot;https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1600/https%3A%2F%2Fubuntu.com%2Fwp-content%2Fuploads%2F6cab%2F1eb53d40-772e-4245-bb56-02b126905423.png&quot; width=&quot;1600&quot; /&gt;&lt;/figure&gt;
  149. &lt;p&gt;[Figure 14]&lt;/p&gt;
  150. &lt;p&gt;The report suggests that the barriers preventing OSS contribution include legal and licensing concerns (31%) and fear of leaking IP (24%). These issues are linked to a broad lack of maturity in OSS strategy: 66% of organizations lack a formal open source strategy, and 78% have not implemented an open source program office (OSPO). &lt;/p&gt;
  151. &lt;figure class=&quot;wp-block-image size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;855&quot; src=&quot;https://res.cloudinary.com/canonical/image/fetch/f_auto,q_auto,fl_sanitize,c_fill,w_1600/https%3A%2F%2Fubuntu.com%2Fwp-content%2Fuploads%2F9512%2Fimage.png&quot; width=&quot;1600&quot; /&gt;&lt;/figure&gt;
  152. &lt;p&gt;[Figure 7]&lt;/p&gt;
  153. &lt;p&gt;OSPOs are internal teams that oversee an organization’s open source engagement. OSPOs help to ensure compliance and avoid legal risks, whilst optimizing the organization’s use of and contributions towards OSS projects. To find out more about OSPOs, as well as how to create and successfully run an OSPO in your own organization, &lt;a href=&quot;https://ubuntu.com/engage/open-source-program-office-guide-ospo-guide&quot;&gt;read our guide&lt;/a&gt;.&lt;/p&gt;
  154. &lt;p&gt;The report suggests a concerning lack of understanding of how best to comply with cybersecurity regulations and standards. However, the introduction of new legislation like the EU &lt;a href=&quot;https://canonical.com/solutions/open-source-security/cyber-resilience-act&quot;&gt;Cyber Resilience Act (CRA)&lt;/a&gt; will require organizations to develop roadmaps for compliance, especially if they commercialize products with digital elements. For a comprehensive breakdown of the CRA from our CISO, read our &lt;a href=&quot;https://ubuntu.com/blog/a-cisos-comprehensive-breakdown-of-the-cyber-resilience-act&quot;&gt;blog&lt;/a&gt;, or find a more concise overview on our &lt;a href=&quot;https://canonical.com/solutions/open-source-security/cyber-resilience-act&quot;&gt;webpage&lt;/a&gt;. &lt;/p&gt;
  155. &lt;h2 class=&quot;wp-block-heading&quot;&gt;The state of open source in Europe&lt;/h2&gt;
  156. &lt;p&gt;Europe’s open source community is flourishing, with enterprises incorporating open source across the technical stack and becoming increasingly aware of the benefits it provides. In particular, the opportunities to achieve digital sovereignty and establish European open source AI are drawing interest and attention. &lt;/p&gt;
  157. &lt;p&gt;However, receiving the full benefits of open source requires engagement and a structured approach to OSS within the organization. Similarly, understanding regulatory and legislative requirements, and achieving compliance can be challenging; however, working with trusted partners like Canonical, and establishing internal open source program offices can help organizations to overcome these barriers to success. &lt;/p&gt;
  158. &lt;p&gt;&lt;a href=&quot;https://pages.ubuntu.com/rs/066-EOV-335/images/Final%20report%20-%20WorldofOS_EUSpotlight_2025_081525.pdf?version=0&quot;&gt;Read the full report &amp;gt;&lt;/a&gt;&lt;/p&gt;</description>
  159. <pubDate>Wed, 10 Sep 2025 09:51:10 +0000</pubDate>
  160. </item>
  161. <item>
  162. <title>Xubuntu: Tutorial Komprehensif Slot Casino Online, Versi Demo Tanpa Deposit, dilengkapi dengan Platform Slot Online Paling Dicari Versi Update</title>
  163. <guid isPermaLink="false">https://xubuntu.org/?p=5697</guid>
  164. <link>https://xubuntu.org/news/tutorial-komprehensif-slot-casino-online-versi-demo-tanpa-deposit-dilengkapi-dengan-platform-slot-online-paling-dicari-versi-update/</link>
  165. <description>&lt;h1&gt;Kupas Tuntas Game Slot Masa Kini&lt;/h1&gt;
  166. &lt;p&gt;Sekarang ini, &lt;a href=&quot;https://orthores.org/&quot;&gt;slot gacor&lt;/a&gt; slot online terus meroket di kalangan penggemar hiburan. Banyak penyebab kenapa permainan slot online bisa trending, mulai dari akses mudah, koleksi game melimpah, sampai bonus yang membuat betah. Salah satu yang paling sering dicari tentu saja slot gacor yang jadi pintu masuk bagi pemain pemula maupun penggemar setia.&lt;/p&gt;
  167. &lt;h2&gt;Ngomongin Tentang Game Slot&lt;/h2&gt;
  168. &lt;p&gt;Slot online adalah pengembangan online dari mesin slot klasik yang dulu cuma bisa dimainkan di arena judi. Dengan hadirnya internet, semua orang bisa mengakses slot online kapan saja pakai smartphone. Faktor inilah yang menjadikan slot online trending dan disukai banyak orang, karena simple, bisa dimainkan di mana saja, serta ngasik banget.&lt;/p&gt;
  169. &lt;p&gt;Keunikan lain dari slot online ada di grafis keren, soundtrack keren, dan desain beragam. Dari yang klasik sampai modern, semua tersedia. Bahkan banyak developer slot yang bikin mitologi. Jadi, user bebas menentukan game favorit kapan saja.&lt;/p&gt;
  170. &lt;h2&gt;Alasan Coba Demo Slot&lt;/h2&gt;
  171. &lt;p&gt;Slot demo merupakan cara buat newbie yang masih belajar. Lewat versi ini, user bisa mengetes game tanpa takut rugi. Mereka bisa belajar simbol kayak wild. Bahkan player pro juga sering main mode gratis buat uji game baru sebelum taruh uang beneran.&lt;/p&gt;
  172. &lt;p&gt;Intinya, slot demo bukan cuma mainan iseng, tapi media latihan buat semua kalangan biar lebih pede saat main slot online.&lt;/p&gt;
  173. &lt;h2&gt;Fenomena Slot Gacor&lt;/h2&gt;
  174. &lt;p&gt;Di dunia slot online, istilah game gacor banyak dibicarakan. Ada anggapan kalau ada momen spesifik di mana mesin game lebih sering bagi hadiah. Walaupun menggunakan random number generator, perasaan dapet kemenangan besar bikin orang makin percaya. Karena itu, pencarian jalur gampang jackpot selalu heboh di komunitas.&lt;/p&gt;
  175. &lt;h2&gt;Tips Pilih Situs Slot&lt;/h2&gt;
  176. &lt;p&gt;Banyak situs slot yang tersedia. Tapi gak semua jujur. Pengguna harus teliti sebelum daftar. Beberapa faktor utama yang perlu dicek:&lt;/p&gt;
  177. &lt;ul&gt;
  178. &lt;li&gt;Proteksi akun supaya akun tetap aman.&lt;/li&gt;
  179. &lt;li&gt;Customer service yang profesional biar masalah bisa segera beres.&lt;/li&gt;
  180. &lt;li&gt;Nama baik biar percaya diri waktu main.&lt;/li&gt;
  181. &lt;li&gt;Proses deposit withdraw cepat untuk tanpa ribet.&lt;/li&gt;
  182. &lt;/ul&gt;
  183. &lt;h2&gt;Mengenal Slot Variasi Toto&lt;/h2&gt;
  184. &lt;p&gt;Game toto banyak dibicarakan belakangan ini. Daya tarik dari jenis ini ada di fitur bonus yang bikin pengguna semangat coba. Tidak sama dari slot klasik, toto slot sering kasih free spin, sehingga waktu bermain makin nyaman.&lt;/p&gt;
  185. &lt;h3&gt;Saran Biar Main Asik&lt;/h3&gt;
  186. &lt;p&gt;Biar main makin fun, ada beberapa tips yang bisa dipakai:&lt;/p&gt;
  187. &lt;ul&gt;
  188. &lt;li&gt;Coba dulu slot demo buat paham mekanisme.&lt;/li&gt;
  189. &lt;li&gt;Atur modal dengan disiplin, jangan emosi. &lt;/li&gt;
  190. &lt;li&gt;Jangan lupa, slot online itu random, jadi fokus ke fun ketimbang ngejar untung.&lt;/li&gt;
  191. &lt;/ul&gt;
  192. &lt;h2&gt;Kesimpulan&lt;/h2&gt;
  193. &lt;p&gt;Dunia slot online makin maju dengan teknologi baru. Dari slot demo buat latihan, slot gacor yang selalu diburu, hingga slot alternatif sebagai pilihan baru, semuanya hadir buat user. Yang penting, nikmati dengan bijak, pilih situs terpercaya, dan ingat bahwa fun lebih utama daripada sekadar memburu uang cepat.&lt;/p&gt;</description>
  194. <pubDate>Wed, 10 Sep 2025 07:11:50 +0000</pubDate>
  195. </item>
  196. <item>
  197. <title>Andrea Corbellini: Testing crash recovery features in a CI environment</title>
  198. <guid isPermaLink="false">tag:andrea.corbellini.name,2025-09-09:/2025/09/09/testing-crash-recovery-features-in-ci/</guid>
  199. <link>https://andrea.corbellini.name/2025/09/09/testing-crash-recovery-features-in-ci/</link>
  200. <description>&lt;p&gt;About two years ago I wrote a Rust crate to fulfill this promise:&lt;/p&gt;
  201. &lt;blockquote&gt;
  202. &lt;p&gt;If a crash occurs while updating a file, the file either contains the old
  203. contents, or the new contents, nothing in between.&lt;/p&gt;
  204. &lt;/blockquote&gt;
  205. &lt;p&gt;This crate essentially solves the following problem: when you update a file,
  206. generally you open it, truncate it, write to it block-by-block, and eventually
  207. close it. The problem with this process is that if a crash occurs at any point
  208. during this process (the program segfaults, the kernel panics, the machine
  209. loses power, …), your file will be left in an intermediate state where the
  210. old contents are completely lost, and the new contents are only partially
  211. written (if at all). My crate solves this problem by making file updates &lt;em&gt;atomic&lt;/em&gt;.&lt;/p&gt;
  212. &lt;p&gt;This crate is publicly available as &lt;a href=&quot;https://crates.io/crates/atomic-write-file&quot;&gt;atomic-write-file&lt;/a&gt; and you can read its
  213. description for more details (sorry, I’m very bad at naming things).&lt;/p&gt;
  214. &lt;p&gt;The way the crate works is simple:&lt;/p&gt;
  215. &lt;ol&gt;
  216. &lt;li&gt;Instead of opening the &lt;em&gt;target&lt;/em&gt; file directly, the crate opens a &lt;em&gt;temporary&lt;/em&gt;
  217.   file.&lt;/li&gt;
  218. &lt;li&gt;You write to the temporary file.&lt;/li&gt;
  219. &lt;li&gt;Once all changes are in, the temporary file contents are synced to the
  220.   storage, and it is atomically renamed so that it replaces the target file.&lt;/li&gt;
  221. &lt;/ol&gt;
  222. &lt;p&gt;This is not by any chance a new technique that I invented, and it’s a very
  223. common strategy to solve the problem. This technique guarantees that if a crash
  224. occurs at or before step 3, then the file will have the old contents,
  225. unchanged. If a crash occurs after step 3, then the file will have the new
  226. contents.&lt;/p&gt;
  227. &lt;p&gt;There’s a small caveat with this technique: if a crash occurs between steps 1
  228. and 3, then the crate will leave behind a temporary file that occupies some
  229. space on the storage device with no purpose.&lt;/p&gt;
  230. &lt;p&gt;This is where Linux anonymous temporary files come into play: this
  231. Linux-specific feature allows you to create temporary files that are written on
  232. the filesystem, but are not given a path in the filesystem. If a crash occurs
  233. between step 1 and 3, the temporary file will simply be forgotten into
  234. oblivion.&lt;/p&gt;
  235. &lt;h1 id=&quot;meet-the-opponent-btrfs&quot;&gt;Meet the opponent: btrfs&lt;/h1&gt;
  236. &lt;p&gt;Using Linux anonymous temporary files seemed very appealing for
  237. atomic-write-file to avoid leaving leftovers behind, although I knew that
  238. they’re not the perfect solution: there’s limited support (they’re supported
  239. only on Linux, and only on some filesystems), they require the use of Linux
  240. features that may not be available all the time (the &lt;code&gt;/proc&lt;/code&gt; filesystem), and
  241. they also have the problem that, sooner or later, they will need to be given a
  242. name if we want to be able to replace the target file, and this leaves a small
  243. time window during which we could leave some cruft behind.&lt;/p&gt;
  244. &lt;p&gt;But none of these are huge problems, and in fact atomic-write-file is able to
  245. do a best effort attempt at using anonymous temporary files, and reverting to
  246. regular files if that doesn’t work.&lt;/p&gt;
  247. &lt;p&gt;One day I was notified about &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/issues/6&quot;&gt;an issue on using my crate on the btrfs file
  248. system&lt;/a&gt;: after a crash, my crate could break its promise and leave the
  249. file contents &lt;strong&gt;empty&lt;/strong&gt;. I did some investigation on the issue that &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/issues/6#issuecomment-2048836275&quot;&gt;you can
  250. read about if you’re interested&lt;/a&gt;, and then fixed it.&lt;/p&gt;
  251. &lt;p&gt;This problem was specific to btrfs, and I argue that it’s actually caused by a
  252. btrfs bug, rather than a bug in the crate itself, but nonetheless this issue
  253. had revealed a critical flaw of my crate: &lt;strong&gt;I did not have any tests to check
  254. if my crate was fulfilling its promise or not!&lt;/strong&gt;&lt;/p&gt;
  255. &lt;p&gt;Therefore I decided to create a small test suite for Linux to simulate crashes
  256. and inspect the contents of files after those crashes occurred on a variety of
  257. filesystems, which is what this blog post is about. This test suite now runs on
  258. my laptop and &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/actions/workflows/crash-tests.yml&quot;&gt;on GitHub Actions&lt;/a&gt;, and potentially any
  259. other CI environment.&lt;/p&gt;
  260. &lt;h1 id=&quot;testing-strategy&quot;&gt;Testing strategy&lt;/h1&gt;
  261. &lt;p&gt;Here’s the idea I came up with: I can create a virtual machine, with a virtual
  262. storage device attached to it, and a filesystem initialized with a file. The
  263. virtual machine updates the file using atomic-write-file, and then triggers a
  264. kernel panic. After that, the file is inspected for consistency.&lt;/p&gt;
  265. &lt;p&gt;So here is how it works in practice: there are 3 main pieces:
  266. 1. A test binary that is responsible for updating the test file using
  267.   atomic-write-file.
  268. 1. An &lt;code&gt;init.sh&lt;/code&gt; script that runs inside the virtual machine.
  269. 1. The &lt;code&gt;run-tests.sh&lt;/code&gt; script that puts everything together and starts up the
  270.   virtual machine.&lt;/p&gt;
  271. &lt;h2 id=&quot;the-test-binary&quot;&gt;The test binary&lt;/h2&gt;
  272. &lt;p&gt;The test binary that is a &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/crash-tests/linux/src/main.rs&quot;&gt;short Rust program&lt;/a&gt; that I can paste here:&lt;/p&gt;
  273. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;atomic_write_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AtomicWriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  274. &lt;span class=&quot;k&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  275.  
  276. &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  277. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AtomicWriteFile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/test/file&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;open failed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  278. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write_all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;b&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;write failed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  279. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;commit failed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  280. &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  281. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  282.  
  283. &lt;p&gt;Nothing special to see here: this is the minimal code required to use atomic-write-file.&lt;/p&gt;
  284. &lt;h2 id=&quot;the-initsh-script&quot;&gt;The init.sh script&lt;/h2&gt;
  285. &lt;p&gt;&lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/crash-tests/linux/init.sh&quot;&gt;The &lt;code&gt;init.sh&lt;/code&gt; script&lt;/a&gt; is more interesting: this script in fact is meant to run
  286. &lt;em&gt;twice&lt;/em&gt;. The first time it runs, &lt;code&gt;init.sh&lt;/code&gt; will run the test binary above and
  287. trigger the kernel panic. The second time, it will read the test file contents
  288. and report them back &lt;code&gt;run-tests.sh&lt;/code&gt; script for inspection.&lt;/p&gt;
  289. &lt;p&gt;Let’s take a closer look at what it does: first, it mounts the &lt;code&gt;/proc&lt;/code&gt; and
  290. &lt;code&gt;/sys&lt;/code&gt; virtual filesystems. These are needed for some basic system functions,
  291. and also to enable the Linux anonymous temporary file feature.&lt;/p&gt;
  292. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mount&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;proc&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;none&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc
  293. mount&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sysfs&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;none&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/sys
  294. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  295.  
  296. &lt;p&gt;Then it mounts the filesystem containing the test file. Before it can do that,
  297. however, it needs to load the correct kernel module for the filesystem. Nothing
  298. too fancy here: the filesystem type is simply specified on the kernel command
  299. line (read through &lt;code&gt;/proc/cmdline&lt;/code&gt;):&lt;/p&gt;
  300. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;fstype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-Eo&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'test.fs=\w+'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc/cmdline&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cut&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-d&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-f2&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
  301. modprobe&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fstype&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;
  302. mount&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$fstype&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/dev/sdb&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/test
  303. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  304.  
  305. &lt;p&gt;Then, if this script is run for the first time, it will run the test executable and quit:&lt;/p&gt;
  306. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Running test binary'&lt;/span&gt;
  307. atomic-write-file-test
  308. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  309.  
  310. &lt;p&gt;&lt;code&gt;init.sh&lt;/code&gt; (as the name suggests) is run as the init script of the virtual
  311. machine. In Linux, if the init script quits without invoking the proper
  312. shutdown sequence, the kernel will panic. So we don’t actually need to do
  313. anything special to trigger a panic. I could have inserted a &lt;code&gt;echo c &amp;gt;
  314. /proc/sysrq-trigger&lt;/code&gt; line to make it more explicit, but then I figured that
  315. having that line wouldn’t be nice for people who want to test the script on
  316. their system.&lt;/p&gt;
  317. &lt;p&gt;You might ask: how does &lt;code&gt;init.sh&lt;/code&gt; know if it’s the first time it gets called or
  318. the second? Again, nothing fancy here: &lt;code&gt;run-tests.sh&lt;/code&gt; gives that hint using a
  319. kernel command line argument:&lt;/p&gt;
  320. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-q&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;test.verify&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc/cmdline&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  321. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
  322. &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
  323. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  324.  
  325. &lt;p&gt;If &lt;code&gt;test.verify&lt;/code&gt; is specified on &lt;code&gt;/proc/cmdline&lt;/code&gt;, then it means this is the
  326. second time this script is run. In that case, the file contents are just
  327. printed on the console:&lt;/p&gt;
  328. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-q&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;test.verify&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/proc/cmdline&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  329. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Verifying test file contents'&lt;/span&gt;
  330. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
  331. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;xxd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/test/file
  332. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
  333. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;poweroff&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-f
  334. &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
  335. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  336.  
  337. &lt;p&gt;This uses &lt;code&gt;xxd&lt;/code&gt; so in case there are garbled characters on screen, we can
  338. comfortably analyze the output and figure out what happened. At the end, the
  339. system is more gracefully shut down using &lt;code&gt;poweroff&lt;/code&gt; to avoid another kernel
  340. panic (this is not really necessary).&lt;/p&gt;
  341. &lt;h1 id=&quot;the-run-testssh-script&quot;&gt;The run-tests.sh script&lt;/h1&gt;
  342. &lt;p&gt;And then there’s &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/crash-tests/linux/run-test.sh&quot;&gt;the &lt;code&gt;run-tests.sh&lt;/code&gt; script that crates the virtual storage,
  343. launches the virtual machine, and inspects the file contents&lt;/a&gt;.
  344. This is where most the complexity is, so let’s go step-by-step (the code below
  345. has been simplified from the original for readability):&lt;/p&gt;
  346. &lt;p&gt;The first thing it does is compiling the test binary above. The virtual machine
  347. runs in a very barebone environment, so I used static linking to avoid having
  348. to copy additional libraries like &lt;code&gt;libc&lt;/code&gt;:&lt;/p&gt;
  349. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;-unknown-linux-gnu
  350. &lt;span class=&quot;nv&quot;&gt;RUSTFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-C target-feature=+crt-static'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cargo&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;build&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--release&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--features&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$cargo_features&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--target&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$target&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  351. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  352.  
  353. &lt;p&gt;Then &lt;code&gt;run-tests.sh&lt;/code&gt; creates a minimal &lt;a href=&quot;https://en.wikipedia.org/wiki/Initial_ramdisk&quot;&gt;initramfs&lt;/a&gt; for the virtual machine. The
  354. initramfs is a filesystem that gets mounted by Linux early at boot. It’s
  355. generally used by Linux distributions to load the main operating system, but in
  356. my case the initramfs contains everything needed for the test. In particular,
  357. it contains:&lt;/p&gt;
  358. &lt;ul&gt;
  359. &lt;li&gt;The test binary.&lt;/li&gt;
  360. &lt;li&gt;The &lt;code&gt;init.sh&lt;/code&gt; script.&lt;/li&gt;
  361. &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/BusyBox&quot;&gt;BusyBox&lt;/a&gt;, to get the needed utilities like &lt;code&gt;xxd&lt;/code&gt; and &lt;code&gt;poweroff&lt;/code&gt;.&lt;/li&gt;
  362. &lt;li&gt;The kernel modules to mount filesystems and their dependencies.&lt;/li&gt;
  363. &lt;/ul&gt;
  364. &lt;p&gt;The first 3 items are easy to set up:&lt;/p&gt;
  365. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;init.sh&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-T&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/sbin/init&quot;&lt;/span&gt;
  366. cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;atomic-write-file-test&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/bin&quot;&lt;/span&gt;
  367. cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;which&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;busybox&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/bin&quot;&lt;/span&gt;
  368. &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$busybox&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--install&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-s&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/bin&quot;&lt;/span&gt;
  369. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  370.  
  371. &lt;p&gt;The kernel modules are a bit more complicated. First of all: where can we get
  372. them from? Ideally, I would have liked to download them from some minimal Linux
  373. distribution, but this turned out to be more complicated than expected. In the
  374. end, I decided to just steal them from the host operating system:&lt;/p&gt;
  375. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;modules&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/lib/modules/&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
  376. cp&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-a&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$modules&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-t&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/lib/modules&quot;&lt;/span&gt;
  377.  
  378. &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mod_path&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  379. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;*.ko.gz&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  380. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;gunzip&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-o&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;
  381. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;*.ko.xz&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  382. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;unxz&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-o&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;
  383. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;*.ko.zst&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  384. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;unzstd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-o&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;
  385. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
  386. &lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;
  387. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
  388. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;mv&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.uncompressed&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mod_path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  389. &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&amp;lt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;modprobe&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--dirname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;--show-depends&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;grep&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;^insmod&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cut&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-d&lt;span class=&quot;s1&quot;&gt;' '&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-f2&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  390. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  391.  
  392. &lt;p&gt;What this does is copying all the module files from the host, getting all the
  393. dependencies for the filesystem module using &lt;code&gt;modprobe&lt;/code&gt;, and then uncompressing
  394. those modules if they’re compressed (I found this much easier than adding
  395. compression support in the virtual machine). An alternative approach would be
  396. to simply decompress all the modules, but that’s much slower.&lt;/p&gt;
  397. &lt;p&gt;Once everything has been copied over and uncompressed, the initramfs is
  398. created:&lt;/p&gt;
  399. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;initramfs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;rootfs.img
  400. mksquashfs&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs_build_dir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  401. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  402.  
  403. &lt;p&gt;Now it’s time to create the virtual storage device with the filesystem, which
  404. is a trivial task:&lt;/p&gt;
  405. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;testfs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;testfs.img
  406. dd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/zero&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1M&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;300&lt;/span&gt;
  407. &lt;span class=&quot;s2&quot;&gt;&quot;mkfs.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  408. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  409.  
  410. &lt;p&gt;Finally, we can start our VM using &lt;a href=&quot;https://en.wikipedia.org/wiki/QEMU&quot;&gt;QEMU&lt;/a&gt;:&lt;/p&gt;
  411. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;qemu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;qemu-system-&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
  412. &lt;span class=&quot;nv&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/boot/vmlinuz-&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;uname&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
  413.  
  414. &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$qemu&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  415. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-kernel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$kernel&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  416. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-append&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;root=/dev/sda ro panic=-1 console=ttyS0 quiet test.fs=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  417. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=0,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  418. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=1,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  419. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-no-reboot&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  420. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-nographic
  421. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  422.  
  423. &lt;p&gt;Again we’re stealing the kernel from the host operating system, which is also
  424. where the kernel modules come from. The &lt;code&gt;drive&lt;/code&gt; with &lt;code&gt;index=0&lt;/code&gt; is the initramfs
  425. and will be visible as &lt;code&gt;/dev/sda&lt;/code&gt; in the guest; the other drive with &lt;code&gt;index=1&lt;/code&gt;
  426. is our test storage and will be visible as &lt;code&gt;/dev/sdb&lt;/code&gt;.&lt;/p&gt;
  427. &lt;p&gt;&lt;code&gt;root=/dev/sda&lt;/code&gt; tells the kernel to boot from our initramfs image. &lt;code&gt;panic=-1&lt;/code&gt;
  428. tells the kernel not to reboot in case of a panic (&lt;code&gt;panic=N&lt;/code&gt; specifies the
  429. number of seconds to wait before rebooting in case of kernel panic; specifying
  430. a negative value blocks that behavior). &lt;code&gt;console=ttyS0&lt;/code&gt; allows us to capture
  431. the output printed by the init script. &lt;code&gt;test.fs=...&lt;/code&gt; is the option that
  432. &lt;code&gt;init.sh&lt;/code&gt; is going to look for to understand what filesystem type to use.&lt;/p&gt;
  433. &lt;p&gt;Once that runs, the virtual machine is expected to do its job and crash with a
  434. kernel panic. We then need to restart it to verify the file contents. The QEMU
  435. command is exactly the same except for the additional &lt;code&gt;test.verify&lt;/code&gt; option:&lt;/p&gt;
  436. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;output.txt
  437.  
  438. &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$qemu&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  439. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-kernel&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$kernel&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  440. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-append&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;root=/dev/sda ro panic=-1 console=ttyS0 quiet test.fs=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filesystem_type&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; test.verify&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  441. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=0,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$initramfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  442. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-drive&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;index=1,media=disk,format=raw,file=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$testfs&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  443. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-no-reboot&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  444. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;-nographic&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  445. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;tee&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
  446. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  447.  
  448. &lt;p&gt;The output from this command is captured in a file that can be analyzed. If you
  449. remember how &lt;code&gt;init.sh&lt;/code&gt; is written, you might have noticed that it writes the
  450. test file contents between two markers:&lt;/p&gt;
  451. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
  452. xxd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/test/file
  453. &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'-----'&lt;/span&gt;
  454. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  455.  
  456. &lt;p&gt;So what we have to do to verify the contents of the file is simply look for
  457. those two &lt;code&gt;-----&lt;/code&gt; markers, get the content in between, and parse it through
  458. &lt;code&gt;xxd -r&lt;/code&gt;:&lt;/p&gt;
  459. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;sed&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-n&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/-----/, /-----/p'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$output&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;xxd&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;hello&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  460. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Success&quot;&lt;/span&gt;
  461. &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
  462. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Failure&quot;&lt;/span&gt;
  463. &lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  464. &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
  465. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  466.  
  467. &lt;p&gt;And that’s it!&lt;/p&gt;
  468. &lt;h1 id=&quot;running-in-github-actions&quot;&gt;Running in GitHub Actions&lt;/h1&gt;
  469. &lt;p&gt;The next step for me was to set up some automation to make sure that my test
  470. script was run whenever I made any change to the crate. Because my project was
  471. already hosted on GitHub, I decided to go with GitHub Actions. I was a bit
  472. worried that I would have had to struggle to make it work because my script
  473. works by &lt;em&gt;stealing&lt;/em&gt; the kernel from the host, and I thought that the GitHub
  474. runners could have some protections in place to prevent me from reading the
  475. kernel. To my surprise, there were no such restrictions. In fact, I did not
  476. have to modify a single line of code to make my tests work in GitHub Actions:
  477. check out the &lt;a href=&quot;https://github.com/andreacorbellini/rust-atomic-write-file/blob/master/.github/workflows/crash-tests.yml&quot;&gt;workflow file&lt;/a&gt; if you’re curious.&lt;/p&gt;
  478. &lt;h1 id=&quot;result&quot;&gt;Result&lt;/h1&gt;
  479. &lt;p&gt;In the end, the test suite was able to reproduce the issue with btrfs and
  480. anonymous temporary files, as well as show that the fix was working as
  481. intended. This is what it looks like (output in the screenshot was trimmed down
  482. a bit):&lt;/p&gt;
  483. &lt;figure&gt;
  484.  &lt;img alt=&quot;Output showing a failure from the test suite&quot; src=&quot;https://andrea.corbellini.name/images/crash-tests-failure.png&quot; /&gt;
  485.  Output from the &lt;code&gt;run-test.sh&lt;/code&gt; script &lt;em&gt;before&lt;/em&gt; applying the fix, showing a failure.
  486. &lt;/figure&gt;
  487.  
  488. &lt;figure&gt;
  489.  &lt;img alt=&quot;Output showing a success from the test suite&quot; src=&quot;https://andrea.corbellini.name/images/crash-tests-success.png&quot; /&gt;
  490.  Output from the &lt;code&gt;run-test.sh&lt;/code&gt; script &lt;em&gt;after&lt;/em&gt; applying the fix, showing a success.
  491. &lt;/figure&gt;
  492.  
  493. &lt;h1 id=&quot;future&quot;&gt;Future&lt;/h1&gt;
  494. &lt;p&gt;I’m pretty satisfied with the general approach of running in a virtual machine
  495. and simulating a crash, but the implementation has a huge limitation: because
  496. it &lt;em&gt;steals&lt;/em&gt; the kernel from the host, it cannot simulate crashes on other
  497. kernels, operating systems, or platforms.&lt;/p&gt;
  498. &lt;p&gt;I think in the future I’m going to take a look at &lt;a href=&quot;https://github.com/cross-rs/cross&quot;&gt;cross-rs&lt;/a&gt;, a cross-platform
  499. tool for Rust crates. Cross-rs works kinda in a similar way as my test suite,
  500. in that it uses QEMU emulation to run tests. Maybe I can reuse their QEMU
  501. images and tweak them to run my crash tests. If that is feasible, then I will
  502. be able to extend my test suite to all major platforms and operating systems.&lt;/p&gt;</description>
  503. <pubDate>Tue, 09 Sep 2025 00:05:00 +0000</pubDate>
  504. </item>
  505. <item>
  506. <title>The Fridge: Ubuntu Weekly Newsletter Issue 908</title>
  507. <guid isPermaLink="false">https://fridge.ubuntu.com/?p=10610</guid>
  508. <link>https://fridge.ubuntu.com/2025/09/08/ubuntu-weekly-newsletter-issue-908/</link>
  509. <description>&lt;p&gt;&lt;img src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2020/02/c9d7/header.png&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Welcome to the Ubuntu Weekly Newsletter, &lt;strong&gt;Issue 908 for the week of August 31 – September 6, 2025&lt;/strong&gt;. The full version of this issue is available &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-issue-908/66467&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
  510.  
  511.  
  512.  
  513. &lt;p&gt;In this issue we cover:&lt;/p&gt;
  514.  
  515.  
  516.  
  517. &lt;ul&gt;&lt;li&gt;rust-coreutils transition landing in release pocket&lt;/li&gt;&lt;li&gt;Call for Nominations: Ubuntu Communications Council&lt;/li&gt;&lt;li&gt;Ubuntu Stats&lt;/li&gt;&lt;li&gt;Hot in Support&lt;/li&gt;&lt;li&gt;Rocks Public Journal; 2025-09-05&lt;/li&gt;&lt;li&gt;Other Meeting Reports&lt;/li&gt;&lt;li&gt;Upcoming Meetings and Events&lt;/li&gt;&lt;li&gt;Lasting Memories from DjangoCon Africa and UbuCon Africa 2025&lt;/li&gt;&lt;li&gt;Ubuntu at DevConf.US – Boston, USA, September 19th-20th&lt;/li&gt;&lt;li&gt;Event Report from Youngbin Han – UbuCon Asia 2025&lt;/li&gt;&lt;li&gt;LoCo Events&lt;/li&gt;&lt;li&gt;The Immutable Linux Paradox&lt;/li&gt;&lt;li&gt;Sudo-rs is now default for Questing Quokka&lt;/li&gt;&lt;li&gt;Multipass 1.16.1 bug fix release&lt;/li&gt;&lt;li&gt;OpenJDK 19 removal from Ubuntu 22.04 LTS (Jammy Jellyfish)&lt;/li&gt;&lt;li&gt;Ubuntu Project docs: Another day at the office…&lt;/li&gt;&lt;li&gt;Desktop docs taking a new direction&lt;/li&gt;&lt;li&gt;Other Community News&lt;/li&gt;&lt;li&gt;Ubuntu Cloud News&lt;/li&gt;&lt;li&gt;Canonical News&lt;/li&gt;&lt;li&gt;In the Blogosphere&lt;/li&gt;&lt;li&gt;Featured Audio and Video&lt;/li&gt;&lt;li&gt;Updates and Security for Ubuntu 22.04, 24.04, and 25.04&lt;/li&gt;&lt;li&gt;And much more!&lt;/li&gt;&lt;/ul&gt;
  518.  
  519.  
  520.  
  521. &lt;p&gt;&lt;strong&gt;The Ubuntu Weekly Newsletter is brought to you by:&lt;/strong&gt;&lt;/p&gt;
  522.  
  523.  
  524.  
  525. &lt;ul&gt;&lt;li&gt;Krytarik Raido&lt;/li&gt;&lt;li&gt;Bashing-om&lt;/li&gt;&lt;li&gt;Chris Guiver&lt;/li&gt;&lt;li&gt;Wild Man&lt;/li&gt;&lt;li&gt;Cristovao Cordeiro (cjdc) – Rocks&lt;/li&gt;&lt;li&gt;And many others&lt;/li&gt;&lt;/ul&gt;
  526.  
  527.  
  528.  
  529. &lt;p&gt;If you have a story idea for the Weekly Newsletter, join the &lt;a href=&quot;https://lists.ubuntu.com/mailman/listinfo/Ubuntu-news-team&quot;&gt;Ubuntu News Team mailing list&lt;/a&gt; and submit it. Ideas can also be added to the &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-ideas/40053&quot;&gt;wiki&lt;/a&gt;!&lt;/p&gt;
  530.  
  531.  
  532.  
  533. &lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;alignleft&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2015/05/ab28/CCL.png&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  534.  
  535.  
  536.  
  537. &lt;p&gt;&lt;a href=&quot;https://fridge.ubuntu.com/2025/09/08/ubuntu-weekly-newsletter-issue-908/&quot;&gt;&lt;/a&gt;.&lt;/p&gt;</description>
  538. <pubDate>Mon, 08 Sep 2025 22:45:08 +0000</pubDate>
  539. </item>
  540. <item>
  541. <title>Colin Watson: Free software activity in August 2025</title>
  542. <guid isPermaLink="false">tag:www.chiark.greenend.org.uk,2025-09-03:/~cjwatson/blog/activity-2025-08.html</guid>
  543. <link>https://www.chiark.greenend.org.uk/~cjwatson/blog/activity-2025-08.html</link>
  544. <description>&lt;p&gt;About 95% of my Debian contributions this month were
  545. &lt;a href=&quot;https://www.freexian.com/about/debian-contributions/&quot;&gt;sponsored&lt;/a&gt; by Freexian.&lt;/p&gt;
  546. &lt;p&gt;You can also support my work directly via
  547. &lt;a href=&quot;https://liberapay.com/cjwatson&quot;&gt;Liberapay&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/cjwatson&quot;&gt;GitHub
  548. Sponsors&lt;/a&gt;.&lt;/p&gt;
  549. &lt;h2&gt;Python team&lt;/h2&gt;
  550. &lt;p&gt;forky is
  551. &lt;a href=&quot;https://lists.debian.org/debian-devel-announce/2025/08/msg00002.html&quot;&gt;open&lt;/a&gt;!
  552. As a result I’m starting to think about the &lt;a href=&quot;https://peps.python.org/pep-0745/&quot;&gt;upcoming Python
  553. 3.14&lt;/a&gt;.  At some point we’ll doubtless do
  554. a full test rebuild, but in advance of that I concluded that one of the most
  555. useful things I could do would be to work on our &lt;a href=&quot;https://udd.debian.org/dmd/?email1=team%2Bpython%40tracker.debian.org&quot;&gt;very long list of packages
  556. with new upstream
  557. versions&lt;/a&gt;.
  558. Of course there’s no real chance of this ever becoming empty since upstream
  559. maintainers aren’t going to stop work for that long, but there are a lot of
  560. packages there where we’re quite a long way out of date, and many of those
  561. include fixes that we’ll need for 3.14, either directly or by fixing
  562. interactions with new versions of other packages that in turn will need to
  563. be fixed.  We can backport changes when we need to, but more often than not
  564. the most efficient way to do things is just to keep up to date.&lt;/p&gt;
  565. &lt;p&gt;So, I upgraded these packages to new upstream versions (deep breath):&lt;/p&gt;
  566. &lt;ul&gt;
  567. &lt;li&gt;aioftp&lt;/li&gt;
  568. &lt;li&gt;aiosignal (building on &lt;a href=&quot;https://salsa.debian.org/python-team/packages/aiosignal/-/merge_requests/1&quot;&gt;work by
  569.  IanLucca&lt;/a&gt;)&lt;/li&gt;
  570. &lt;li&gt;audioop-lts&lt;/li&gt;
  571. &lt;li&gt;celery&lt;/li&gt;
  572. &lt;li&gt;djangorestframework&lt;/li&gt;
  573. &lt;li&gt;djoser&lt;/li&gt;
  574. &lt;li&gt;fpylll&lt;/li&gt;
  575. &lt;li&gt;frozenlist&lt;/li&gt;
  576. &lt;li&gt;git-repo-updater&lt;/li&gt;
  577. &lt;li&gt;ipykernel&lt;/li&gt;
  578. &lt;li&gt;klepto&lt;/li&gt;
  579. &lt;li&gt;kombu&lt;/li&gt;
  580. &lt;li&gt;multipart&lt;/li&gt;
  581. &lt;li&gt;netmiko (sponsoring &lt;a href=&quot;https://salsa.debian.org/python-team/packages/netmiko/-/merge_requests/1&quot;&gt;work by Eduardo
  582.  Silva&lt;/a&gt;;
  583.  &lt;a href=&quot;https://github.com/ktbyers/netmiko/pull/3722&quot;&gt;contributed supporting fix
  584.  upstream&lt;/a&gt;)&lt;/li&gt;
  585. &lt;li&gt;pathos&lt;/li&gt;
  586. &lt;li&gt;ppft&lt;/li&gt;
  587. &lt;li&gt;pydantic&lt;/li&gt;
  588. &lt;li&gt;pydantic-core&lt;/li&gt;
  589. &lt;li&gt;pydantic-settings&lt;/li&gt;
  590. &lt;li&gt;pylsqpack&lt;/li&gt;
  591. &lt;li&gt;pymssql&lt;/li&gt;
  592. &lt;li&gt;pytest-mock&lt;/li&gt;
  593. &lt;li&gt;pytest-pretty&lt;/li&gt;
  594. &lt;li&gt;pytest-repeat&lt;/li&gt;
  595. &lt;li&gt;pytest-rerunfailures&lt;/li&gt;
  596. &lt;li&gt;python-a2wsgi&lt;/li&gt;
  597. &lt;li&gt;python-apptools (sponsoring &lt;a href=&quot;https://salsa.debian.org/python-team/packages/python-apptools/-/merge_requests/6&quot;&gt;work by Kathlyn Lara
  598.  Murussi&lt;/a&gt;)&lt;/li&gt;
  599. &lt;li&gt;python-asgiref&lt;/li&gt;
  600. &lt;li&gt;python-asyncssh&lt;/li&gt;
  601. &lt;li&gt;python-bitarray&lt;/li&gt;
  602. &lt;li&gt;python-bitstring&lt;/li&gt;
  603. &lt;li&gt;python-bytecode&lt;/li&gt;
  604. &lt;li&gt;python-channels-redis&lt;/li&gt;
  605. &lt;li&gt;python-charset-normalizer&lt;/li&gt;
  606. &lt;li&gt;python-daphne&lt;/li&gt;
  607. &lt;li&gt;python-django-analytical&lt;/li&gt;
  608. &lt;li&gt;python-django-guid&lt;/li&gt;
  609. &lt;li&gt;python-django-health-check&lt;/li&gt;
  610. &lt;li&gt;python-django-pgbulk&lt;/li&gt;
  611. &lt;li&gt;python-django-pgtrigger&lt;/li&gt;
  612. &lt;li&gt;python-django-postgres-extra&lt;/li&gt;
  613. &lt;li&gt;python-django-storages&lt;/li&gt;
  614. &lt;li&gt;python-holidays&lt;/li&gt;
  615. &lt;li&gt;python-httpx-sse&lt;/li&gt;
  616. &lt;li&gt;python-icalendar&lt;/li&gt;
  617. &lt;li&gt;python-lazy-model&lt;/li&gt;
  618. &lt;li&gt;python-line-profiler&lt;/li&gt;
  619. &lt;li&gt;python-lz4&lt;/li&gt;
  620. &lt;li&gt;python-marshmallow-dataclass&lt;/li&gt;
  621. &lt;li&gt;python-mastodon&lt;/li&gt;
  622. &lt;li&gt;python-model-bakery&lt;/li&gt;
  623. &lt;li&gt;python-oauthlib&lt;/li&gt;
  624. &lt;li&gt;python-parse-type&lt;/li&gt;
  625. &lt;li&gt;python-pathvalidate&lt;/li&gt;
  626. &lt;li&gt;python-pgspecial&lt;/li&gt;
  627. &lt;li&gt;python-processview&lt;/li&gt;
  628. &lt;li&gt;python-pytest-subtests&lt;/li&gt;
  629. &lt;li&gt;python-roman&lt;/li&gt;
  630. &lt;li&gt;python-semantic-release&lt;/li&gt;
  631. &lt;li&gt;python-testfixtures&lt;/li&gt;
  632. &lt;li&gt;python-time-machine&lt;/li&gt;
  633. &lt;li&gt;python-tokenize-rt&lt;/li&gt;
  634. &lt;li&gt;python-typeguard&lt;/li&gt;
  635. &lt;li&gt;python-typing-extensions&lt;/li&gt;
  636. &lt;li&gt;python-urllib3&lt;/li&gt;
  637. &lt;li&gt;pyupgrade&lt;/li&gt;
  638. &lt;li&gt;requests (fixing &lt;a href=&quot;http://bugs.debian.org/1107368&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt;-2024-47081&lt;/a&gt;)&lt;/li&gt;
  639. &lt;li&gt;responses&lt;/li&gt;
  640. &lt;li&gt;zope.deferredimport&lt;/li&gt;
  641. &lt;li&gt;zope.schema&lt;/li&gt;
  642. &lt;li&gt;zope.testrunner&lt;/li&gt;
  643. &lt;/ul&gt;
  644. &lt;p&gt;That’s only about 10% of the backlog, but of course others are working on
  645. this too.  If we can keep this up for a while then it should help.&lt;/p&gt;
  646. &lt;p&gt;I packaged &lt;a href=&quot;https://bugs.debian.org/1111640&quot;&gt;pytest-run-parallel&lt;/a&gt;,
  647. &lt;a href=&quot;https://bugs.debian.org/1110995&quot;&gt;pytest-unmagic&lt;/a&gt; (still in &lt;code&gt;NEW&lt;/code&gt;), and
  648. &lt;a href=&quot;https://bugs.debian.org/1111569&quot;&gt;python-forbiddenfruit&lt;/a&gt; (still in &lt;code&gt;NEW&lt;/code&gt;),
  649. all needed as new dependencies of various other packages.&lt;/p&gt;
  650. &lt;p&gt;setuptools upstream will be &lt;a href=&quot;https://setuptools.pypa.io/en/stable/history.html#v80-1-0&quot;&gt;removing the &lt;code&gt;setup.py install&lt;/code&gt;
  651. command&lt;/a&gt; on 31
  652. October.  While this may not trickle down immediately into Debian, it does
  653. mean that in the near future nearly all Python packages will have to use
  654. &lt;code&gt;pybuild-plugin-pyproject&lt;/code&gt; (note that this does &lt;em&gt;not&lt;/em&gt; mean that they
  655. necessarily have to use &lt;code&gt;pyproject.toml&lt;/code&gt;; this is just a question of how the
  656. packaging runs the build system).  We talked about this a bit at DebConf,
  657. and I said that I’d noticed a number of packages where this isn’t
  658. straightforward and promised to write up some notes.  I wrote the
  659. &lt;a href=&quot;https://wiki.debian.org/Python/PybuildPluginPyproject&quot;&gt;Python/PybuildPluginPyproject&lt;/a&gt;
  660. wiki page for this; I expect to add more bits and pieces to it as I find them.&lt;/p&gt;
  661. &lt;p&gt;On that note, I converted several packages to &lt;code&gt;pybuild-plugin-pyproject&lt;/code&gt;:&lt;/p&gt;
  662. &lt;ul&gt;
  663. &lt;li&gt;billiard&lt;/li&gt;
  664. &lt;li&gt;lazr.config&lt;/li&gt;
  665. &lt;li&gt;python-timeline&lt;/li&gt;
  666. &lt;li&gt;zope.sqlalchemy&lt;/li&gt;
  667. &lt;li&gt;zope.testing&lt;/li&gt;
  668. &lt;/ul&gt;
  669. &lt;p&gt;I fixed several build/test failures:&lt;/p&gt;
  670. &lt;ul&gt;
  671. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1111057&quot;&gt;aiosmtplib&lt;/a&gt;&lt;/li&gt;
  672. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1111058&quot;&gt;blinker&lt;/a&gt;&lt;/li&gt;
  673. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1111059&quot;&gt;ipykernel&lt;/a&gt;&lt;/li&gt;
  674. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1111060&quot;&gt;ipyparallel&lt;/a&gt;&lt;/li&gt;
  675. &lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/python-team/packages/quart/-/commit/481c11c4fc33a18b17f8b223dff584342adc84af&quot;&gt;quart&lt;/a&gt;&lt;/li&gt;
  676. &lt;/ul&gt;
  677. &lt;p&gt;I fixed some other bugs:&lt;/p&gt;
  678. &lt;ul&gt;
  679. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1110821&quot;&gt;austin: binutils now has a libsframe-dev package, please add an explicit
  680.  build dependency&lt;/a&gt;&lt;/li&gt;
  681. &lt;li&gt;&lt;a href=&quot;https://salsa.debian.org/python-team/packages/python-django-pgbulk/-/commit/96a17113f634d3c401c21a113579273ec49ccc2b&quot;&gt;python-django-pgbulk: Missing dependency on
  682.  python3-typing-extensions&lt;/a&gt;
  683.  (&lt;a href=&quot;https://github.com/AmbitionEng/django-pgbulk/pull/54&quot;&gt;contributed
  684.  upstream&lt;/a&gt;)&lt;/li&gt;
  685. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1110139&quot;&gt;python-maturin: Upcoming rust-which update&lt;/a&gt;&lt;/li&gt;
  686. &lt;/ul&gt;
  687. &lt;p&gt;I reviewed &lt;a href=&quot;https://salsa.debian.org/python-team/packages/fail2ban/-/merge_requests/18&quot;&gt;Debian defaults: nftables as banaction and systemd as
  688. backend&lt;/a&gt;,
  689. but it looked as though nothing actually needed to be changed so we closed
  690. this with no action.&lt;/p&gt;
  691. &lt;h2&gt;Rust team&lt;/h2&gt;
  692. &lt;p&gt;Upgrading Pydantic was complicated, and required a rust-pyo3 transition
  693. (which Jelmer Vernooij started and Peter Michael Green has mostly been
  694. driving, thankfully), packaging rust-malloc-size-of (including an &lt;a href=&quot;https://github.com/servo/malloc_size_of/pull/12&quot;&gt;upstream
  695. portability fix&lt;/a&gt;), and
  696. upgrading several packages to new upstream versions:&lt;/p&gt;
  697. &lt;ul&gt;
  698. &lt;li&gt;rust-serde&lt;/li&gt;
  699. &lt;li&gt;rust-serde-derive&lt;/li&gt;
  700. &lt;li&gt;rust-serde-json&lt;/li&gt;
  701. &lt;li&gt;rust-smallvec&lt;/li&gt;
  702. &lt;li&gt;rust-speedate&lt;/li&gt;
  703. &lt;li&gt;rust-time&lt;/li&gt;
  704. &lt;li&gt;rust-time-core&lt;/li&gt;
  705. &lt;li&gt;rust-time-macros&lt;/li&gt;
  706. &lt;/ul&gt;
  707. &lt;h2&gt;bugs.debian.org&lt;/h2&gt;
  708. &lt;p&gt;I fixed &lt;a href=&quot;https://bugs.debian.org/1078575&quot;&gt;bugs.debian.org: misspelled checkbox id
  709. “uselessmesages”&lt;/a&gt;, as well as a &lt;a href=&quot;https://salsa.debian.org/debbugs-team/debbugs/-/commit/fff0db4e57a2781f5c82827e42f395a3325270f3&quot;&gt;bug that
  710. caused incoming emails with certain header contents to go
  711. missing&lt;/a&gt;.&lt;/p&gt;
  712. &lt;h2&gt;OpenSSH&lt;/h2&gt;
  713. &lt;p&gt;I fixed &lt;a href=&quot;https://bugs.debian.org/1080350&quot;&gt;openssh-server: refuses further connections after having handled
  714. PerSourceMaxStartups connections&lt;/a&gt; with a
  715. cherry-pick from upstream.&lt;/p&gt;
  716. &lt;h2&gt;Other bits and pieces&lt;/h2&gt;
  717. &lt;p&gt;I upgraded libfido2 to a new upstream version.&lt;/p&gt;
  718. &lt;p&gt;I fixed &lt;a href=&quot;https://bugs.debian.org/1103589&quot;&gt;mimalloc: &lt;span class=&quot;caps&quot;&gt;FTBFS&lt;/span&gt; on armhf: cc1: error: ‘-mfloat-abi=hard’: selected
  719. architecture lacks an &lt;span class=&quot;caps&quot;&gt;FPU&lt;/span&gt;&lt;/a&gt;, which was
  720. blocking changes to pendulum in the Python team.  I also spent some time
  721. helping to investigate &lt;a href=&quot;https://bugs.debian.org/1106879&quot;&gt;libmimalloc3: Illegal instruction Running mtxrun
  722. —generate&lt;/a&gt;, though that bug is still open.&lt;/p&gt;
  723. &lt;p&gt;I fixed &lt;a href=&quot;https://salsa.debian.org/debian/gssproxy/-/compare/debian%2F0.9.2-3...debian%2F0.9.2-4?from_project_id=45135&quot;&gt;various autopkgtest bugs in
  724. gssproxy&lt;/a&gt;,
  725. prompted by
  726. &lt;a href=&quot;https://salsa.debian.org/freexian-team/debusine/-/issues/1007&quot;&gt;#1007&lt;/a&gt; in Debusine.&lt;/p&gt;
  727. &lt;p&gt;Since my old team is &lt;a href=&quot;https://blog.launchpad.net/general/phasing-out-bazaar-code-hosting&quot;&gt;decommissioning Bazaar/Breezy code hosting in
  728. Launchpad&lt;/a&gt;
  729. (the end of an era, which I have distinctly mixed feelings about), I
  730. converted &lt;a href=&quot;https://git.launchpad.net/storm&quot;&gt;Storm&lt;/a&gt; to git.&lt;/p&gt;</description>
  731. <pubDate>Wed, 03 Sep 2025 10:56:59 +0000</pubDate>
  732. </item>
  733. <item>
  734. <title>The Fridge: Ubuntu Weekly Newsletter Issue 907</title>
  735. <guid isPermaLink="false">https://fridge.ubuntu.com/?p=10607</guid>
  736. <link>https://fridge.ubuntu.com/2025/09/01/ubuntu-weekly-newsletter-issue-907/</link>
  737. <description>&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2020/02/c9d7/header.png&quot; /&gt;&lt;/figure&gt;
  738.  
  739.  
  740.  
  741. &lt;p&gt;Welcome to the Ubuntu Weekly Newsletter, &lt;strong&gt;Issue 907 for the week of August 24 – 30, 2025&lt;/strong&gt;. The full version of this issue is available &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-issue-907/66322&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
  742.  
  743.  
  744.  
  745. &lt;p&gt;In this issue we cover:&lt;/p&gt;
  746.  
  747.  
  748.  
  749. &lt;ul&gt;&lt;li&gt;Questing Snapshot 4 released&lt;/li&gt;&lt;li&gt;Ubuntu Stats&lt;/li&gt;&lt;li&gt;Hot in Support&lt;/li&gt;&lt;li&gt;Other Meeting Reports&lt;/li&gt;&lt;li&gt;Upcoming Meetings and Events&lt;/li&gt;&lt;li&gt;Discover the Pre-UbuConLA 2025 Agenda – Now Available&lt;/li&gt;&lt;li&gt;Welcome to the CODA workshop at UbuCon Asia&lt;/li&gt;&lt;li&gt;LoCo Events&lt;/li&gt;&lt;li&gt;Ubuntu Server Gazette – Issue 7 – MySQL memory allocation&lt;/li&gt;&lt;li&gt;Mir Office Hours – 2025-08-28 15:15UTC&lt;/li&gt;&lt;li&gt;Ubuntu-pt Newsletter 1&lt;/li&gt;&lt;li&gt;A Bittersweet Farewell: My Final KDE Snap Release and the End of an Era&lt;/li&gt;&lt;li&gt;Ubuntu Cloud News&lt;/li&gt;&lt;li&gt;Canonical News&lt;/li&gt;&lt;li&gt;In the Blogosphere&lt;/li&gt;&lt;li&gt;Featured Audio and Video&lt;/li&gt;&lt;li&gt;Updates and Security for Ubuntu 22.04, 24.04, and 25.04&lt;/li&gt;&lt;li&gt;And much more!&lt;/li&gt;&lt;/ul&gt;
  750.  
  751.  
  752.  
  753. &lt;p&gt;&lt;strong&gt;The Ubuntu Weekly Newsletter is brought to you by:&lt;/strong&gt;&lt;/p&gt;
  754.  
  755.  
  756.  
  757. &lt;ul&gt;&lt;li&gt;Krytarik Raido&lt;/li&gt;&lt;li&gt;Bashing-om&lt;/li&gt;&lt;li&gt;Chris Guiver&lt;/li&gt;&lt;li&gt;Wild Man&lt;/li&gt;&lt;li&gt;And many others&lt;/li&gt;&lt;/ul&gt;
  758.  
  759.  
  760.  
  761. &lt;p&gt;If you have a story idea for the Weekly Newsletter, join the &lt;a href=&quot;https://lists.ubuntu.com/mailman/listinfo/Ubuntu-news-team&quot;&gt;Ubuntu News Team mailing list&lt;/a&gt; and submit it. Ideas can also be added to the &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-weekly-newsletter-ideas/40053&quot;&gt;wiki&lt;/a&gt;!&lt;/p&gt;
  762.  
  763.  
  764.  
  765. &lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;alignleft&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://fridge.ubuntu.com/wp-content/uploads/2015/05/ab28/CCL.png&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  766.  
  767.  
  768.  
  769. &lt;p&gt;&lt;a href=&quot;https://fridge.ubuntu.com/2025/09/01/ubuntu-weekly-newsletter-issue-907/&quot;&gt;&lt;/a&gt;.&lt;/p&gt;</description>
  770. <pubDate>Mon, 01 Sep 2025 22:31:42 +0000</pubDate>
  771. </item>
  772. <item>
  773. <title>St&amp;eacute;phane Graber: Announcing Incus 6.16</title>
  774. <guid isPermaLink="false">https://stgraber.org/?p=1777</guid>
  775. <link>https://stgraber.org/2025/09/01/announcing-incus-6-16/</link>
  776. <description>&lt;p&gt;The Incus team is pleased to announce the release of Incus 6.16!&lt;/p&gt;
  777.  
  778.  
  779.  
  780. &lt;p&gt;This release brings in a new storage driver, the ability to install Windows VMs without having to rely on a repacked ISO and support for temporary storage in containers.&lt;/p&gt;
  781.  
  782.  
  783.  
  784. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://linuxcontainers.org/incus/try-it/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-1778&quot; height=&quot;425&quot; src=&quot;https://stgraber.org/wp-content/uploads/2025/09/image-1024x425.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
  785.  
  786.  
  787.  
  788. &lt;p&gt;The highlights for this release are:&lt;/p&gt;
  789.  
  790.  
  791.  
  792. &lt;ul class=&quot;wp-block-list&quot;&gt;
  793. &lt;li&gt;TrueNAS storage driver&lt;/li&gt;
  794.  
  795.  
  796.  
  797. &lt;li&gt;USB CD-ROM handling for VMs&lt;/li&gt;
  798.  
  799.  
  800.  
  801. &lt;li&gt;tmpfs and tmpfs-overlay disks for containers&lt;/li&gt;
  802.  
  803.  
  804.  
  805. &lt;li&gt;Configurable console behavior in the CLI&lt;/li&gt;
  806. &lt;/ul&gt;
  807.  
  808.  
  809.  
  810. &lt;p&gt;The full announcement and changelog can be &lt;a href=&quot;https://discuss.linuxcontainers.org/t/incus-6-16-has-been-released/24614&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;found here&lt;/a&gt;.&lt;br /&gt;And for those who prefer videos, here’s the release overview video:&lt;/p&gt;
  811.  
  812.  
  813.  
  814. &lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;
  815.  
  816. &lt;/div&gt;&lt;/figure&gt;
  817.  
  818.  
  819.  
  820. &lt;p&gt;You can take the latest release of Incus up for a spin through our online demo service at: &lt;a href=&quot;https://linuxcontainers.org/incus/try-it/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;https://linuxcontainers.org/incus/try-it/&lt;/a&gt;&lt;/p&gt;
  821.  
  822.  
  823.  
  824. &lt;p&gt;And as always, my company is offering commercial support on Incus, ranging from by-the-hour support contracts to one-off services on things like initial migration from LXD, review of your deployment to squeeze the most out of Incus or even feature sponsorship. You’ll find all details of that here: &lt;a href=&quot;https://zabbly.com/incus&quot;&gt;https://zabbly.com/incus&lt;/a&gt;&lt;/p&gt;
  825.  
  826.  
  827.  
  828. &lt;p&gt;Donations towards my work on this and other open source projects is also always appreciated, you can  find me on &lt;a href=&quot;https://github.com/sponsors/stgraber&quot;&gt;Github Sponsors&lt;/a&gt;, &lt;a href=&quot;https://patreon.com/stgraber&quot;&gt;Patreon&lt;/a&gt; and &lt;a href=&quot;https://ko-fi.com/stgraber&quot;&gt;Ko-fi&lt;/a&gt;.&lt;/p&gt;
  829.  
  830.  
  831.  
  832. &lt;p&gt;Enjoy!&lt;/p&gt;
  833.  
  834.  
  835. &lt;p&gt;&lt;/p&gt;</description>
  836. <pubDate>Mon, 01 Sep 2025 15:19:43 +0000</pubDate>
  837. </item>
  838. <item>
  839. <title>Dougie Richardson: CLI Corner: rsync</title>
  840. <guid isPermaLink="false">https://dougiewougie.com/?p=2981</guid>
  841. <link>https://dougiewougie.com/2025/08/31/cli-corner-rsync/</link>
  842. <description>&lt;p&gt;Synchronise two directories, e.g. Nextcloud and an encrypted USB drive with archive, recursive, partial, and progress flags:&lt;/p&gt;
  843.  
  844.  
  845.  
  846. &lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code class=&quot;language-bash&quot; lang=&quot;bash&quot;&gt;rsync -varP src destination&lt;/code&gt;&lt;/pre&gt;
  847.  
  848.  
  849.  
  850. &lt;p&gt;&lt;/p&gt;</description>
  851. <pubDate>Sun, 31 Aug 2025 10:38:37 +0000</pubDate>
  852. </item>
  853. <item>
  854. <title>Salih Emin: Mastering the First Impression: Your intriguing post title goes here</title>
  855. <guid isPermaLink="true">https://stage.synergops.gr/post-3-2/</guid>
  856. <link>https://stage.synergops.gr/post-3-2/</link>
  857. <description>&lt;h4 class=&quot;wp-block-heading&quot;&gt;Engaging Introductions: Capturing Your Audience’s Interest&lt;/h4&gt;
  858.  
  859.  
  860.  
  861. &lt;p&gt;The initial impression your blog post makes is crucial, and that’s where your introduction comes into play. Hook your readers with a captivating opening that sparks curiosity or emotion. Address their pain points or questions to establish a connection. Outline the purpose of your post and give a sneak peek into what they can expect. A well-crafted introduction sets the tone for an immersive reading experience.&lt;/p&gt;
  862.  
  863.  
  864.  
  865. &lt;h4 class=&quot;wp-block-heading&quot;&gt;Crafting Informative and Cohesive Body Content&lt;/h4&gt;
  866.  
  867.  
  868.  
  869. &lt;p&gt;Within the body of your blog post lies the heart of your message. Break down your content into coherent sections, each with a clear heading that guides readers through the narrative. Dive deep into each subtopic, providing valuable insights, data, and relatable examples. Maintain a logical flow between paragraphs using transitions, ensuring that each point naturally progresses to the next. By structuring your body content effectively, you keep readers engaged and eager to learn more.&lt;/p&gt;
  870.  
  871.  
  872.  
  873. &lt;h4 class=&quot;wp-block-heading&quot;&gt;Powerful Closures: Leaving a Lasting Impression&lt;/h4&gt;
  874.  
  875.  
  876.  
  877. &lt;p&gt;Concluding your blog post isn’t just about wrapping things up – it’s your final opportunity to leave a strong impact. Summarize the key takeaways from your post, reinforcing your main points. If relevant, provide actionable solutions or thought-provoking questions to keep readers thinking beyond the post. Encourage engagement by inviting comments, questions, or sharing. A well-crafted conclusion should linger in your readers’ minds, inspiring them to explore further or apply what they’ve learned.&lt;/p&gt;
  878. &lt;p&gt;The post &lt;a href=&quot;https://stage.synergops.gr/post-3-2/&quot;&gt;Mastering the First Impression: Your intriguing post title goes here&lt;/a&gt; appeared first on &lt;a href=&quot;https://stage.synergops.gr&quot;&gt;SynergOps&lt;/a&gt;.&lt;/p&gt;</description>
  879. <pubDate>Sat, 30 Aug 2025 17:35:48 +0000</pubDate>
  880. </item>
  881. <item>
  882. <title>Salih Emin: The Art of Drawing Readers In: Your attractive post title goes here</title>
  883. <guid isPermaLink="true">https://stage.synergops.gr/post-2-2/</guid>
  884. <link>https://stage.synergops.gr/post-2-2/</link>
  885. <description>&lt;h4 class=&quot;wp-block-heading&quot;&gt;Engaging Introductions: Capturing Your Audience’s Interest&lt;/h4&gt;
  886.  
  887.  
  888.  
  889. &lt;p&gt;The initial impression your blog post makes is crucial, and that’s where your introduction comes into play. Hook your readers with a captivating opening that sparks curiosity or emotion. Address their pain points or questions to establish a connection. Outline the purpose of your post and give a sneak peek into what they can expect. A well-crafted introduction sets the tone for an immersive reading experience.&lt;/p&gt;
  890.  
  891.  
  892.  
  893. &lt;h4 class=&quot;wp-block-heading&quot;&gt;Crafting Informative and Cohesive Body Content&lt;/h4&gt;
  894.  
  895.  
  896.  
  897. &lt;p&gt;Within the body of your blog post lies the heart of your message. Break down your content into coherent sections, each with a clear heading that guides readers through the narrative. Dive deep into each subtopic, providing valuable insights, data, and relatable examples. Maintain a logical flow between paragraphs using transitions, ensuring that each point naturally progresses to the next. By structuring your body content effectively, you keep readers engaged and eager to learn more.&lt;/p&gt;
  898.  
  899.  
  900.  
  901. &lt;h4 class=&quot;wp-block-heading&quot;&gt;Powerful Closures: Leaving a Lasting Impression&lt;/h4&gt;
  902.  
  903.  
  904.  
  905. &lt;p&gt;Concluding your blog post isn’t just about wrapping things up – it’s your final opportunity to leave a strong impact. Summarize the key takeaways from your post, reinforcing your main points. If relevant, provide actionable solutions or thought-provoking questions to keep readers thinking beyond the post. Encourage engagement by inviting comments, questions, or sharing. A well-crafted conclusion should linger in your readers’ minds, inspiring them to explore further or apply what they’ve learned.&lt;/p&gt;
  906. &lt;p&gt;The post &lt;a href=&quot;https://stage.synergops.gr/post-2-2/&quot;&gt;The Art of Drawing Readers In: Your attractive post title goes here&lt;/a&gt; appeared first on &lt;a href=&quot;https://stage.synergops.gr&quot;&gt;SynergOps&lt;/a&gt;.&lt;/p&gt;</description>
  907. <pubDate>Sat, 30 Aug 2025 17:35:48 +0000</pubDate>
  908. </item>
  909. <item>
  910. <title>Podcast Ubuntu Portugal: E361 Prognósticos FSL</title>
  911. <guid isPermaLink="false">https://hub.podcastubuntuportugal.org/s/Xtjn494g5NRtwF5/download/e361.mp3</guid>
  912. <link>https://podcastubuntuportugal.org/e361/</link>
  913. <description>&lt;p&gt;Desta vez, o plantel está completo, numa antevisão do clássico Derby da Festa do Software Livre! Temos comentadores de peso: André Alves, Tiago Carreira e João Jotta, na mesa com Miguel e Diogo Constantino, que vão partilhar um pouco das suas aventuras tecnológicas, mas sobretudo as suas expectativas para a Festa do Software Livre, que decorrerá no Porto, de 3 a 5 de Outubro.&lt;/p&gt;
  914. &lt;p&gt;Já sabem: oiçam, subscrevam e partilhem!&lt;/p&gt;
  915. &lt;ul&gt;
  916. &lt;li&gt;Festa do Software Livre 2025, Porto, 3 a 5 de Outubro: &lt;a href=&quot;https://festa2025.softwarelivre.eu/pt/&quot;&gt;https://festa2025.softwarelivre.eu/pt/&lt;/a&gt;&lt;/li&gt;
  917. &lt;li&gt;&lt;a href=&quot;https://ansol.org&quot;&gt;https://ansol.org&lt;/a&gt;&lt;/li&gt;
  918. &lt;li&gt;&lt;a href=&quot;https://masto.pt/@andralves&quot;&gt;https://masto.pt/@andralves&lt;/a&gt;&lt;/li&gt;
  919. &lt;li&gt;&lt;a href=&quot;https://masto.pt/@tcarreira@floss.social&quot;&gt;https://masto.pt/@tcarreira@floss.social&lt;/a&gt;&lt;/li&gt;
  920. &lt;li&gt;&lt;a href=&quot;https://mastodon.online/@joaojotta&quot;&gt;https://mastodon.online/@joaojotta&lt;/a&gt;&lt;/li&gt;
  921. &lt;li&gt;&lt;a href=&quot;https://metenamesa.pt&quot;&gt;https://metenamesa.pt&lt;/a&gt;&lt;/li&gt;
  922. &lt;li&gt;&lt;a href=&quot;https://modaafoca.com&quot;&gt;https://modaafoca.com&lt;/a&gt;&lt;/li&gt;
  923. &lt;li&gt;&lt;a href=&quot;https://joaojotta.com&quot;&gt;https://joaojotta.com&lt;/a&gt;&lt;/li&gt;
  924. &lt;li&gt;&lt;a href=&quot;https://www.amazon.es/E1-Desktop-Computer-RJ45-4K-Display/dp/B0DWVZQ3SQ&quot;&gt;https://www.amazon.es/E1-Desktop-Computer-RJ45-4K-Display/dp/B0DWVZQ3SQ&lt;/a&gt;&lt;/li&gt;
  925. &lt;li&gt;&lt;a href=&quot;https://www.gmktec.com/products/intel-twin-lake-n150-dual-system-4-bay-nas-mini-pc-nucbox-g9&quot;&gt;https://www.gmktec.com/products/intel-twin-lake-n150-dual-system-4-bay-nas-mini-pc-nucbox-g9&lt;/a&gt;&lt;/li&gt;
  926. &lt;li&gt;&lt;a href=&quot;https://netbird.io/&quot;&gt;https://netbird.io/&lt;/a&gt;&lt;/li&gt;
  927. &lt;li&gt;Ubuntu Summit 2025, Londres, 23-24 de Outubro: &lt;a href=&quot;https://ubuntu.com/blog/ubuntu-summit-25-10-is-coming-to-your-circle-of-friends-from-london&quot;&gt;https://ubuntu.com/blog/ubuntu-summit-25-10-is-coming-to-your-circle-of-friends-from-london&lt;/a&gt;&lt;/li&gt;
  928. &lt;li&gt;LoCo PT: &lt;a href=&quot;https://loco.ubuntu.com/teams/ubuntu-pt/&quot;&gt;https://loco.ubuntu.com/teams/ubuntu-pt/&lt;/a&gt;&lt;/li&gt;
  929. &lt;li&gt;Mastodon: &lt;a href=&quot;https://masto.pt/@pup&quot;&gt;https://masto.pt/@pup&lt;/a&gt;&lt;/li&gt;
  930. &lt;li&gt;Youtube: &lt;a href=&quot;https://youtube.com/PodcastUbuntuPortugal&quot;&gt;https://youtube.com/PodcastUbuntuPortugal&lt;/a&gt;&lt;/li&gt;
  931. &lt;/ul&gt;
  932. &lt;h3 id=&quot;atribuição-e-licenças&quot;&gt;Atribuição e licenças&lt;/h3&gt;
  933. &lt;p&gt;Este episódio foi produzido por Diogo Constantino, Miguel e Tiago Carrondo e editado pelo &lt;a href=&quot;https://senhorpodcast.pt/&quot;&gt;Senhor Podcast&lt;/a&gt;.
  934. O website é produzido por Tiago Carrondo e o &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website&quot;&gt;código aberto&lt;/a&gt; está licenciado nos termos da &lt;a href=&quot;https://gitlab.com/podcastubuntuportugal/website/main/LICENSE&quot;&gt;Licença MIT&lt;/a&gt;. (&lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/)&quot;&gt;https://creativecommons.org/licenses/by/4.0/)&lt;/a&gt;. A música do genérico é: “Won’t see it comin’ (Feat Aequality &amp;amp; N’sorte d’autruche)”, por Alpha Hydrae e está licenciada nos termos da &lt;a href=&quot;https://creativecommons.org/publicdomain/zero/1.0/&quot;&gt;CC0 1.0 Universal License&lt;/a&gt;.
  935. Os separadores de péssima qualidade foram tocados ao vivo e sem rede pelo Miguel, pelo que pedimos desculpa pelos incómodos causados. OS efeitos sonoros têm os seguintes créditos: Isto é um Alerta Ubuntu: Breaking news intro music by humanoide9000 – &lt;a href=&quot;https://freesound.org/s/760770/&quot;&gt;https://freesound.org/s/760770/&lt;/a&gt; – License: Attribution 4.0. ; Junta-te à Força Aérea! - SunixMuz - Devil Dance (Opening, trailer, epic music, Free CCBY) by SunixMuz – &lt;a href=&quot;https://freesound.org/s/767842/&quot;&gt;https://freesound.org/s/767842/&lt;/a&gt; – License: Attribution 4.0
  936. Este episódio e a imagem utilizada estão licenciados nos termos da licença: &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/&quot;&gt;Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode&quot;&gt;cujo texto integral pode ser lido aqui&lt;/a&gt;. Estamos abertos a licenciar para permitir outros tipos de utilização, &lt;a href=&quot;https://podcastubuntuportugal.org/contactos&quot;&gt;contactem-nos&lt;/a&gt; para validação e autorização.
  937. A arte de episódio foi criada por encomenda pela Shizamura - artista, ilustradora e autora de BD. Podem ficar a conhecer melhor a &lt;a href=&quot;https://ciberlandia.pt/@shizamura&quot;&gt;Shizamura na Ciberlândia&lt;/a&gt; e no &lt;a href=&quot;https://sarilho.net/&quot;&gt;seu sítio web&lt;/a&gt;.&lt;/p&gt;</description>
  938. <pubDate>Thu, 28 Aug 2025 00:00:00 +0000</pubDate>
  939.        <enclosure url="https://hub.podcastubuntuportugal.org/s/Xtjn494g5NRtwF5/download/e361.mp3" length="31430947" type="audio/mpeg"/>
  940. </item>
  941. <item>
  942. <title>Scarlett Gately Moore: A Bittersweet Farewell: My Final KDE Snap Release and the End of an Era</title>
  943. <guid isPermaLink="false">https://www.scarlettgatelymoore.dev/?p=2134</guid>
  944. <link>https://www.scarlettgatelymoore.dev/a-bittersweet-farewell-my-final-kde-snap-release-and-the-end-of-an-era/</link>
  945. <description>&lt;p&gt;Today marks both a milestone and a turning point in my journey with open source software. I’m proud to announce the release of KDE Gear 25.08.0 as my final snap package release. You can find all the details about this exciting update at the &lt;a href=&quot;https://kde.org/announcements/gear/25.08.0/&quot;&gt;official KDE announcement&lt;/a&gt;.&lt;/p&gt;
  946.  
  947.  
  948.  
  949. &lt;p&gt;After much reflection and with a heavy heart, I’ve made the difficult decision to retire from most of my open source software work, including snap packaging. This wasn’t a choice I made lightly – it comes after months of rejections and silence in an industry I’ve loved and called home for over 20 years.&lt;/p&gt;
  950.  
  951.  
  952.  
  953. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Passing the Torch&lt;/h2&gt;
  954.  
  955.  
  956.  
  957. &lt;p&gt;While I’m stepping back, I’m thrilled to share that the future of KDE snaps is in excellent hands. Carlos from the Neon team has been working tirelessly to set up snaps on the new infrastructure that KDE has made available. This means building snaps in KDE CI is now possible – a significant leap forward for the ecosystem. I’ll be helping Carlos get the pipelines properly configured to ensure a smooth transition.&lt;/p&gt;
  958.  
  959.  
  960.  
  961. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Staying Connected (But Differently)&lt;/h2&gt;
  962.  
  963.  
  964.  
  965. &lt;p&gt;Though I’m stepping away from most development work, I won’t be disappearing entirely from the communities that have meant so much to me:&lt;/p&gt;
  966.  
  967.  
  968.  
  969. &lt;ul class=&quot;wp-block-list&quot;&gt;
  970. &lt;li&gt;&lt;strong&gt;Kubuntu&lt;/strong&gt;: I’ll remain available as a backup, though Rik is doing an absolutely fabulous job getting the latest and greatest KDE packages uploaded. The distribution is in capable hands.&lt;/li&gt;
  971.  
  972.  
  973.  
  974. &lt;li&gt;&lt;strong&gt;Ubuntu Community Council&lt;/strong&gt;: I’m continuing my involvement here because I’ve found myself genuinely enjoying the community side of things. There’s something deeply fulfilling about focusing on the human connections that make these projects possible.&lt;/li&gt;
  975.  
  976.  
  977.  
  978. &lt;li&gt;&lt;strong&gt;Debian&lt;/strong&gt;: I’ll likely be submitting for emeritus status, as I haven’t had the time to contribute meaningfully and want to be honest about my current capacity.&lt;/li&gt;
  979. &lt;/ul&gt;
  980.  
  981.  
  982.  
  983. &lt;h2 class=&quot;wp-block-heading&quot;&gt;The Reality Behind the Decision&lt;/h2&gt;
  984.  
  985.  
  986.  
  987. &lt;p&gt;This transition isn’t just about career fatigue – it’s about financial reality. I’ve spent too many years working for free while struggling to pay my bills. The recent changes in the industry, particularly with AI transforming the web development landscape, have made things even more challenging. Getting traffic to websites now requires extensive social media work and marketing – all expected to be done without compensation.&lt;/p&gt;
  988.  
  989.  
  990.  
  991. &lt;p&gt;My stint at webwork was good while it lasted, but the changing landscape has made it unsustainable. I’ve reached a point where I can’t continue doing free work when my family and I are struggling financially. It shouldn’t take breaking a limb to receive the donations needed to survive.&lt;/p&gt;
  992.  
  993.  
  994.  
  995. &lt;h2 class=&quot;wp-block-heading&quot;&gt;A Career That Meant Everything&lt;/h2&gt;
  996.  
  997.  
  998.  
  999. &lt;p&gt;These 20+ years in open source have been the defining chapter of my professional life. I’ve watched communities grow, technologies evolve, and witnessed firsthand the incredible things that happen when passionate people work together. The relationships I’ve built, the problems we’ve solved together, and the software we’ve created have been deeply meaningful.&lt;/p&gt;
  1000.  
  1001.  
  1002.  
  1003. &lt;p&gt;But I also have to be honest about where I stand today: I cannot compete in the current job market. The industry has changed, and despite my experience and passion, the opportunities just aren’t there for someone in my situation.&lt;/p&gt;
  1004.  
  1005.  
  1006.  
  1007. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Looking Forward&lt;/h2&gt;
  1008.  
  1009.  
  1010.  
  1011. &lt;p&gt;Making a career change after two decades is terrifying, but it’s also necessary. I need to find a path that can provide financial stability for my family while still allowing me to contribute meaningfully to the world.&lt;/p&gt;
  1012.  
  1013.  
  1014.  
  1015. &lt;p&gt;If you’ve benefited from my work over the years and are in a position to help during this transition, I would be forever grateful for any support. Every contribution, no matter the size, helps ease this difficult period: &lt;a href=&quot;https://gofund.me/a9c55d8f&quot;&gt;https://gofund.me/a9c55d8f&lt;/a&gt;&lt;/p&gt;
  1016.  
  1017.  
  1018.  
  1019. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Thank You&lt;/h2&gt;
  1020.  
  1021.  
  1022.  
  1023. &lt;p&gt;To everyone who has collaborated with me, tested my packages, filed bug reports, offered encouragement, or simply used the software I’ve helped maintain – thank you. You’ve made these 20+ years worthwhile, and you’ve been part of something bigger than any individual contribution.&lt;/p&gt;
  1024.  
  1025.  
  1026.  
  1027. &lt;p&gt;The open source world will continue to thrive because it’s built on the collective passion of thousands of people like Carlos, Rik, and countless others who are carrying the torch forward. While my active development days are ending, the impact of this community will continue long into the future.&lt;/p&gt;
  1028.  
  1029.  
  1030.  
  1031. &lt;p&gt;With sincere gratitude and fond farewells,&lt;/p&gt;
  1032.  
  1033.  
  1034.  
  1035. &lt;p&gt;Scarlett Moore&lt;/p&gt;</description>
  1036. <pubDate>Mon, 25 Aug 2025 15:42:29 +0000</pubDate>
  1037. </item>
  1038. <item>
  1039. <title>Launchpad News: Deprecating CVS and Subversion imports</title>
  1040. <guid isPermaLink="false">https://blog.launchpad.net/?p=4471</guid>
  1041. <link>https://blog.launchpad.net/general/deprecating-cvs-and-subversion-imports</link>
  1042. <description>&lt;h3&gt;&lt;strong&gt;What are code imports?&lt;/strong&gt;&lt;/h3&gt;
  1043.  
  1044.  
  1045.  
  1046. &lt;p&gt;Launchpad’s &lt;a href=&quot;https://code.launchpad.net/+code-imports&quot;&gt;code import&lt;/a&gt; service allows users to automatically mirror code from external version control systems into Launchpad. Historically, this has supported imports from CVS, Subversion, Bazaar and Git.&lt;/p&gt;
  1047.  
  1048.  
  1049.  
  1050. &lt;p&gt;As part of this, Launchpad currently also supports imports &lt;strong&gt;into Bazaar branches&lt;/strong&gt; from:&lt;/p&gt;
  1051.  
  1052.  
  1053.  
  1054. &lt;ul&gt;&lt;li&gt;Concurrent Version System to Bazaar&lt;/li&gt;&lt;li&gt;Subversion via cvs2svn to Bazaar&lt;/li&gt;&lt;li&gt;Subversion via bzr-svn to Bazaar&lt;/li&gt;&lt;/ul&gt;
  1055.  
  1056.  
  1057.  
  1058. &lt;p&gt;These imports will be deprecated.&lt;/p&gt;
  1059.  
  1060.  
  1061.  
  1062. &lt;h3&gt;&lt;strong&gt;Why deprecate these imports?&lt;/strong&gt;&lt;/h3&gt;
  1063.  
  1064.  
  1065.  
  1066. &lt;p&gt;As announced in&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189&quot;&gt; Phasing out Bazaar code hosting&lt;/a&gt;, Bazaar itself has been deprecated and is no longer actively developed. The last release was in 2016, and usage has steadily declined.&lt;/p&gt;
  1067.  
  1068.  
  1069.  
  1070. &lt;p&gt;Maintaining imports from these less common version controls to Bazaar requires significant efforts.&lt;/p&gt;
  1071.  
  1072.  
  1073.  
  1074. &lt;p&gt;To streamline our services and focus resources where they matter most, Launchpad will be &lt;strong&gt;retiring the previously mentioned Bazaar-based imports&lt;/strong&gt;.&lt;/p&gt;
  1075.  
  1076.  
  1077.  
  1078. &lt;h3&gt;&lt;strong&gt;Timelines&lt;/strong&gt;&lt;/h3&gt;
  1079.  
  1080.  
  1081.  
  1082. &lt;ul&gt;&lt;li&gt;&lt;strong&gt;September 18th, 2025&lt;/strong&gt;: No new import configurations for the previously mentioned Bazaar-based imports will be accepted.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;October 1st, 2025&lt;/strong&gt;: All existing CVS to Bazaar and SVN to Bazaar imports (both cvs2svn and bzr-svn) will be shut down. Import jobs will no longer run after this date.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
  1083.  
  1084.  
  1085.  
  1086. &lt;h3&gt;&lt;strong&gt;Migration paths&lt;/strong&gt;&lt;/h3&gt;
  1087.  
  1088.  
  1089.  
  1090. &lt;p&gt;If you are currently using these imports, we recommend:&lt;/p&gt;
  1091.  
  1092.  
  1093.  
  1094. &lt;ul&gt;&lt;li&gt;Migrating the source repository to Git.&lt;/li&gt;&lt;li&gt;Reconfiguring your Launchpad project to use a Git-based import instead.&lt;/li&gt;&lt;/ul&gt;
  1095.  
  1096.  
  1097.  
  1098. &lt;p&gt;&lt;strong&gt;Guides and references:&lt;/strong&gt;&lt;/p&gt;
  1099.  
  1100.  
  1101.  
  1102. &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/migrate-a-repository-from-bazaar-to-git/...&quot;&gt;Migrate a Repository From Bazaar to Git&lt;/a&gt;&lt;/li&gt;&lt;li&gt;General CVS/SVN to Git migration tools (such as git cvsimport, svn2git, or git svn) are widely documented.&lt;/li&gt;&lt;/ul&gt;
  1103.  
  1104.  
  1105.  
  1106. &lt;h3&gt;&lt;strong&gt;Call for action&lt;/strong&gt;&lt;/h3&gt;
  1107.  
  1108.  
  1109.  
  1110. &lt;p&gt;If you have a project still depending on CVS to Bazaar or SVN to Bazaar imports, and you are unsure how to migrate, please reach out to us.&lt;/p&gt;
  1111.  
  1112.  
  1113.  
  1114. &lt;p&gt;You can contact us in &lt;strong&gt;#launchpad:ubuntu.com&lt;/strong&gt; on Matrix, or via e-mail at &lt;strong&gt;feedback@launchpad.net&lt;/strong&gt;.&lt;/p&gt;
  1115.  
  1116.  
  1117.  
  1118. &lt;p&gt;Join the discussion at:&lt;a href=&quot;https://discourse.ubuntu.com/t/deprecating-cvs-and-subversion-imports/66876&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt; https://discourse.ubuntu.com/t/deprecating-cvs-and-subversion-imports/66876&lt;/a&gt;&lt;/p&gt;
  1119.  
  1120.  
  1121.  
  1122. &lt;p&gt;&lt;/p&gt;</description>
  1123. <pubDate>Mon, 25 Aug 2025 07:14:50 +0000</pubDate>
  1124. </item>
  1125. <item>
  1126. <title>Andrea Corbellini: It will take decades to undo the damage done by &quot;AI&quot;</title>
  1127. <guid isPermaLink="false">tag:andrea.corbellini.name,2025-08-20:/2025/08/20/it-will-take-decades-to-undo-the-damage-done-by-ai/</guid>
  1128. <link>https://andrea.corbellini.name/2025/08/20/it-will-take-decades-to-undo-the-damage-done-by-ai/</link>
  1129. <description>&lt;p&gt;Many business owners in the software development industry are investing a lot
  1130. into LLM bots, marketed as “generative AI”. Some of them go as far as &lt;em&gt;forcing&lt;/em&gt;
  1131. software developers to use such tools under the threat of being fired if they
  1132. don’t comply. After all, why shouldn’t they? This technology has a catchy name,
  1133. it produces very convincing output that sometimes is correct (or close to being
  1134. correct), and companies producing these tools are very good at downplaying
  1135. their limitations and at promising that the “next version” will be
  1136. astonishingly better than the one before.&lt;/p&gt;
  1137. &lt;p&gt;My day-to-day experience, and scientific research, however show a quite big
  1138. problem: while senior developers get little or no gain from “generative AI”
  1139. (&lt;a href=&quot;https://www.reuters.com/business/ai-slows-down-some-experienced-software-developers-study-finds-2025-07-10/&quot;&gt;1&lt;/a&gt;,
  1140. &lt;a href=&quot;https://fortune.com/2025/07/20/ai-hampers-productivity-software-developers-productivity-study/&quot;&gt;2&lt;/a&gt;,
  1141. &lt;a href=&quot;https://blueheadline.com/software-dev/ai-helps-new-developers-but-seniors/&quot;&gt;3&lt;/a&gt;,
  1142. &lt;a href=&quot;https://blog.stackademic.com/ai-coding-tools-slow-senior-devs-by-19-why-experts-are-still-using-them-98d855b81c4e&quot;&gt;4&lt;/a&gt;),
  1143. junior developers get massive boosts in productivity. Why am I describing a
  1144. boost in productivity as a problem? Well, it’s simple: the new generations of
  1145. software developers (the ones that are just entering the job market, and the
  1146. ones that are still in school) are relying heavily on these LLM tools for
  1147. &lt;em&gt;nearly all&lt;/em&gt; work-related tasks. And, again, why shouldn’t they? The entire
  1148. world is telling them to do so! And as a result of that, they are advancing
  1149. without gaining any actual skill.&lt;/p&gt;
  1150. &lt;p&gt;Me and other (ex-)coworkers have seen it first hand: a junior developer
  1151. completes a task using an LLM bot. More senior developers find major problems
  1152. with the result. Junior developers go back to the LLM tool asking for a fix,
  1153. wasting hours or days without a positive outcome. &lt;strong&gt;Junior developers are
  1154. becoming unable to perform tasks independently.&lt;/strong&gt;&lt;/p&gt;
  1155. &lt;p&gt;In addition to that, there’s a problem that I feel like is not talked about
  1156. extensively: these LLM tools can only regurgitate what they’ve been trained
  1157. with. They’re good at finding patterns and re-applying strategies that have
  1158. been used in prior work, but by their nature they cannot &lt;em&gt;create&lt;/em&gt; or
  1159. &lt;em&gt;innovate&lt;/em&gt;. So, if this trend continues, &lt;strong&gt;the new generations of software
  1160. developers are not just going to be &lt;em&gt;skill-less&lt;/em&gt;, they’re also going to be
  1161. incapable of solving new problems that haven’t been seen before&lt;/strong&gt;.&lt;/p&gt;
  1162. &lt;p&gt;My prediction? &lt;strong&gt;Within 10 or 20 years, the older generation of software
  1163. developers will be asked to come out of retirement to fix the unmaintainable
  1164. mess created by the newer generations, and to make advancements in the
  1165. information technology sector.&lt;/strong&gt; A bit like old COBOL developers are asked to
  1166. come out of retirement to maintain banking systems, but on a much larger scale.
  1167. This, unless there will be advancements towards &lt;em&gt;true&lt;/em&gt; Artificial Intelligence,
  1168. or unless the current trend in education is broken.&lt;/p&gt;
  1169. &lt;p&gt;Now don’t get me wrong: I’m not opposed to LLM bots (although I’m against
  1170. calling them “AI”, because they’re very far from fulfilling the AI promise),
  1171. and I think they can be very powerful tools. What I’m worried about is that new
  1172. generations are being told to rely on them almost exclusively, and this can
  1173. only lead to an evident skill gap. In fact, I think that if there’s a country
  1174. that in the future will be able to harness the power of the LLM bots and &lt;em&gt;at
  1175. the same time&lt;/em&gt; maintain a good enough level of education, thus addressing the
  1176. skill gap problem, they will be the dominant economic power of the future,
  1177. because they will be able to automate tasks that are time/energy-consuming for
  1178. humans, while at the same time use the human brain to innovate and advance.&lt;/p&gt;</description>
  1179. <pubDate>Wed, 20 Aug 2025 17:17:00 +0000</pubDate>
  1180. </item>
  1181. <item>
  1182. <title>Erich Eickmeyer: Raspberry Pi as a Networked Audio Interface</title>
  1183. <guid isPermaLink="false">http://ericheickmeyer.com/?p=5998</guid>
  1184. <link>https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/</link>
  1185. <description>&lt;p&gt;I haven’t posted for quite some time, and a lot has happened. For instance, my wife revived Edubuntu and my work with Ubuntu Studio now spans over 7 years.&lt;/p&gt;
  1186.  
  1187.  
  1188.  
  1189. &lt;p&gt;Recently, I became the proud owner of a Behringer X-Air XR18. This became the key to opening a new business, which I’ll announce at a later date. I’m working on acquiring more equipment to make this work.&lt;/p&gt;
  1190.  
  1191.  
  1192.  
  1193. &lt;p&gt;As many people know, the XR18 is a stagebox-style mixer in which the mixer is physically on the stage with no controls but controlled with an iPad or Android tablet. However, as the owner of a Behringer X-Touch, which integrates seamlessly with an X-Air mixer via either MIDI or Network connections. In my situation, this gives the ability to have a physical front-of-house setup, with a computer showing the X-Air Edit application.&lt;/p&gt;
  1194.  
  1195.  
  1196.  
  1197. &lt;p&gt;However, what if I want to multi-track record or add custom effects via Ubuntu Studio? This is where it would get complicated as I would then have to run a prohibitively-long USB cable from my computer to the XR18 on the stage. This would not be ideal.&lt;/p&gt;
  1198.  
  1199.  
  1200.  
  1201. &lt;p&gt;As many people know, MIDI can be routed via network, which is the way the X-Touch, XR18, and X-Air app work together. A simple WiFi router and ethernet cable wouild be a great solution to this problem, but that also leaves an Ethernet cable prone to being tripped-over by audience members (unless one were to gaff it down). So, since we’ve already got WiFi, let’s take advantage of that.&lt;/p&gt;
  1202.  
  1203.  
  1204.  
  1205. &lt;p&gt;To expose the audio ports to the WiFi, we’re going to have to bridge it. But… how? Most people would tell me just to use &lt;a href=&quot;https://www.audinate.com/&quot;&gt;Dante&lt;/a&gt; but, unfortunately, Audinate refuses to support Linux, and AES67 support in PipeWire is very young. However, it turns out, &lt;a href=&quot;https://www.jacktrip.com/&quot;&gt;JackTrip&lt;/a&gt; is in the Ubuntu repositories and, as its name would imply, integrates seamlessly with &lt;a href=&quot;https://jackaudio.org/&quot;&gt;JACK &lt;/a&gt;and, therefore, &lt;a href=&quot;https://pipewire.org&quot;&gt;PipeWire&lt;/a&gt;.&lt;/p&gt;
  1206.  
  1207.  
  1208.  
  1209. &lt;p&gt;Setting this up is rather simple, and I’m documenting the process here.&lt;/p&gt;
  1210.  
  1211.  
  1212.  
  1213. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Prerequisites&lt;/h2&gt;
  1214.  
  1215.  
  1216.  
  1217. &lt;ul class=&quot;wp-block-list&quot;&gt;
  1218. &lt;li&gt;A Raspberry Pi 4 or higher (I have a late 2023 Raspberry Pi 5)&lt;/li&gt;
  1219.  
  1220.  
  1221.  
  1222. &lt;li&gt;A micro SD card (16GB or larger)&lt;/li&gt;
  1223.  
  1224.  
  1225.  
  1226. &lt;li&gt;&lt;a href=&quot;https://cdimage.ubuntu.com/releases/noble/release/&quot;&gt;Ubuntu Server for Raspberry Pi&lt;/a&gt; (I used 24.04, linked here).&lt;/li&gt;
  1227.  
  1228.  
  1229.  
  1230. &lt;li&gt;Optional: &lt;a href=&quot;https://ubuntu.com/pro&quot;&gt;Ubuntu Pro&lt;/a&gt; (for the RealTime Ubuntu Raspberry Pi Kernel)&lt;/li&gt;
  1231. &lt;/ul&gt;
  1232.  
  1233.  
  1234.  
  1235. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Here we go…&lt;/h2&gt;
  1236.  
  1237.  
  1238. &lt;div class=&quot;wp-block-image&quot;&gt;
  1239. &lt;figure class=&quot;alignright size-large is-resized&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6004&quot; data-attachment-id=&quot;6004&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png&quot; data-orig-size=&quot;832,616&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image/&quot; height=&quot;616&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image.png?w=832&quot; style=&quot;width: 417px; height: auto;&quot; width=&quot;832&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
  1240.  
  1241.  
  1242. &lt;p&gt;The first thing I did was install the downloaded preinstalled server image to a micro SD card. This is accomplished using Raspberry Pi Imager. I used the Snap version maintained by Dave Jones of Canonical, part of Canonical’s Raspberry Pi team. If you’ve never met Dave, he does all of his computing via Raspberry Pi, and it’s a sight to behold!&lt;br /&gt;&lt;br /&gt;To get that, it’s as easy as &lt;code&gt;sudo snap install rpi-imager&lt;/code&gt;.&lt;/p&gt;
  1243.  
  1244.  
  1245.  
  1246. &lt;p&gt;I made sure to set the server to automatically detect my WiFi, but if you plan to use a hard Ethernet connection, this isn’t necessary. Just be sure you can SSH into the machine as this is key (pre-set a user and set the machine name).&lt;/p&gt;
  1247.  
  1248.  
  1249.  
  1250. &lt;p&gt;Once the SD card is imaged, I SSH’d into the machine (&lt;code&gt;ssh erich@{computer-name}.local&lt;/code&gt;). The first thing I did was install &lt;code&gt;jackd2&lt;/code&gt; and &lt;code&gt;jacktrip&lt;/code&gt;:&lt;/p&gt;
  1251.  
  1252.  
  1253.  
  1254. &lt;p&gt;&lt;code&gt;sudo apt install --no-install-recommends jackd2 jacktrip&lt;/code&gt;&lt;/p&gt;
  1255.  
  1256.  
  1257.  
  1258. &lt;p&gt;One must use the &lt;code&gt;--no-install-recommends&lt;/code&gt; option to avoid installing unecessary graphical tools as &lt;code&gt;jackd2&lt;/code&gt; will want to install &lt;code&gt;qjackctl&lt;/code&gt; which is the GUI application to control JACK. We don’t need it here. JackTrip has an option to automatically connect to all inputs and outputs, so we’ll use that here.&lt;/p&gt;
  1259.  
  1260.  
  1261.  
  1262. &lt;p&gt;To automatically start JACK upon boot, I modified &lt;a href=&quot;https://raw.githubusercontent.com/jackaudio/jack2/refs/heads/develop/systemd/jack%40.service.in&quot;&gt;this systemd unit file &lt;/a&gt;to be custom for my setup. You’ll notice I made the buffer 256 (&lt;code&gt;-p 256&lt;/code&gt;) with 3 periods per buffer (&lt;code&gt;-n 3&lt;/code&gt;) as gives the highest reliablility on a USB connection. Additionally, the highest frequency an XR18 runs at is 48000 Hz, so I made sure to set the frequency there (&lt;code&gt;-r 48000&lt;/code&gt;). Also, we want the process to run in realtime and directly to ALSA (&lt;code&gt;--realtime -dalsa&lt;/code&gt;):&lt;/p&gt;
  1263.  
  1264.  
  1265.  
  1266. &lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;[Unit]
  1267. Description=JACK server using %i user profile
  1268. Documentation=man:jackd(1)
  1269. After=sound.target local-fs.target
  1270.  
  1271. [Service]
  1272. User=%i
  1273. Group=%i
  1274. #Type=notify
  1275. EnvironmentFile=-/etc/jack/alsa.conf
  1276. #EnvironmentFile=-%h/.config/jack/%i.conf
  1277. ExecStart=/usr/bin/jackd --realtime -dalsa -p 256 -n 3 -r 48000
  1278. # -d $DEVICE $DRIVER_SETTINGS
  1279. LimitRTPRIO=95
  1280. LimitRTTIME=infinity
  1281. LimitMEMLOCK=infinity
  1282. # Caution: use on memory-limited devices only
  1283. # OOMScoreAdjust=-1000
  1284.  
  1285. [Install]
  1286. WantedBy=multi-user.target
  1287. &lt;/code&gt;&lt;/pre&gt;
  1288.  
  1289.  
  1290.  
  1291. &lt;p&gt;I installed this to &lt;code&gt;/usr/lib/systemd/system/jackd@.service&lt;/code&gt;.&lt;/p&gt;
  1292.  
  1293.  
  1294.  
  1295. &lt;p&gt;Next, I created a systemd unit file to start JackTrip. I needed this to be a server (&lt;code&gt;-s&lt;/code&gt;), with 18 inputs and outputs (for an XR18, &lt;code&gt;-n 18&lt;/code&gt;) and automatically connect upon start (&lt;code&gt;-q auto&lt;/code&gt;):&lt;/p&gt;
  1296.  
  1297.  
  1298.  
  1299. &lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;[Unit]
  1300. Description=JackTrip Audio Network Service
  1301. After=network.target sound.target jackd@%i.service
  1302. Wants=network-online.target
  1303.  
  1304. [Service]
  1305. # Run as a specific user who has JACK permissions
  1306. User=%i
  1307. Group=%i
  1308.  
  1309. ExecStart=jacktrip -s -n 18 -q auto --udprt
  1310. Restart=always
  1311. RestartSec=5
  1312.  
  1313. # Optional: environment for JACK if needed
  1314. #Environment=JACK_NO_AUDIO_RESERVATION=1
  1315.  
  1316. # Give JACK/JackTrip real-time priority
  1317. LimitRTPRIO=infinity
  1318. LimitMEMLOCK=infinity
  1319.  
  1320. [Install]
  1321. WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;
  1322.  
  1323.  
  1324.  
  1325. &lt;p&gt;I installed this to &lt;code&gt;/usr/lib/systemd/system/jacktrip@.service&lt;/code&gt;.&lt;/p&gt;
  1326.  
  1327.  
  1328.  
  1329. &lt;p&gt;Next, to make sure this runs as my user, I did the following:&lt;/p&gt;
  1330.  
  1331.  
  1332.  
  1333. &lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;sudo systemctl enable jackd@erich.service
  1334. sudo systemctl enable jacktrip@erich.service&lt;/code&gt;&lt;/pre&gt;
  1335.  
  1336.  
  1337.  
  1338. &lt;p&gt;Optionally, since this will be used as a headless appliance, one can use Ubuntu Pro to get the RealTime Kernel. This is accomplished by the following with an &lt;a href=&quot;https://login.ubuntu.com/&quot;&gt;Ubuntu One account&lt;/a&gt;:&lt;/p&gt;
  1339.  
  1340.  
  1341.  
  1342. &lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;pro attach
  1343. pro enable realtime-kernel&lt;/code&gt;&lt;/pre&gt;
  1344.  
  1345.  
  1346.  
  1347. &lt;p&gt;To make sure everything worked, check &lt;code&gt;pro status&lt;/code&gt;.&lt;/p&gt;
  1348.  
  1349.  
  1350.  
  1351. &lt;p&gt;You can have up to 5 machines running Ubuntu Pro for free. In my case, as an Ubuntu Member, I can have up to 50 machines for free, and this is only my third one!&lt;/p&gt;
  1352.  
  1353.  
  1354.  
  1355. &lt;p&gt;Once this is done, reboot. On your other machine, install &lt;code&gt;jacktrip-gui&lt;/code&gt;. (This will be in Ubuntu Studio 25.10 and higher by default!): &lt;code&gt;sudo apt install jacktrip-gui&lt;/code&gt;.&lt;/p&gt;
  1356.  
  1357.  
  1358.  
  1359. &lt;p&gt;Opening it, it will ask you if you want to sign in with a Virtual Studio account. This is because JackTrip allows you to collaborate across the entire internet with fellow musicians with very low latency! It’s pretty cool! However, we don’t need that for this purpose. Instead, we’re going to say “No” and simply connect to the server as a P2P client:&lt;/p&gt;
  1360.  
  1361.  
  1362. &lt;div class=&quot;wp-block-image&quot;&gt;
  1363. &lt;figure class=&quot;aligncenter size-large is-resized&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6012&quot; data-attachment-id=&quot;6012&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png&quot; data-orig-size=&quot;856,795&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-2/&quot; height=&quot;795&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-1.png?w=856&quot; style=&quot;width: 678px; height: auto;&quot; width=&quot;856&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
  1364.  
  1365.  
  1366. &lt;p&gt;Enter the computer name with &lt;code&gt;.local&lt;/code&gt; afterwards, and it should find it as long as your desktop or laptop is connected to the same network as the Raspberry Pi.&lt;/p&gt;
  1367.  
  1368.  
  1369.  
  1370. &lt;p&gt;After you click “Connect”, you should see this:&lt;/p&gt;
  1371.  
  1372.  
  1373. &lt;div class=&quot;wp-block-image&quot;&gt;
  1374. &lt;figure class=&quot;aligncenter size-large is-resized&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6017&quot; data-attachment-id=&quot;6017&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png?w=224&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png&quot; data-orig-size=&quot;856,1148&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-4/&quot; height=&quot;1024&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-3.png?w=764&quot; style=&quot;width: 630px; height: auto;&quot; width=&quot;764&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
  1375.  
  1376.  
  1377. &lt;p&gt;As you can see, this has audio coming in from a microphone already.&lt;/p&gt;
  1378.  
  1379.  
  1380.  
  1381. &lt;p&gt;Back in X-Air Edit, already connected to the mixer, I changed my routing so channels 1 and 2 were being sent to the aux, so I can then use my computer’s audio there for music from e.g. Spotify:&lt;/p&gt;
  1382.  
  1383.  
  1384.  
  1385. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6019&quot; data-attachment-id=&quot;6019&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png&quot; data-orig-size=&quot;1189,754&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-5/&quot; height=&quot;649&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-4.png?w=1024&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
  1386.  
  1387.  
  1388.  
  1389. &lt;p&gt;Next I started a Dummy Audio Device from &lt;a href=&quot;https://ubuntustudio.org/audio-configuration/&quot;&gt;Ubuntu Studio Audio Configuration&lt;/a&gt; and made it the main output for the computer. I then connected the monitor of the dummy output to channels 1 and 2 of JackTrip using Patchance:&lt;/p&gt;
  1390.  
  1391.  
  1392. &lt;div class=&quot;wp-block-image&quot;&gt;
  1393. &lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6021&quot; data-attachment-id=&quot;6021&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;image&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png?w=457&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png&quot; data-orig-size=&quot;457,326&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/image-6/&quot; height=&quot;326&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/image-5.png?w=457&quot; width=&quot;457&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
  1394.  
  1395.  
  1396. &lt;p&gt;…and VIOLA! Even testing my microphone, there was so little latency it was imperceivable.&lt;/p&gt;
  1397.  
  1398.  
  1399.  
  1400. &lt;p&gt;I’m envisioning a setup like this:&lt;/p&gt;
  1401.  
  1402.  
  1403.  
  1404. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-6068&quot; data-attachment-id=&quot;6068&quot; data-comments-opened=&quot;1&quot; data-image-caption=&quot;&quot; data-image-description=&quot;&quot; data-image-meta=&quot;{&amp;quot;aperture&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;credit&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;camera&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;caption&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;created_timestamp&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;copyright&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;focal_length&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;iso&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;shutter_speed&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;orientation&amp;quot;:&amp;quot;0&amp;quot;}&quot; data-image-title=&quot;stage&quot; data-large-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png?w=662&quot; data-medium-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png?w=300&quot; data-orig-file=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png&quot; data-orig-size=&quot;740,294&quot; data-permalink=&quot;https://ericheickmeyer.com/2025/08/19/raspberry-pi-as-a-networked-audio-interface/stage/&quot; height=&quot;294&quot; src=&quot;https://ericheickmeyer.com/wp-content/uploads/2025/08/stage.png?w=740&quot; width=&quot;740&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
  1405.  
  1406.  
  1407.  
  1408. &lt;p&gt;I’m excited to test this further! Overall, I feel like I’ve found a way to do a Dante-less audio-over-ethernet setup that cost me nothing!&lt;/p&gt;</description>
  1409. <pubDate>Tue, 19 Aug 2025 19:48:23 +0000</pubDate>
  1410. </item>
  1411. <item>
  1412. <title>St&amp;eacute;phane Graber: LXC/LXCFS/Incus 6.0.5 LTS release</title>
  1413. <guid isPermaLink="false">https://stgraber.org/?p=1768</guid>
  1414. <link>https://stgraber.org/2025/08/15/lxc-lxcfs-incus-6-0-5-lts-release/</link>
  1415. <description>&lt;h1 class=&quot;wp-block-heading&quot;&gt;Introduction&lt;/h1&gt;
  1416.  
  1417.  
  1418.  
  1419. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://linuxcontainers.org/static/img/containers.png&quot; /&gt;&lt;/figure&gt;
  1420.  
  1421.  
  1422.  
  1423. &lt;p&gt;The &lt;a href=&quot;https://linuxcontainers.org/incus/&quot;&gt;Linux Containers project&lt;/a&gt; maintains Long Term Support (LTS) releases for its core projects. Those come with 5 years of support from upstream with the first two years including bugfixes, minor improvements and security fixes and the remaining 3 years getting only security fixes.&lt;/p&gt;
  1424.  
  1425.  
  1426.  
  1427. &lt;p&gt;This is now the fifth round of bugfix releases for LXC, LXCFS and Incus 6.0 LTS.&lt;/p&gt;
  1428.  
  1429.  
  1430.  
  1431. &lt;h1 class=&quot;wp-block-heading&quot;&gt;LXC&lt;/h1&gt;
  1432.  
  1433.  
  1434.  
  1435. &lt;p&gt;&lt;a href=&quot;https://linuxcontainers.org/lxc/&quot;&gt;LXC&lt;/a&gt; is the oldest Linux Containers project and the basis for almost every other one of our projects. This low-level container runtime and library was first released in August 2008, led to the creation of projects like Docker and today is still actively used directly or indirectly on millions of systems.&lt;/p&gt;
  1436.  
  1437.  
  1438.  
  1439. &lt;p&gt;Announcement: &lt;a href=&quot;https://discuss.linuxcontainers.org/t/lxc-6-0-5-lts-has-been-released/24438&quot;&gt;https://discuss.linuxcontainers.org/t/lxc-6-0-5-lts-has-been-released/24438&lt;/a&gt;&lt;/p&gt;
  1440.  
  1441.  
  1442.  
  1443. &lt;p&gt;Highlights of this point release:&lt;/p&gt;
  1444.  
  1445.  
  1446.  
  1447. &lt;ul class=&quot;wp-block-list&quot;&gt;
  1448. &lt;li&gt;Fixes a regression introduced in LXC 6.0.4 which was causing some hooks to fail due to no-new-priv handling&lt;/li&gt;
  1449.  
  1450.  
  1451.  
  1452. &lt;li&gt;Removed support for building with the bionic C library (Android) as it hadn’t been functional for a long time&lt;/li&gt;
  1453.  
  1454.  
  1455.  
  1456. &lt;li&gt;Fixed handling of the container_ttys environment variable&lt;/li&gt;
  1457.  
  1458.  
  1459.  
  1460. &lt;li&gt;Added support for both &lt;code&gt;move&lt;/code&gt; and &lt;code&gt;nosymfollow&lt;/code&gt; mount options&lt;/li&gt;
  1461.  
  1462.  
  1463.  
  1464. &lt;li&gt;Improved testsuite coverage&lt;/li&gt;
  1465. &lt;/ul&gt;
  1466.  
  1467.  
  1468.  
  1469. &lt;h1 class=&quot;wp-block-heading&quot;&gt;LXCFS&lt;/h1&gt;
  1470.  
  1471.  
  1472.  
  1473. &lt;p&gt;&lt;a href=&quot;https://linuxcontainers.org/lxcfs/&quot;&gt;LXCFS&lt;/a&gt; is a FUSE filesystem used to workaround some shortcomings of the Linux kernel when it comes to reporting available system resources to processes running in containers. The project started in late 2014 and is still actively used by Incus today as well as by some Docker and Kubernetes users.&lt;/p&gt;
  1474.  
  1475.  
  1476.  
  1477. &lt;p&gt;Announcement: &lt;a href=&quot;https://discuss.linuxcontainers.org/t/lxcfs-6-0-5-lts-has-been-released/24437&quot;&gt;https://discuss.linuxcontainers.org/t/lxcfs-6-0-5-lts-has-been-released/24437&lt;/a&gt;&lt;/p&gt;
  1478.  
  1479.  
  1480.  
  1481. &lt;p&gt;There are no significant changes in this release, only a couple of minor changes to our CI scripts. We are still pushing a LXCFS update out to keep versions in sync between LXC, LXCFS and Incus, but this release is effectively identical to 6.0.4.&lt;/p&gt;
  1482.  
  1483.  
  1484.  
  1485. &lt;h1 class=&quot;wp-block-heading&quot;&gt;Incus&lt;/h1&gt;
  1486.  
  1487.  
  1488.  
  1489. &lt;p&gt;&lt;a href=&quot;https://linuxcontainers.org/incus/&quot;&gt;Incus&lt;/a&gt; is our most actively developed project. This virtualization platform is just over a year old but has already seen over 3500 commits by over 120 individual contributors. Its first LTS release made it usable in production environments and significantly boosted its user base.&lt;/p&gt;
  1490.  
  1491.  
  1492.  
  1493. &lt;p&gt;Announcement: &lt;a href=&quot;https://discuss.linuxcontainers.org/t/incus-6-0-5-lts-has-been-released/24445&quot;&gt;https://discuss.linuxcontainers.org/t/incus-6-0-5-lts-has-been-released/24445&lt;/a&gt;&lt;/p&gt;
  1494.  
  1495.  
  1496.  
  1497. &lt;p&gt;Highlights of this point release:&lt;/p&gt;
  1498.  
  1499.  
  1500.  
  1501. &lt;ul class=&quot;wp-block-list&quot;&gt;
  1502. &lt;li&gt;Support for memory hotplug in VMs&lt;/li&gt;
  1503.  
  1504.  
  1505.  
  1506. &lt;li&gt;Reworked logging subsystem&lt;/li&gt;
  1507.  
  1508.  
  1509.  
  1510. &lt;li&gt;SNAT support on complex network forwards&lt;/li&gt;
  1511.  
  1512.  
  1513.  
  1514. &lt;li&gt;CLI support for server-side filtering on all collections&lt;/li&gt;
  1515.  
  1516.  
  1517.  
  1518. &lt;li&gt;Windows agent support for VMs&lt;/li&gt;
  1519.  
  1520.  
  1521.  
  1522. &lt;li&gt;Improvements support to incus-migrate (extra disks, OVA, …)&lt;/li&gt;
  1523.  
  1524.  
  1525.  
  1526. &lt;li&gt;SFTP API support on custom storage volumes&lt;/li&gt;
  1527.  
  1528.  
  1529.  
  1530. &lt;li&gt;Support for publishing instances as split images&lt;/li&gt;
  1531.  
  1532.  
  1533.  
  1534. &lt;li&gt;S3 upload of instances and volume backups&lt;/li&gt;
  1535.  
  1536.  
  1537.  
  1538. &lt;li&gt;More flexible snapshot configuration&lt;/li&gt;
  1539. &lt;/ul&gt;
  1540.  
  1541.  
  1542.  
  1543. &lt;h1 class=&quot;wp-block-heading&quot;&gt;What’s next?&lt;/h1&gt;
  1544.  
  1545.  
  1546.  
  1547. &lt;p&gt;We’re expecting another LTS bugfix release for the 6.0 branches by the end of 2025.&lt;br /&gt;In the mean time, Incus will keep going with its usual monthly feature release cadence.&lt;/p&gt;
  1548.  
  1549.  
  1550.  
  1551. &lt;h1 class=&quot;wp-block-heading&quot;&gt;Thanks&lt;/h1&gt;
  1552.  
  1553.  
  1554.  
  1555. &lt;p&gt;This LTS release update was made possible thanks to funding provided by the Sovereign Tech Fund (now part of the Sovereign Tech Agency).&lt;/p&gt;
  1556.  
  1557.  
  1558.  
  1559. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://www.sovereign.tech&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-1648&quot; height=&quot;326&quot; src=&quot;https://stgraber.org/wp-content/uploads/2024/12/ST-Fund-Logo-Default-Black-RGB-1024x326.png&quot; width=&quot;1024&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
  1560.  
  1561.  
  1562.  
  1563. &lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
  1564. &lt;p&gt;The Sovereign Tech Fund supports the development, improvement, and maintenance of open digital infrastructure. Its goal is to sustainably strengthen the open source ecosystem, focusing on security, resilience, technological diversity, and the people behind the code.&lt;/p&gt;
  1565. &lt;/blockquote&gt;
  1566.  
  1567.  
  1568.  
  1569. &lt;p&gt;Find out more at: &lt;a href=&quot;https://www.sovereign.tech&quot;&gt;https://www.sovereign.tech&lt;/a&gt;&lt;/p&gt;</description>
  1570. <pubDate>Fri, 15 Aug 2025 19:26:32 +0000</pubDate>
  1571. </item>
  1572. <item>
  1573. <title>Jonathan Carter: Debian 13</title>
  1574. <guid isPermaLink="false">https://jonathancarter.org/?p=11948</guid>
  1575. <link>https://jonathancarter.org/2025/08/10/debian-13/</link>
  1576. <description>&lt;p&gt;Debian 13 has finally &lt;a href=&quot;https://bits.debian.org/2025/08/trixie-released.html&quot;&gt;been released&lt;/a&gt;!&lt;/p&gt;
  1577.  
  1578.  
  1579.  
  1580. &lt;p&gt;One of the biggest and under-hyped features is support for HTTP Boot. This allows you to simply specify a URL (to any d-i or live image iso) in your computer’s firmware setup and then you can boot to it directly over the Internet, so no need to download an image, write it to flash disk and then boot from the flash disk on computers made in the last ~5 years. This is also supported on the Tianocore free EFI firmware, which is useful if you’d like to try it out on QEMU/KVM.&lt;/p&gt;
  1581.  
  1582.  
  1583.  
  1584. &lt;p&gt;More details about Debian 13 available on the &lt;a href=&quot;https://www.debian.org/News/2025/20250809&quot;&gt;official press release&lt;/a&gt;.&lt;/p&gt;
  1585.  
  1586.  
  1587.  
  1588. &lt;p&gt;The default theme for Debian 13 is &lt;a href=&quot;https://wiki.debian.org/DebianArt/Themes/Ceratopsian&quot;&gt;Ceratopsian&lt;/a&gt;, designed by Elise Couper. I’ll be honest, I wasn’t 100% sure it was the best choice when it won the artwork vote, but it really grew on me over the last few months, and it looked &lt;em&gt;great&lt;/em&gt; in combination with all kinds of other things during DebConf too, so it has certainly won me over.&lt;/p&gt;
  1589.  
  1590.  
  1591. &lt;div class=&quot;wp-block-image&quot;&gt;
  1592. &lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11957&quot; height=&quot;500&quot; src=&quot;https://jonathancarter.org/files/images/wllpaper.jpeg&quot; style=&quot;width: 798px; height: auto;&quot; width=&quot;800&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1593.  
  1594.  
  1595. &lt;p&gt;And I particularly like the Plymouth theme. It’s very minimal, and it reminds me of the Toy Story Trixie character, it’s almost like it helps explain the theme:&lt;/p&gt;
  1596.  
  1597.  
  1598. &lt;div class=&quot;wp-block-image&quot;&gt;
  1599. &lt;figure class=&quot;aligncenter size-large is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11961&quot; height=&quot;644&quot; src=&quot;https://jonathancarter.org/files/images/certop-1024x644.jpeg&quot; style=&quot;width: 1024px; height: auto;&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1600.  
  1601.  
  1602. &lt;p class=&quot;has-text-align-center&quot;&gt;&lt;em&gt;Plymouth (start-up/shutdown) theme.&lt;/em&gt;&lt;/p&gt;
  1603.  
  1604.  
  1605. &lt;div class=&quot;wp-block-image&quot;&gt;
  1606. &lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11963&quot; height=&quot;631&quot; src=&quot;https://jonathancarter.org/files/images/trixie.jpeg&quot; width=&quot;600&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1607.  
  1608.  
  1609. &lt;p class=&quot;has-text-align-center&quot;&gt;&lt;a href=&quot;https://disney.fandom.com/wiki/Trixie&quot;&gt;Trixie, the character from Toy Story&lt;/a&gt; that was chosen as the codename for Debian 13.&lt;/p&gt;
  1610.  
  1611.  
  1612.  
  1613. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Debian Local Team ISO testing&lt;/h2&gt;
  1614.  
  1615.  
  1616.  
  1617. &lt;p&gt;Yesterday we got some locals together for ISO testing and we got a cake with the wallpaper printed on it, along with our local team logo which has been a work in progress for the last 3 years, so hopefully we’ll finalise it this year!  (it will be ready when it’s ready). It came out a lot bluer than the original wallpaper, but still tasted great.&lt;/p&gt;
  1618.  
  1619.  
  1620. &lt;div class=&quot;wp-block-image&quot;&gt;
  1621. &lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11949&quot; height=&quot;771&quot; src=&quot;https://jonathancarter.org/files/images/cake-13-1024x771.jpg&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1622.  
  1623.  
  1624. &lt;p&gt;For many releases, I’ve been the only person from South Africa doing ISO smoke-testing, and this time was quite different, since everyone else in the photo below tested an image except for me. I basically just provided some support and helped out with getting salsa/wiki accounts and some troubleshooting. It went nice and fast, and it’s always a big relief when there are no showstoppers for the release.&lt;/p&gt;
  1625.  
  1626.  
  1627. &lt;div class=&quot;wp-block-image&quot;&gt;
  1628. &lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11951&quot; height=&quot;590&quot; src=&quot;https://jonathancarter.org/files/images/trixiecake2-1024x590.jpg&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1629.  
  1630.  
  1631. &lt;p class=&quot;has-text-align-center&quot;&gt;&lt;em&gt;My dog was really wishing hard that the cake would slip off.&lt;/em&gt;&lt;/p&gt;
  1632.  
  1633.  
  1634. &lt;div class=&quot;wp-block-image&quot;&gt;
  1635. &lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11970&quot; height=&quot;221&quot; src=&quot;https://jonathancarter.org/files/images/cambalache.jpg&quot; width=&quot;600&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1636.  
  1637.  
  1638. &lt;p&gt;Packaging-wise, I only have one big new package for Trixie, and that’s &lt;a href=&quot;https://github.com/xjuan/cambalache/tree/main&quot;&gt;Cambalache&lt;/a&gt;, a rapid application design UI builder for GTK3/GTK4.&lt;/p&gt;
  1639.  
  1640.  
  1641. &lt;div class=&quot;wp-block-image&quot;&gt;
  1642. &lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-11972&quot; height=&quot;423&quot; src=&quot;https://jonathancarter.org/files/images/image-29.png&quot; style=&quot;width: 616px; height: auto;&quot; width=&quot;752&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1643.  
  1644.  
  1645. &lt;p&gt;The version in trixie is 0.94.1-3 and version 1.0 was recently released, so I’ll get that updated in forky and backport it if possible.&lt;/p&gt;
  1646.  
  1647.  
  1648.  
  1649. &lt;p&gt;I was originally considering using Cambalache for an installer UI, but ended up going with a web front-end instead. But that’s moving firmly towards forky territory, so more on that another time!&lt;/p&gt;
  1650.  
  1651.  
  1652.  
  1653. &lt;p&gt;Thanks to everyone who was involved in this release, so far upgrades have been very smooth!&lt;/p&gt;
  1654. &lt;img alt=&quot;&quot; height=&quot;0&quot; src=&quot;https://analytics.jonathancarter.org/piwik.php?idsite=1&amp;amp;rec=1&amp;amp;url=https%3A%2F%2Fjonathancarter.org%2F2025%2F08%2F10%2Fdebian-13%2F&amp;amp;action_name=Debian+13&amp;amp;urlref=https%3A%2F%2Fjonathancarter.org%2Ffeed%2F&quot; style=&quot;border: 0; width: 0; height: 0;&quot; width=&quot;0&quot; /&gt;</description>
  1655. <pubDate>Sun, 10 Aug 2025 14:53:36 +0000</pubDate>
  1656. </item>
  1657. <item>
  1658. <title>Ubuntu Studio: Ubuntu Studio 24.04.3 LTS Released</title>
  1659. <guid isPermaLink="false">https://ubuntustudio.org/?p=3009</guid>
  1660. <link>https://ubuntustudio.org/2025/08/ubuntu-studio-24-04-3-released/</link>
  1661. <description>&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-2763&quot; height=&quot;223&quot; src=&quot;https://ubuntustudio.org/wp-content/uploads/2024/04/0a09/finalbanner.png&quot; width=&quot;600&quot; /&gt;&lt;/figure&gt;&lt;/div&gt;
  1662.  
  1663.  
  1664.  
  1665. &lt;p&gt;The Ubuntu Studio team is pleased to announce the release of Ubuntu Studio 24.04.3 LTS. This is a minor release which wraps-up the security and bug fixes into one .iso image, available for download now.&lt;/p&gt;
  1666.  
  1667.  
  1668.  
  1669. &lt;p&gt;The biggest change is the &lt;code&gt;lowlatency&lt;/code&gt; kernel has been officially retired, replaced by the &lt;code&gt;generic&lt;/code&gt; Ubuntu kernel. Those that have been using Ubuntu Studio 24.04 and upgraded may have already noticed this change.&lt;/p&gt;
  1670.  
  1671.  
  1672.  
  1673. &lt;p&gt;With that said, much like Ubuntu Studio 24.10 and higher, the &lt;code&gt;generic&lt;/code&gt; kernel includes kernel parameters added upon boot that allow the kernel to act in a &lt;code&gt;lowlatency&lt;/code&gt; mode, so you now can enjoy the benefits of the &lt;code&gt;lowlatency&lt;/code&gt; kernel while using the &lt;code&gt;generic&lt;/code&gt; kernel.&lt;/p&gt;
  1674.  
  1675.  
  1676.  
  1677. &lt;p&gt;We realize this may come as a shock, but when 24.04 was released, we knew this day would eventually come. However, there is no difference between the &lt;code&gt;lowlatency&lt;/code&gt; kernel and the &lt;code&gt;generic&lt;/code&gt; kernel with these boot parameters. They are:&lt;/p&gt;
  1678.  
  1679.  
  1680.  
  1681. &lt;ul&gt;&lt;li&gt;&lt;code&gt;preempt=full&lt;/code&gt;: Makes the kernel fully preemptible&lt;/li&gt;&lt;li&gt;&lt;code&gt;rcu_nocbs=all&lt;/code&gt; Offloads Read-Copy Update (RCU) callbacks from all CPUs dedicated to kernel threads, improves real-time performance&lt;/li&gt;&lt;li&gt;&lt;code&gt;threadirqs&lt;/code&gt; Forces interrupt handlers to run in a threaded context, reducing buffer xruns&lt;/li&gt;&lt;/ul&gt;
  1682.  
  1683.  
  1684.  
  1685. &lt;p&gt;These kernel parameters can be found in the files in &lt;code&gt;/etc/defaults/grub.d&lt;/code&gt;&lt;/p&gt;
  1686.  
  1687.  
  1688.  
  1689. &lt;h2&gt;Please give financially to Ubuntu Studio!&lt;/h2&gt;
  1690.  
  1691.  
  1692.  
  1693. &lt;p&gt;Giving is down. We understand that some people may no longer be able to give financially to this project, and that’s OK. However, if you have never given to Ubuntu Studio for the hard work and dedication we put into this project, please consider a monetary contribution.&lt;/p&gt;
  1694.  
  1695.  
  1696.  
  1697. &lt;p&gt;Additionally, we would love to see more monthly contributions to this project. You can do so via PayPal, Liberapay, or Patreon. We would love to see more contributions!&lt;/p&gt;
  1698.  
  1699.  
  1700.  
  1701. &lt;p&gt;So don’t wait, and don’t wait for someone else to do it! Thank you in advance!&lt;/p&gt;
  1702.  
  1703.  
  1704.  
  1705. &lt;table align=&quot;center&quot; border=&quot;0&quot; width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;center&quot; width=&quot;33%&quot;&gt;Donate using PayPal&lt;br /&gt;&lt;form action=&quot;https://www.paypal.com/cgi-bin/webscr&quot; method=&quot;post&quot; target=&quot;_top&quot;&gt;
  1706. &lt;input name=&quot;cmd&quot; type=&quot;hidden&quot; value=&quot;_donations&quot; /&gt;
  1707. &lt;input name=&quot;business&quot; type=&quot;hidden&quot; value=&quot;4KAYVBRFDQPJW&quot; /&gt;
  1708. &lt;input name=&quot;item_name&quot; type=&quot;hidden&quot; value=&quot;Ubuntu Studio Donation&quot; /&gt;
  1709. &lt;input name=&quot;currency_code&quot; type=&quot;hidden&quot; value=&quot;USD&quot; /&gt;
  1710. &lt;input alt=&quot;Donate with PayPal button&quot; border=&quot;0&quot; name=&quot;submit&quot; src=&quot;https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif&quot; title=&quot;PayPal - The safer, easier way to pay online!&quot; type=&quot;image&quot; /&gt;
  1711. &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;https://www.paypal.com/en_US/i/scr/pixel.gif&quot; width=&quot;1&quot; /&gt;&lt;/form&gt;Donations are Monthly or One-Time&lt;/td&gt;&lt;td align=&quot;center&quot; valign=&quot;center&quot; width=&quot;33%&quot;&gt;Donate using Liberapay&lt;br /&gt;&lt;a href=&quot;https://liberapay.com/ubuntustudio/donate&quot;&gt;&lt;img alt=&quot;Donate using Liberapay&quot; src=&quot;https://liberapay.com/assets/widgets/donate.svg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Donations are&lt;br /&gt;Weekly, Monthly, or Annually&lt;/td&gt;&lt;td align=&quot;center&quot; valign=&quot;center&quot; width=&quot;33%&quot;&gt;Donate using Patreon&lt;br /&gt;&lt;a data-patreon-widget-type=&quot;become-patron-button&quot; href=&quot;https://www.patreon.com/bePatron?u=43532738&quot;&gt;Become a Patron!&lt;/a&gt;Donations are&lt;br /&gt;Monthly&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;</description>
  1712. <pubDate>Fri, 08 Aug 2025 04:15:53 +0000</pubDate>
  1713. </item>
  1714. <item>
  1715. <title>Colin Watson: Free software activity in July 2025</title>
  1716. <guid isPermaLink="false">tag:www.chiark.greenend.org.uk,2025-08-06:/~cjwatson/blog/activity-2025-07.html</guid>
  1717. <link>https://www.chiark.greenend.org.uk/~cjwatson/blog/activity-2025-07.html</link>
  1718. <description>&lt;p&gt;About 90% of my Debian contributions this month were
  1719. &lt;a href=&quot;https://www.freexian.com/about/debian-contributions/&quot;&gt;sponsored&lt;/a&gt; by Freexian.&lt;/p&gt;
  1720. &lt;p&gt;You can also support my work directly via
  1721. &lt;a href=&quot;https://liberapay.com/cjwatson&quot;&gt;Liberapay&lt;/a&gt; or &lt;a href=&quot;https://github.com/sponsors/cjwatson&quot;&gt;GitHub
  1722. Sponsors&lt;/a&gt;.&lt;/p&gt;
  1723. &lt;h2&gt;DebConf&lt;/h2&gt;
  1724. &lt;p&gt;I attended DebConf for the first time in 11 years (my last one was DebConf
  1725. 14 in Portland).  It was great!  For once I had a conference where I had a
  1726. fairly light load of things I absolutely had to do, so I was able to spend
  1727. time catching up with old friends, making some new friends, and doing some
  1728. volunteering - a bit of Front Desk, and quite a lot of video team work where
  1729. I got to play with sound desks and such.  Apparently one of the BoFs (“birds
  1730. of a feather”, i.e. relatively open discussion sessions) where I was
  1731. talkmeister managed to break the automatic video cutting system by starting
  1732. and ending precisely on time, to the second, which I’m told has never
  1733. happened before.  I’ll take that.&lt;/p&gt;
  1734. &lt;p&gt;I gave a &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-398-using-debusine-to-pre-test-your-unstable-uploads.av1.webm&quot;&gt;talk about
  1735. Debusine&lt;/a&gt;,
  1736. along with &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-669-debusine-workflow-bof.av1.webm&quot;&gt;helping Enrico run a Debusine
  1737. BoF&lt;/a&gt;.
  1738. We still need to process some of the feedback from this, but are generally
  1739. pretty thrilled about the reception.  My personal highlight was getting a
  1740. shout-out in a &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-605-approaching-the-speed-of-light-with-debian-debians-role-in-the-worlds-largest-particle-accelerator.av1.webm&quot;&gt;talk from
  1741. &lt;span class=&quot;caps&quot;&gt;CERN&lt;/span&gt;&lt;/a&gt;
  1742. (in the slide starting at 32:55).&lt;/p&gt;
  1743. &lt;p&gt;Other highlights for me included a &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-416-debian-python-bof.av1.webm&quot;&gt;Python team
  1744. BoF&lt;/a&gt;,
  1745. &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-397-tag2upload-upload-simply-by-pushing-a-signed-git-tag.av1.webm&quot;&gt;Ian’s tag2upload
  1746. talk&lt;/a&gt;
  1747. and some very useful follow-up discussions, a session on &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-420-future-of-archive-wide-testing.av1.webm&quot;&gt;archive-wide
  1748. testing&lt;/a&gt;,
  1749. a somewhat brain-melting whiteboard session about the “multiarch interpreter
  1750. problem”,
  1751. &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-649-salsa-bof.av1.webm&quot;&gt;several&lt;/a&gt;
  1752. &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-624-salsa-ci-bof.av1.webm&quot;&gt;useful&lt;/a&gt;
  1753. &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-560-salsa-ci-now-running-for-27-000-packages-what-have-we-learnt.av1.webm&quot;&gt;discussions&lt;/a&gt;
  1754. about salsa.debian.org, &lt;a href=&quot;https://meetings-archive.debian.net/pub/debian-meetings/2025/DebConf25/debconf25-180-automating-downstream-debian-package-builds-and-updates-in-ci.av1.webm&quot;&gt;Matthew’s talk on how Wikimedia automates their Debian package
  1755. builds&lt;/a&gt;,
  1756. and many others.  I hope I can start attending regularly again!&lt;/p&gt;
  1757. &lt;h2&gt;OpenSSH&lt;/h2&gt;
  1758. &lt;p&gt;Towards the end of a release cycle, people tend to do more upgrade testing,
  1759. and this sometimes results in interesting problems.  Manfred Stock reported
  1760. &lt;a href=&quot;https://bugs.debian.org/1109742&quot;&gt;“No new &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; connections possible during large part of upgrade to Debian
  1761. Trixie”&lt;/a&gt;, and after a little testing in a
  1762. container I confirmed that this was a reproducible problem that would have
  1763. affected many people upgrading from Debian 12 (bookworm), with potentially
  1764. severe consequences for people upgrading remote systems.  In fact, there
  1765. were two independent problems that each led to much the same symptom:&lt;/p&gt;
  1766. &lt;ul&gt;
  1767. &lt;li&gt;
  1768. &lt;p&gt;OpenSSH 9.8 split the monolithic &lt;code&gt;sshd&lt;/code&gt; listener process into two
  1769.    pieces: a minimal network listener (still called &lt;code&gt;sshd&lt;/code&gt;), and an
  1770.    &lt;code&gt;sshd-session&lt;/code&gt; process dealing with each individual session.  (OpenSSH
  1771.    10.0 further split &lt;code&gt;sshd-session&lt;/code&gt;, adding an &lt;code&gt;sshd-auth&lt;/code&gt; process that
  1772.    deals with the user authentication phase of the protocol.)  This hardens
  1773.    the OpenSSH server by using different address spaces for privileged and
  1774.    unprivileged code.&lt;/p&gt;
  1775. &lt;p&gt;Before this change, when &lt;code&gt;sshd&lt;/code&gt; received an incoming connection, it
  1776. forked and re-executed itself with some special parameters to deal with
  1777. it.  After this change, it forks and executes &lt;code&gt;sshd-session&lt;/code&gt; instead,
  1778. and &lt;code&gt;sshd&lt;/code&gt; no longer accepts the parameters it used to accept for this.&lt;/p&gt;
  1779. &lt;p&gt;Debian package upgrades happen in two phases: first we unpack the new
  1780. files onto disk, and then we run some package-specific configuration
  1781. steps which usually include things like restarting services.  (I’m
  1782. simplifying, but this is good enough for this post.)  Normally this is
  1783. fine, and in fact desirable: the old service keeps on working, and this
  1784. approach often allows breaking what would otherwise be difficult cycles
  1785. by ensuring that the system is in a more coherent state before trying to
  1786. restart services.  However, in this case, unpacking the new files onto
  1787. disk immediately means that new &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; connections no longer work: the old
  1788. &lt;code&gt;sshd&lt;/code&gt; receives the connection and tries to hand it off to a
  1789. freshly-executed copy of the new &lt;code&gt;sshd&lt;/code&gt; binary on disk, which no longer
  1790. supports this.&lt;/p&gt;
  1791. &lt;p&gt;If you’re just upgrading OpenSSH on its own or with a small number of
  1792. other packages, this isn’t much of a problem as the listener will be
  1793. restarted quite soon; but if you’re upgrading from bookworm to trixie,
  1794. there may be a long gap when you can’t &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; to the system any more, and
  1795. if something fails in the middle of the upgrade then you could be in trouble.&lt;/p&gt;
  1796. &lt;p&gt;So, what to do?  I considered keeping a copy of the old &lt;code&gt;sshd&lt;/code&gt; around
  1797. temporarily and patching the new &lt;code&gt;sshd&lt;/code&gt; to re-execute it if it’s being
  1798. run to handle an incoming connection, but that turned out to fail in my
  1799. first test: dependencies are normally only checked when configuring a
  1800. package, so it’s possible to unpack &lt;code&gt;openssh-server&lt;/code&gt; before unpacking a
  1801. newer &lt;code&gt;libc6&lt;/code&gt; that it depends on, at which point you can’t execute the
  1802. new &lt;code&gt;sshd&lt;/code&gt; at all.  (That also means that the approach of restarting the
  1803. service at unpack time instead of configure time is a non-starter.)  We
  1804. needed a different idea.&lt;/p&gt;
  1805. &lt;p&gt;&lt;code&gt;dpkg&lt;/code&gt;, the core Debian package manager, has a specialized facility
  1806. called “diversions”: you can tell it that when it’s unpacking a
  1807. particular file it should put it somewhere else instead.  This is
  1808. normally used by administrators when they want to install a
  1809. locally-modified version of a particular file at their own risk, or by
  1810. packages that knowingly override a file normally provided by some other
  1811. package.  However, in this case it turns out to be useful for
  1812. &lt;code&gt;openssh-server&lt;/code&gt; to temporarily divert one of its own files!  When
  1813. upgrading from before 9.8, it now diverts &lt;code&gt;/usr/sbin/sshd&lt;/code&gt; to
  1814. &lt;code&gt;/usr/sbin/sshd.session-split&lt;/code&gt; before the new version is unpacked, then
  1815. removes the diversion and moves the new file into place once it’s ready
  1816. to restart the service; this reduces the period when incoming
  1817. connections fail to a minimum.  (We actually have to pretend that the
  1818. diversion is being performed on behalf of a slightly different package
  1819. since we’re using &lt;code&gt;dpkg-divert&lt;/code&gt; in a strange way here, but it all works.)&lt;/p&gt;
  1820. &lt;/li&gt;
  1821. &lt;li&gt;
  1822. &lt;p&gt;Most OpenSSH processes, including &lt;code&gt;sshd&lt;/code&gt;, check for a compatible version
  1823.    of the OpenSSL library when they start up.  This check used to be very
  1824.    picky, among other things requiring both the major and minor number to
  1825.    match.  OpenSSL 3 has a &lt;a href=&quot;https://www.openssl-library.org/policies/general/versioning-policy/&quot;&gt;better versioning
  1826.    policy&lt;/a&gt;,
  1827.    and so OpenSSH 9.4p1 &lt;a href=&quot;https://anongit.mindrot.org/openssh.git/commit/?id=b7afd8a4ecaca8afd3179b55e9db79c0ff210237&quot;&gt;relaxed this
  1828.    check&lt;/a&gt;.&lt;/p&gt;
  1829. &lt;p&gt;Unfortunately, bookworm shipped with OpenSSH 9.2p1, which means that as
  1830. soon as you unpack the new &lt;code&gt;libssl3&lt;/code&gt; during an upgrade (actually
  1831. &lt;code&gt;libssl3t64&lt;/code&gt; due to the &lt;a href=&quot;https://wiki.debian.org/ReleaseGoals/64bit-time&quot;&gt;64-bit &lt;code&gt;time_t&lt;/code&gt;
  1832. transition&lt;/a&gt;), &lt;code&gt;sshd&lt;/code&gt;
  1833. stops working.  This couldn’t be fixed by a change in trixie; we needed
  1834. to change bookworm in advance of the upgrade so that it would tolerate
  1835. newer versions of OpenSSL.  And time was tight if we wanted to maximize
  1836. the chance that people would apply that stable update before upgrading
  1837. to trixie; there isn’t going to be another point release of Debian 12
  1838. before the release of Debian 13.&lt;/p&gt;
  1839. &lt;p&gt;Fortunately, there’s a
  1840. &lt;a href=&quot;https://www.debian.org/doc/manuals/developers-reference/pkgs.en.html#special-case-the-stable-updates-suite&quot;&gt;&lt;code&gt;stable-updates&lt;/code&gt;&lt;/a&gt;
  1841. mechanism for exactly this sort of thing, and the stable release
  1842. managers kindly accepted my proposal to fix this there.&lt;/p&gt;
  1843. &lt;/li&gt;
  1844. &lt;/ul&gt;
  1845. &lt;p&gt;The net result is that if you apply updates to bookworm (including
  1846. &lt;code&gt;stable-updates&lt;/code&gt; / &lt;code&gt;bookworm-updates&lt;/code&gt;, which is enabled by default) before
  1847. starting the upgrade to trixie, everything should be fine.  Many thanks to
  1848. Manfred for reporting this with just enough time to spare that we were able
  1849. to fix it before Debian 13 is released in a few days!&lt;/p&gt;
  1850. &lt;h2&gt;debmirror&lt;/h2&gt;
  1851. &lt;p&gt;I did my twice-yearly refresh of debmirror’s &lt;a href=&quot;https://salsa.debian.org/debian/debmirror/-/blob/master/mirror_size&quot;&gt;&lt;code&gt;mirror_size&lt;/code&gt;
  1852. documentation&lt;/a&gt;,
  1853. and applied a &lt;a href=&quot;https://bugs.debian.org/1108274&quot;&gt;patch from Christoph Goehre&lt;/a&gt;
  1854. to improve mirroring of installer files.&lt;/p&gt;
  1855. &lt;h2&gt;madison-lite&lt;/h2&gt;
  1856. &lt;p&gt;I &lt;a href=&quot;https://bugs.debian.org/1109003&quot;&gt;proposed&lt;/a&gt; renaming this project along
  1857. with the &lt;code&gt;rmadison&lt;/code&gt; tool in &lt;code&gt;devscripts&lt;/code&gt;, although I’m not yet sure what a
  1858. good replacement name would be.&lt;/p&gt;
  1859. &lt;h2&gt;Python team&lt;/h2&gt;
  1860. &lt;p&gt;I upgraded python-expandvars, python-typing-extensions (in experimental),
  1861. and webtest to new upstream versions.&lt;/p&gt;
  1862. &lt;p&gt;I backported fixes for some security vulnerabilities to unstable:&lt;/p&gt;
  1863. &lt;ul&gt;
  1864. &lt;li&gt;python-urllib3: &lt;a href=&quot;https://bugs.debian.org/1108076&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt;-2025-50181&lt;/a&gt;,
  1865.  &lt;a href=&quot;https://bugs.debian.org/1108077&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CVE&lt;/span&gt;-2025-50182&lt;/a&gt;&lt;/li&gt;
  1866. &lt;/ul&gt;
  1867. &lt;p&gt;I fixed or helped to fix a number of release-critical bugs:&lt;/p&gt;
  1868. &lt;ul&gt;
  1869. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108968&quot;&gt;bitstruct: autopkgtest regression: invalid command ‘test’&lt;/a&gt;&lt;/li&gt;
  1870. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1102611&quot;&gt;django-pipeline: autopkgtest failure&lt;/a&gt;
  1871.  (&lt;a href=&quot;https://github.com/jazzband/django-pipeline/pull/837&quot;&gt;contributed supporting fix
  1872.  upstream&lt;/a&gt;)&lt;/li&gt;
  1873. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108946&quot;&gt;pnopaste: Fails to install with debconf noninteractive
  1874.  frontend&lt;/a&gt; (suggested possible patch)&lt;/li&gt;
  1875. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108799&quot;&gt;py3dns: autopkgtest regression: ‘96.7.128.186’ !=
  1876.  ‘93.184.215.14’&lt;/a&gt; (&lt;a href=&quot;https://code.launchpad.net/~cjwatson/py3dns/+git/py3dns/+merge/488798&quot;&gt;contributed
  1877.  upstream&lt;/a&gt;)&lt;/li&gt;
  1878. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108782&quot;&gt;python-marshmallow-dataclass: autopkgtest depends on removed package python-marshmallow-enum&lt;/a&gt;&lt;/li&gt;
  1879. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108795&quot;&gt;python-pkgconfig: autopkgtest regression: list index out of range&lt;/a&gt;&lt;/li&gt;
  1880. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108797&quot;&gt;python-txrequests: autopkgtest regression:
  1881.  twisted.trial.unittest.FailTest: 200 != 404&lt;/a&gt;&lt;/li&gt;
  1882. &lt;/ul&gt;
  1883. &lt;p&gt;I fixed some other bugs, mostly &lt;code&gt;Severity: important&lt;/code&gt;:&lt;/p&gt;
  1884. &lt;ul&gt;
  1885. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1106896&quot;&gt;afew: Unable to remove tags&lt;/a&gt; (&lt;a href=&quot;https://salsa.debian.org/python-team/packages/afew/-/merge_requests/3&quot;&gt;reviewed
  1886.  and merged
  1887.  &lt;span class=&quot;caps&quot;&gt;MR&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
  1888. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1103313&quot;&gt;ipy: &lt;span class=&quot;caps&quot;&gt;FTBFS&lt;/span&gt; with the nocheck build profile&lt;/a&gt;&lt;/li&gt;
  1889. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1108434&quot;&gt;paramiko: Does not correctly handle OpenSSH 10 version&lt;/a&gt;&lt;/li&gt;
  1890. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1103323&quot;&gt;python-django-storages: &lt;span class=&quot;caps&quot;&gt;FTBFS&lt;/span&gt; with the nocheck build profile&lt;/a&gt;&lt;/li&gt;
  1891. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1104638&quot;&gt;python-icalendar: Depends on a transitional
  1892.  package&lt;/a&gt; (and follow-up fixes for missing
  1893.  build-dependencies in python-recurring-ical-events, python-x-wr-timezone,
  1894.  and todoman)&lt;/li&gt;
  1895. &lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/1025404&quot;&gt;python-libais: Stop calling python3 setup.py
  1896.  test&lt;/a&gt; (&lt;a href=&quot;https://github.com/schwehr/libais/pull/252&quot;&gt;contributed supporting fix
  1897.  upstream&lt;/a&gt;)&lt;/li&gt;
  1898. &lt;/ul&gt;
  1899. &lt;p&gt;I reinstated python3-mastodon’s build-dependency on and recommendation of
  1900. python3-blurhash, now that the latter has been &lt;a href=&quot;https://bugs.debian.org/1101140&quot;&gt;fixed to use the correct
  1901. upstream source&lt;/a&gt;.&lt;/p&gt;</description>
  1902. <pubDate>Wed, 06 Aug 2025 10:41:41 +0000</pubDate>
  1903. </item>
  1904. <item>
  1905. <title>Scarlett Gately Moore: Fostering Constructive Communication in Open Source Communities</title>
  1906. <guid isPermaLink="false">https://www.scarlettgatelymoore.dev/?p=2127</guid>
  1907. <link>https://www.scarlettgatelymoore.dev/fostering-constructive-communication-in-open-source-communities/</link>
  1908. <description>&lt;figure class=&quot;wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex&quot;&gt;
  1909. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-2128&quot; data-id=&quot;2128&quot; height=&quot;625&quot; src=&quot;https://www.scarlettgatelymoore.dev/wp-content/uploads/5278-1024x625.jpg&quot; width=&quot;1024&quot; /&gt;Partners holding big jigsaw puzzle pieces flat vector illustration. Successful partnership, communication and collaboration metaphor. Teamwork and business cooperation concept.&lt;/figure&gt;
  1910. &lt;/figure&gt;
  1911.  
  1912.  
  1913.  
  1914. &lt;p&gt;I write this in the wake of a personal attack against my work and a project that is near and dear to me. Instead of spreading vile rumors and hearsay, talk to me. I am not known to be ‘hard to talk to’ and am wide open for productive communication. I am disheartened and would like to share some thoughts of the importance of communication. Thanks for listening.&lt;/p&gt;
  1915.  
  1916.  
  1917.  
  1918. &lt;p&gt;Open source development thrives on collaboration, shared knowledge, and mutual respect. Yet sometimes, the very passion that drives us to contribute can lead to misunderstandings and conflicts that harm both individuals and the projects we care about. As contributors, maintainers, and community members, we have a responsibility to foster environments where constructive dialogue flourishes.&lt;/p&gt;
  1919.  
  1920.  
  1921.  
  1922. &lt;h2 class=&quot;wp-block-heading&quot;&gt;The Foundation of Healthy Open Source Communities&lt;/h2&gt;
  1923.  
  1924.  
  1925.  
  1926. &lt;p&gt;At its core, open source is about people coming together to build something greater than what any individual could create alone. This collaborative spirit requires more than just technical skills—it demands emotional intelligence, empathy, and a commitment to treating one another with dignity and respect.&lt;/p&gt;
  1927.  
  1928.  
  1929.  
  1930. &lt;p&gt;When disagreements arise—and they inevitably will—the manner in which we handle them defines the character of our community. Technical debates should focus on the merits of ideas, implementations, and approaches, not on personal attacks or character assassinations conducted behind closed doors.&lt;/p&gt;
  1931.  
  1932.  
  1933.  
  1934. &lt;h2 class=&quot;wp-block-heading&quot;&gt;The Importance of Direct Communication&lt;/h2&gt;
  1935.  
  1936.  
  1937.  
  1938. &lt;p&gt;One of the most damaging patterns in any community is when criticism travels through indirect channels while bypassing the person who could actually address the concerns. When we have legitimate technical disagreements or concerns about someone’s work, the constructive path forward is always direct, respectful communication.&lt;/p&gt;
  1939.  
  1940.  
  1941.  
  1942. &lt;p&gt;Consider these approaches:&lt;/p&gt;
  1943.  
  1944.  
  1945.  
  1946. &lt;ul class=&quot;wp-block-list&quot;&gt;
  1947. &lt;li&gt;&lt;strong&gt;Address concerns directly&lt;/strong&gt;: If you have technical objections to someone’s work, engage with them directly through appropriate channels&lt;/li&gt;
  1948.  
  1949.  
  1950.  
  1951. &lt;li&gt;&lt;strong&gt;Focus on specifics&lt;/strong&gt;: Critique implementations, documentation, or processes—not the person behind them&lt;/li&gt;
  1952.  
  1953.  
  1954.  
  1955. &lt;li&gt;&lt;strong&gt;Assume good intentions&lt;/strong&gt;: Most contributors are doing their best with the time and resources available to them&lt;/li&gt;
  1956.  
  1957.  
  1958.  
  1959. &lt;li&gt;&lt;strong&gt;Offer solutions&lt;/strong&gt;: Instead of just pointing out problems, suggest constructive alternatives&lt;/li&gt;
  1960. &lt;/ul&gt;
  1961.  
  1962.  
  1963.  
  1964. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Supporting Contributors Through Challenges&lt;/h2&gt;
  1965.  
  1966.  
  1967.  
  1968. &lt;p&gt;Open source contributors often juggle their community involvement with work, family, and personal challenges. Many are volunteers giving their time freely, while others may be going through difficult periods in their lives—job searching, dealing with health issues, or facing other personal struggles.&lt;/p&gt;
  1969.  
  1970.  
  1971.  
  1972. &lt;p&gt;During these times, our response as a community matters enormously. A word of encouragement can sustain someone through tough periods, while harsh criticism delivered thoughtlessly can drive away valuable contributors permanently.&lt;/p&gt;
  1973.  
  1974.  
  1975.  
  1976. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Building Resilient Communities&lt;/h2&gt;
  1977.  
  1978.  
  1979.  
  1980. &lt;p&gt;Strong open source communities are built on several key principles:&lt;/p&gt;
  1981.  
  1982.  
  1983.  
  1984. &lt;p&gt;&lt;strong&gt;Transparency in Communication&lt;/strong&gt;: Discussions about technical decisions should happen in public forums where all stakeholders can participate and learn from the discourse.&lt;/p&gt;
  1985.  
  1986.  
  1987.  
  1988. &lt;p&gt;&lt;strong&gt;Constructive Feedback Culture&lt;/strong&gt;: Criticism should be specific, actionable, and delivered with the intent to improve rather than to tear down.&lt;/p&gt;
  1989.  
  1990.  
  1991.  
  1992. &lt;p&gt;&lt;strong&gt;Recognition of Contribution&lt;/strong&gt;: Every contribution, whether it’s code, documentation, bug reports, or community support, has value and deserves acknowledgment.&lt;/p&gt;
  1993.  
  1994.  
  1995.  
  1996. &lt;p&gt;&lt;strong&gt;Conflict Resolution Processes&lt;/strong&gt;: Clear, fair procedures for handling disputes help prevent minor disagreements from escalating into community-damaging conflicts.&lt;/p&gt;
  1997.  
  1998.  
  1999.  
  2000. &lt;h2 class=&quot;wp-block-heading&quot;&gt;The Long View&lt;/h2&gt;
  2001.  
  2002.  
  2003.  
  2004. &lt;p&gt;Many successful open source projects span decades, with contributors coming and going as their life circumstances change. The relationships we build and the culture we create today will determine whether these projects continue to attract and retain the diverse talent they need to thrive.&lt;/p&gt;
  2005.  
  2006.  
  2007.  
  2008. &lt;p&gt;When we invest in treating each other well—even during disagreements—we’re investing in the long-term health of our projects and communities. We’re creating spaces where innovation can flourish because people feel safe to experiment, learn from mistakes, and grow together.&lt;/p&gt;
  2009.  
  2010.  
  2011.  
  2012. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Moving Forward Constructively&lt;/h2&gt;
  2013.  
  2014.  
  2015.  
  2016. &lt;p&gt;If you find yourself in conflict with another community member, consider these steps:&lt;/p&gt;
  2017.  
  2018.  
  2019.  
  2020. &lt;ol class=&quot;wp-block-list&quot;&gt;
  2021. &lt;li&gt;&lt;strong&gt;Take a breath&lt;/strong&gt;: Strong emotions rarely lead to productive outcomes&lt;/li&gt;
  2022.  
  2023.  
  2024.  
  2025. &lt;li&gt;&lt;strong&gt;Seek to understand&lt;/strong&gt;: What are the underlying concerns or motivations?&lt;/li&gt;
  2026.  
  2027.  
  2028.  
  2029. &lt;li&gt;&lt;strong&gt;Communicate directly&lt;/strong&gt;: Reach out privately first, then publicly if necessary&lt;/li&gt;
  2030.  
  2031.  
  2032.  
  2033. &lt;li&gt;&lt;strong&gt;Focus on solutions&lt;/strong&gt;: How can the situation be improved for everyone involved?&lt;/li&gt;
  2034.  
  2035.  
  2036.  
  2037. &lt;li&gt;&lt;strong&gt;Know when to step back&lt;/strong&gt;: Sometimes the healthiest choice is to disengage from unproductive conflicts&lt;/li&gt;
  2038. &lt;/ol&gt;
  2039.  
  2040.  
  2041.  
  2042. &lt;h2 class=&quot;wp-block-heading&quot;&gt;A Call for Better&lt;/h2&gt;
  2043.  
  2044.  
  2045.  
  2046. &lt;p&gt;Open source has given us incredible tools, technologies, and opportunities. The least we can do in return is treat each other with the respect and kindness that makes these collaborative achievements possible.&lt;/p&gt;
  2047.  
  2048.  
  2049.  
  2050. &lt;p&gt;Every contributor—whether they’re packaging software, writing documentation, fixing bugs, or supporting users—is helping to build something remarkable. Let’s make sure our communities are places where that work can continue to flourish, supported by constructive communication and mutual respect.&lt;/p&gt;
  2051.  
  2052.  
  2053.  
  2054. &lt;p&gt;The next time you encounter work you disagree with, ask yourself: How can I make this better? How can I help this contributor grow? How can I model the kind of community interaction I want to see?&lt;/p&gt;
  2055.  
  2056.  
  2057.  
  2058. &lt;p&gt;Our projects are only as strong as the communities that support them. Let’s build communities worthy of the amazing software we create together.&lt;/p&gt;
  2059.  
  2060.  
  2061.  
  2062. &lt;p&gt;&lt;a href=&quot;https://gofund.me/506c910c&quot;&gt;https://gofund.me/506c910c&lt;/a&gt;&lt;/p&gt;</description>
  2063. <pubDate>Mon, 04 Aug 2025 21:52:10 +0000</pubDate>
  2064. </item>
  2065. <item>
  2066. <title>Thomas Bechtold: Streamline Root Filesystem Modifications with chimg</title>
  2067. <guid isPermaLink="false">http://toabctl.wordpress.com/?p=151</guid>
  2068. <link>https://toabctl.wordpress.com/2025/07/31/streamline-root-filesystem-modifications-with-chimg/</link>
  2069. <description>&lt;p&gt;During the last year I developed as a side project a new tool called &lt;a href=&quot;https://github.com/canonical/chimg/&quot;&gt;chimg&lt;/a&gt; . That tool is useful to modify a given rootfs chroot directory in a declarative way. It can replace a kernel within a chroot, preseed snaps, install debian packages, add PPAs and more (documentation is in git but not yet published).&lt;/p&gt;
  2070.  
  2071.  
  2072.  
  2073. &lt;p&gt;The nice thing about this is, that this tool can be integrated into &lt;a href=&quot;https://launchpad.net/livecd-rootfs&quot;&gt;livecd-rootfs&lt;/a&gt; (the tool that is usually used to build Ubuntu images) or future tools which might use the craft framework to build images. &lt;code&gt;chimg&lt;/code&gt; automatically detects already bind-mounted filesystems (eg. &lt;code&gt;/sys&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt;, …), detects already preseeded snaps and usually does that same thing that &lt;code&gt;livecd-rootfs&lt;/code&gt; currently does when eg. replacing an already installed kernel.&lt;/p&gt;
  2074.  
  2075.  
  2076.  
  2077. &lt;p&gt;Install &lt;code&gt;chimg&lt;/code&gt; with:&lt;/p&gt;
  2078.  
  2079.  
  2080. &lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: plain; title: ; notranslate&quot;&gt;sudo snap install chimg --classic
  2081. &lt;/pre&gt;&lt;/div&gt;
  2082.  
  2083.  
  2084. &lt;p&gt;An example configuration (eg. &lt;code&gt;config.yaml&lt;/code&gt;) to modify a rootfs chroot directory looks like this:&lt;/p&gt;
  2085.  
  2086.  
  2087. &lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: yaml; title: ; notranslate&quot;&gt;---
  2088. kernel: linux-aws
  2089. debs:
  2090.  - name: shim-signed
  2091.  - name: grub-pc
  2092.  - name: grub2-common
  2093.  - name: ubuntu-cloud-minimal
  2094. snap:
  2095.  assertion_brand: canonical
  2096.  assertion_model: aws-classic
  2097.  snaps:
  2098.    - name: hello
  2099.      channel: latest/stable
  2100. files:
  2101.  -
  2102.    destination: /etc/default/grub.d/70-mysettings.cfg
  2103.    content: |+
  2104.      GRUB_TIMEOUT=0
  2105.  
  2106. cmds_post:
  2107.  -
  2108.    cmd: |
  2109.      echo &quot;Everything done&quot;
  2110. &lt;/pre&gt;&lt;/div&gt;
  2111.  
  2112.  
  2113. &lt;p&gt;This config (stored in &lt;code&gt;config.yaml&lt;/code&gt; in this example) can be applied to a newly created (or existing) root filesystem directory. Let’s create one in &lt;code&gt;/tmp/chimg-noble&lt;/code&gt;:&lt;/p&gt;
  2114.  
  2115.  
  2116. &lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; title: ; notranslate&quot;&gt;sudo mmdebstrap --variant=apt --verbose noble /tmp/chimg-noble
  2117. &lt;/pre&gt;&lt;/div&gt;
  2118.  
  2119.  
  2120. &lt;p&gt;Let’s apply the config changes now:&lt;/p&gt;
  2121.  
  2122.  
  2123. &lt;div class=&quot;wp-block-syntaxhighlighter-code &quot;&gt;&lt;pre class=&quot;brush: bash; title: ; notranslate&quot;&gt;sudo chimg --log-console chrootfs config.yaml /tmp/chimg-noble
  2124. &lt;/pre&gt;&lt;/div&gt;
  2125.  
  2126.  
  2127. &lt;p&gt;That’s it. The modifications are now applied to the &lt;code&gt;/tmp/chimg-noble&lt;/code&gt; directory.&lt;/p&gt;
  2128.  
  2129.  
  2130.  
  2131. &lt;p&gt;&lt;/p&gt;</description>
  2132. <pubDate>Thu, 31 Jul 2025 18:15:36 +0000</pubDate>
  2133. </item>
  2134. <item>
  2135. <title>Oliver Grawert: Rooming with Mark</title>
  2136. <guid isPermaLink="false">http://ograblog.wordpress.com/?p=389</guid>
  2137. <link>https://ograblog.wordpress.com/2025/05/16/rooming-with-mark/</link>
  2138. <description>&lt;p class=&quot;has-black-color has-text-color has-link-color wp-elements-46088db9ef993c5ecc5629835e2d0dbd&quot;&gt;Yesterday, exactly twenty years ago my mobile rang while I was walking the dog. &lt;br /&gt;&lt;br /&gt;I had just returned from Sydney about a week ago (still battling with the last remains of my Jet-lag (I had never left Europe before!)) where I had attended the UbuntuDownUnder summit and had a 30min interview on the last day (that was literally rather like having a coffee with friends after lunch) with Mark Shuttleworth and Matt Zimmerman (back then Canonicals CTO) on a nice hotel terrace directly under a tree with a colony of flying foxes sleeping above our heads.&lt;br /&gt;&lt;br /&gt;There was Jane Silber (CEO) on the phone, telling me: “I’m so happy to tell you you are hired! In your new role we want you to create an educational flavor of Ubuntu, there will be a debian-edu/skolelinux gathering in Bergen in Norway from the 10th to 12th of June, are you okay flying there with Mark?”&lt;br /&gt;&lt;br /&gt;I rushed back home and told my girlfriend: “I’m hired, and I’ll fly Canonical One on my first business trip next month!” (Canonical One was the name of Marks plane). I learned the next weeks that Canonical had indeed booked a generic scheduled flight for me and we’d only meet at the venue &lt;img alt=&quot;🙂&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;The flight was a disaster, after we were boarding that small 20-seater 2 prop plane that was supposed to get us from Cologne to Amsterdam and the pilot started the engine my window all of a sudden was soaked in oil. We had to stay in the plane out on the filed while the mechanics were fixing the engine for like 2-3h so indeed I missed the connection in Amsterdam and had to stay for the night instead of arriving in Bergen the evening before the event started.&lt;br /&gt;&lt;br /&gt;When I arrived at the venue everyone was already busy hacking on stuff and I jumped right in alongside, finally meeting some users of LTSP (Linux Terminal Server Project) which I was upstream for at that time and working with them on the problems they faced in debian with it, tinkering with moodle as a teaching support system and looking at other edu software, meanwhile Mark was sitting on a bar-stool in a corner with his laptop hacking on launchpad code.&lt;br /&gt;&lt;br /&gt;When we went to our hotel in the evening it turned out they did not have our booking at all and were completely overbooked due to a jewelry exhibition they had in the house for that week. I talked like 15min to the lady behind the counter, showed her my booking confirmation PDF on the laptop, begged and flirted a lot and eventually she told us “We do have an exhibition room that we keep as spare, it only has one bed but you can have it and we will add a folding bed”. The room was actually a normal hotel room but completely set up with wallpaper tables all around the walls. &lt;br /&gt;&lt;br /&gt;Mark insisted to take the folding bed and I can tell you, he does not snore … (well, he didn’t back then)&lt;br /&gt;&lt;br /&gt;This was only the first of a plethora of adventures that followed in the upcoming 20 years, that phone call clearly changed my life and the company gave me the opportunity to work with the brightest, sharpest and most intelligent people on the planet in and outside of Canonical.&lt;br /&gt;&lt;br /&gt;It surely changed a lot over these years (when I started we were building the distro with 18 people in the distro team and did that for quite a few years before it actually got split into server, foundations, kernel and desktop teams) but it never lost its special spirit of having these exceptional people with such a high focus on bringing opensource to everyone and making it accessible to everyone. &lt;br /&gt;Indeed, with growth comes the requirement to make more money to pay the people, the responsibility to give your employees a certain amount of security and persistence grows, but Canonical and especially Mark have always managed to keep the balance to not lose that focus and do the right thing in the end.&lt;br /&gt;&lt;br /&gt;Ten years ago I said “onward to the next ten!!”, I won’t really say “onward to the next 20!” today, not because I ever plan to resign but simply because I doubt I still want to work full time when I’m 75 &lt;img alt=&quot;😉&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Thank you Mark for dragging me into this adventure and thank you for still having me! I still love the ride!!&lt;/p&gt;
  2139.  
  2140.  
  2141.  
  2142. &lt;p&gt;&lt;/p&gt;
  2143.  
  2144.  
  2145.  
  2146. &lt;p&gt;&lt;/p&gt;
  2147.  
  2148.  
  2149.  
  2150. &lt;p&gt;&lt;/p&gt;</description>
  2151. <pubDate>Tue, 29 Jul 2025 13:26:03 +0000</pubDate>
  2152. </item>
  2153. <item>
  2154. <title>Dimitri John Ledkov: Achieving actually full disk encryption of UEFI ESP at rest with TCG OPAL, FIPS, LUKS</title>
  2155. <guid isPermaLink="false">tag:blogger.com,1999:blog-347582618045055410.post-5137629174584752121</guid>
  2156. <link>http://blog.surgut.co.uk/2025/07/achieving-actually-full-disk-encryption.html</link>
  2157. <description>&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifDQL9Ducebgoi5rQaoK8ZXCp1ud1YHOguORDpgsmeD5E1PNT9Ptcdps3hLehMw6RHpXeovif1fgMpYF8lAucFgYmUZYgvdl68669qcjgUkN4hcpTRBzSK1HilijZgPjSxpCySZQtvtmkh7EjKMjMB27qIpJvXXmlFfobGPp7bIjoluItyPF6cJ7fnL1A/s1280/pexels-markus-winkler-1430818-3828944.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;853&quot; data-original-width=&quot;1280&quot; height=&quot;427&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifDQL9Ducebgoi5rQaoK8ZXCp1ud1YHOguORDpgsmeD5E1PNT9Ptcdps3hLehMw6RHpXeovif1fgMpYF8lAucFgYmUZYgvdl68669qcjgUkN4hcpTRBzSK1HilijZgPjSxpCySZQtvtmkh7EjKMjMB27qIpJvXXmlFfobGPp7bIjoluItyPF6cJ7fnL1A/w640-h427/pexels-markus-winkler-1430818-3828944.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Achieving full disk encryption using FIPS, TCG OPAL and LUKS to encrypt UEFI ESP on bare-metal and in VMs&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Many security standards such as CIS and STIG require to protect information at rest. For example, &lt;a href=&quot;https://doi.org/10.6028/NIST.SP.800-53r5&quot;&gt;NIST SP 800-53r5&lt;/a&gt; SC-28 advocate to use cryptographic protection, offline storage and TPMs to enhance protection of information confidentiality and/or integrity.&lt;/p&gt;&lt;p&gt;Traditionally to satisfy such controls on portable devices such as laptops one would utilize software based Full Disk Encryption - &lt;a href=&quot;https://support.apple.com/en-gb/guide/mac-help/mh11785/mac&quot;&gt;Mac OS X FileVault&lt;/a&gt;, &lt;a href=&quot;https://support.microsoft.com/en-us/windows/bitlocker-drive-encryption-76b92ac9-1040-48d6-9f5f-d14b3c5fa178&quot;&gt;Windows Bitlocker&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/cryptsetup/cryptsetup&quot;&gt;Linux cryptsetup LUKS2&lt;/a&gt;. In cases when FIPS cryptography is required, additional burden would be placed onto these systems to operate their kernels in FIPS mode.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://trustedcomputinggroup.org/&quot;&gt;Trusted Computing Group&lt;/a&gt; works on establishing many industry standards and specifications, which are widely adopted to improve safety and security of computing whilst keeping it easy to use. One of their most famous specifications them is TCG &lt;span face=&quot;Roboto-Medium&quot; style=&quot;background-color: white;&quot;&gt;TPM 2.0 (Trusted Platform Module). TPMs are now widely available on most devices and help to protect secret keys and attest systems. For example, most software full disk encryption solutions can utilise TCG TPM to store full disk encryption keys providing passwordless, biometric or pin-base ways to unlock the drives as well as attesting that system have not been modified or compromised whilst offline.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://trustedcomputinggroup.org/resource/storage-work-group-storage-security-subsystem-class-opal/&quot;&gt;TCG Storage Security Subsystem Class: Opal Specification&lt;/a&gt; is a set of specifications for features of data storage devices. The authors and contributors to OPAL are leading and well trusted storage manufacturers such as Samsung, Western Digital, Seagate Technologies, Dell, Google, Lenovo, IBM, Kioxia, among others. One of the features that Opal Specification enables is self-encrypting drives which becomes very powerful when combined with pre-boot authentication. Out of the box, such drives always and transparently encrypt all disk data using hardware acceleration. To protect data one can enter UEFI firmware setup (BIOS) to set NVMe single user password (or user + administrator/recovery passwords) to encrypt the disk encryption key. If one's firmware didn't come with such features, one can also use &lt;a href=&quot;https://sedutil.com/&quot;&gt;SEDutil&lt;/a&gt; to inspect and configure all of this. Latest release of major Linux distributions have SEDutil already packaged.&lt;/p&gt;&lt;p&gt;Once password is set, on startup, pre-boot authentication will request one to enter password - prior to booting any operating systems. It means that full disk is actually encrypted, including the UEFI ESP and all operating systems that are installed in case of dual or multi-boot installations. This also prevents tampering with ESP, UEFI bootloaders and kernels which with traditional software-based encryption often remain unencrypted and accessible. It also means one doesn't have to do special OS level repartitioning, or installation steps to ensure all data is encrypted at rest.&lt;/p&gt;&lt;p&gt;What about FIPS compliance? Well, the good news is that majority of the OPAL compliant hard drives and/or security sub-chips do have FIPS 140-3 certification. Meaning they have been tested by independent laboratories to ensure they do in-fact encrypt data. On the &lt;a href=&quot;https://csrc.nist.gov/Projects/cryptographic-module-validation-program/validated-modules/search&quot;&gt;CMVP&lt;/a&gt; website one can search for module name terms &quot;OPAL&quot; or &quot;NVMe&quot; or name of hardware vendor to locate FIPS certificates.&lt;/p&gt;&lt;p&gt;Are such drives widely available? Yes. For example, a common Thinkpad X1 gen 11 has OPAL NVMe drives as standard, and they have FIPS certification too. Thus, it is likely in your hardware fleet these are already widely available. Use sedutil to check if MediaEncrypt and LockingSupported features are available.&lt;/p&gt;&lt;p&gt;Well, this is great for laptops and physical servers, but you may ask - what about public or private cloud? Actually, more or less the same is already in-place in both. On CVMP website all major clouds have their disk encryption hardware certified, and all of them always encrypt all Virtual Machines with FIPS certified cryptography without an ability to opt-out. One is however in full control of how the encryption keys are managed: cloud-provider or self-managed (either with a cloud HSM or KMS or bring your own / external). See these relevant encryption options and key management docs for &lt;a href=&quot;https://cloud.google.com/docs/security/encryption/default-encryption?hl=en&quot;&gt;GCP&lt;/a&gt;, &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/virtual-machines/disk-encryption-overview&quot;&gt;Azure&lt;/a&gt;, &lt;a href=&quot;https://maturitymodel.security.aws.dev/en/2.-foundational/kms/&quot;&gt;AWS&lt;/a&gt;. But the key takeaway without doing anything, at rest, VMs in public cloud are always encrypted and satisfy NIST SP 800-53 controls.&lt;/p&gt;&lt;p&gt;What about private cloud? Most Linux based private clouds ultimately use &lt;a href=&quot;https://www.qemu.org/&quot;&gt;qemu&lt;/a&gt; typically with qcow2 virtual disk images. Qemu supports user-space encryption of qcow2 disk, see this &lt;a href=&quot;https://www.qemu.org/docs/master/tools/qemu-img.html&quot;&gt;manpage&lt;/a&gt;. Such encryption encrypts the full virtual machine disk, including the bootloader and ESP. And it is handled entirely outside of the VM on the host - meaning the VM never has access to the disk encryption keys. Qemu implements this encryption entirely in userspace using gnutls, nettle, libgcrypt depending on how it was compiled. This also means one can satisfy FIPS requirements entirely in userspace without a Linux kernel in FIPS mode. Higher level APIs built on top of qemu also support qcow2 disk encryption, as in projects such as &lt;a href=&quot;https://libvirt.org/formatstorageencryption.html&quot;&gt;libvirt&lt;/a&gt; and &lt;a href=&quot;https://docs.openstack.org/cinder/latest/configuration/block-storage/volume-encryption.html&quot;&gt;OpenStack Cinder&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you carefully read the docs, you may notice that agent support is explicitly sometimes called out as not supported or not mentioned. Quite often agents running inside the OS may not have enough observability to them to assess if there is external encryption. It does mean that monitoring above encryption options require different approaches - for example monitor your cloud configuration using tools such as Wiz and &lt;a href=&quot;https://orca.security/&quot;&gt;Orca&lt;/a&gt;, rather than using agents inside individual VMs. For laptop / endpoint security agents, I do wish they would start gaining capability to report OPAL SED availability and status if it is active or not.&lt;/p&gt;&lt;p&gt;What about using software encryption none-the-less on top of the above solutions? It is commonly referred to double or multiple encryption. There will be an additional performance impact, but it can be worthwhile. It really depends on what you define as data at rest for yourself and which controls you need. If one has a dual-boot laptop, and wants to keep one OS encrypted whilst booted into the other, it can perfectly reasonable to encrypted the two using separate software encryption keys. In addition to the OPAL encryption of the ESP. For more targeted per-file / per-folder encryption, one can look into using &lt;a href=&quot;https://nuetzlich.net/gocryptfs/&quot;&gt;gocryptfs&lt;/a&gt; which is the best successor to the once popular, but now deprecated &lt;a href=&quot;https://www.ecryptfs.org/&quot;&gt;eCryptfs&lt;/a&gt; (amazing tool, but has fallen behind in development and can lead to data loss).&lt;/p&gt;&lt;p&gt;All of the above mostly talks about cryptographic encryption, which only provides confidentially but not data integrity. To protect integrity, one needs to choose how to maintain that. &lt;a href=&quot;https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html&quot;&gt;dm-verity&lt;/a&gt; is a good choice for read-only and rigid installations. For read-write workloads, it may be easier to deploy &lt;a href=&quot;https://zfsonlinux.org/&quot;&gt;ZFS&lt;/a&gt; or &lt;a href=&quot;https://btrfs.readthedocs.io/en/latest/index.html&quot;&gt;Btrfs&lt;/a&gt; instead. If one is using filesystems without a built-in integrity support such as XFS or Ext4, one can retrofit integrity layer to them by using &lt;a href=&quot;https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/dm-integrity.html&quot;&gt;dm-integrity&lt;/a&gt; (either standalone, or via dm-luks/cryptsetup --integrity option).&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;If one has a lot of estate and a lot of encryption keys to keep track off a key management solution is likely needed. The most popular solution is likely the one from Thales Group marketed under &lt;a href=&quot;https://cpl.thalesgroup.com/encryption/data-security-platform&quot;&gt;ChiperTrust Data Security Platform&lt;/a&gt; (previously Vormetric), but there are many others including OEM / Vendor / Hardware / Cloud specific or agnostic solutions.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;I hope this crash course guide piques your interest to learn and discover modern confidentially and integrity solutions, and to re-affirm or change your existing controls w.r.t. to data protection at rest. &lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Full disk encryption, including UEFI ESP /boot/efi is now widely achievable by default on both baremetal machines and in VMs including with FIPS certification. To discuss more let's connect on &lt;a href=&quot;https://www.linkedin.com/in/dimitri-john-ledkov/&quot;&gt;Linkedin&lt;/a&gt;.&lt;/p&gt;</description>
  2158. <pubDate>Mon, 28 Jul 2025 11:13:30 +0000</pubDate>
  2159. <author>noreply@blogger.com (Dimitri John Ledkov)</author>
  2160. </item>
  2161. <item>
  2162. <title>Jonathan Carter: DebConf25</title>
  2163. <guid isPermaLink="false">https://jonathancarter.org/?p=11929</guid>
  2164. <link>https://jonathancarter.org/2025/07/19/debconf25/</link>
  2165. <description>&lt;p&gt;The last two weeks I attended &lt;a href=&quot;https://debconf25.debconf.org/&quot;&gt;DebConf and DebCamp&lt;/a&gt; in Brest, France.&lt;/p&gt;
  2166.  
  2167.  
  2168.  
  2169. &lt;p&gt;Usually, I like to do a more detailed write-up of DebConf, but I was already quite burnt out when I got here, so I’ll circle back to a few things that were important to me in later posts.&lt;/p&gt;
  2170.  
  2171.  
  2172.  
  2173. &lt;p&gt;In the meantime, thanks to everyone who made this DebConf possible, whether you volunteered for one task or were part of the organisation team. Also a special thanks to the &lt;a href=&quot;https://debconf25.debconf.org/sponsors/&quot;&gt;wonderful sponsors&lt;/a&gt; who made this entire event possible!&lt;/p&gt;
  2174.  
  2175.  
  2176.  
  2177. &lt;p&gt;See you next year in Argentina!&lt;/p&gt;
  2178.  
  2179.  
  2180.  
  2181. &lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img alt=&quot;Jellyfish taken during daytrip at aquarium.&quot; class=&quot;wp-image-11936&quot; height=&quot;577&quot; src=&quot;https://jonathancarter.org/files/images/jellyfish-1024x577.jpeg&quot; width=&quot;1024&quot; /&gt;&lt;/figure&gt;
  2182.  
  2183.  
  2184.  
  2185. &lt;p class=&quot;has-text-align-center&quot;&gt;&lt;em&gt;Jellyfish, taken during daytrip at aquarium.&lt;/em&gt;&lt;/p&gt;
  2186.  
  2187.  
  2188.  
  2189. &lt;p&gt;&lt;/p&gt;
  2190. &lt;img alt=&quot;&quot; height=&quot;0&quot; src=&quot;https://analytics.jonathancarter.org/piwik.php?idsite=1&amp;amp;rec=1&amp;amp;url=https%3A%2F%2Fjonathancarter.org%2F2025%2F07%2F19%2Fdebconf25%2F&amp;amp;action_name=DebConf25&amp;amp;urlref=https%3A%2F%2Fjonathancarter.org%2Ffeed%2F&quot; style=&quot;border: 0; width: 0; height: 0;&quot; width=&quot;0&quot; /&gt;</description>
  2191. <pubDate>Sat, 19 Jul 2025 17:12:49 +0000</pubDate>
  2192. </item>
  2193. <item>
  2194. <title>Faizul &quot;Piju&quot; 9M2PJU: OpenRocket: Design, Simulate, and Launch Your Own Rockets — Free and Open Source</title>
  2195. <guid isPermaLink="false">https://hamradio.my/?p=7766</guid>
  2196. <link>https://hamradio.my/2025/07/openrocket-design-simulate-and-launch-your-own-rockets-free-and-open-source/</link>
  2197. <description>&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;/h2&gt;
  2198.  
  2199.  
  2200.  
  2201. &lt;p&gt;Have you ever dreamed of building and launching your own rockets? Whether you’re a &lt;strong&gt;student&lt;/strong&gt;, &lt;strong&gt;educator&lt;/strong&gt;, &lt;strong&gt;hobbyist&lt;/strong&gt;, or &lt;strong&gt;aerospace enthusiast&lt;/strong&gt;, there’s one tool that makes rocketry accessible, educational, and exciting: &lt;strong&gt;OpenRocket&lt;/strong&gt;.&lt;/p&gt;
  2202.  
  2203.  
  2204.  
  2205. &lt;p&gt;&lt;strong&gt;OpenRocket&lt;/strong&gt; is a &lt;strong&gt;free, fully open-source model rocket simulator&lt;/strong&gt; that helps you &lt;strong&gt;design, simulate, and optimize rockets&lt;/strong&gt; in a virtual environment — all before a single part is printed or assembled.&lt;/p&gt;
  2206.  
  2207.  
  2208.  
  2209. &lt;p&gt;And the best part? It’s &lt;strong&gt;completely free&lt;/strong&gt;, runs on &lt;strong&gt;Windows, macOS, and Linux&lt;/strong&gt;, and is trusted by thousands around the world — from classrooms to high-powered launch pads.&lt;/p&gt;
  2210.  
  2211.  
  2212.  
  2213. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2214.  
  2215.  
  2216.  
  2217. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;🛰&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f6f0.png&quot; style=&quot;height: 1em;&quot; /&gt; What is OpenRocket?&lt;/h3&gt;
  2218.  
  2219.  
  2220.  
  2221. &lt;p&gt;OpenRocket is a powerful simulation tool designed to make rocket science &lt;strong&gt;understandable and practical&lt;/strong&gt;. It enables users to build virtual models of rockets, test their flight performance, and iterate on designs long before committing to physical builds. Whether you’re building a simple school project or a multi-stage high-powered model, OpenRocket is built to support you at every step.&lt;/p&gt;
  2222.  
  2223.  
  2224.  
  2225. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2226.  
  2227.  
  2228.  
  2229. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;🛠&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f6e0.png&quot; style=&quot;height: 1em;&quot; /&gt; Key Features&lt;/h3&gt;
  2230.  
  2231.  
  2232.  
  2233. &lt;ul class=&quot;wp-block-list&quot;&gt;
  2234. &lt;li&gt;&lt;img alt=&quot;🖱&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f5b1.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Drag-and-Drop Rocket Design&lt;/strong&gt;&lt;br /&gt;Build your rocket with ease using a graphical interface — choose body tubes, fins, nose cones, engines, recovery systems, and more.&lt;/li&gt;
  2235.  
  2236.  
  2237.  
  2238. &lt;li&gt;&lt;img alt=&quot;🧮&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f9ee.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Accurate Flight Simulations&lt;/strong&gt;&lt;br /&gt;Simulate flights in real-world conditions with detailed physics modeling, including wind, thrust curves, drag, gravity, and stability.&lt;/li&gt;
  2239.  
  2240.  
  2241.  
  2242. &lt;li&gt;&lt;img alt=&quot;📊&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f4ca.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Detailed Analysis Tools&lt;/strong&gt;&lt;br /&gt;Visualize graphs for altitude, velocity, acceleration, angle of attack, and more — perfect for science fair projects and engineering analysis.&lt;/li&gt;
  2243.  
  2244.  
  2245.  
  2246. &lt;li&gt;&lt;img alt=&quot;🚀&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f680.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Support for Multistage and Cluster Rockets&lt;/strong&gt;&lt;br /&gt;Go beyond basic designs and experiment with multi-engine configurations, boosters, and complex recovery systems.&lt;/li&gt;
  2247.  
  2248.  
  2249.  
  2250. &lt;li&gt;&lt;img alt=&quot;📐&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f4d0.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Advanced Stability Calculations&lt;/strong&gt;&lt;br /&gt;See real-time updates on your rocket’s center of pressure and center of gravity — helping ensure stable flights.&lt;/li&gt;
  2251.  
  2252.  
  2253.  
  2254. &lt;li&gt;&lt;img alt=&quot;🎓&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f393.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Education-First Philosophy&lt;/strong&gt;&lt;br /&gt;Built with educators and students in mind — great for teaching physics, aerodynamics, math, and engineering concepts.&lt;/li&gt;
  2255.  
  2256.  
  2257.  
  2258. &lt;li&gt;&lt;img alt=&quot;🔓&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f513.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;100% Free and Open Source (GPLv3 License)&lt;/strong&gt;&lt;br /&gt;Modify, contribute, or use it freely in academic and personal projects.&lt;/li&gt;
  2259. &lt;/ul&gt;
  2260.  
  2261.  
  2262.  
  2263. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2264.  
  2265.  
  2266.  
  2267. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;👨‍🏫&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f468-200d-1f3eb.png&quot; style=&quot;height: 1em;&quot; /&gt; Perfect for Classrooms and Competitions&lt;/h3&gt;
  2268.  
  2269.  
  2270.  
  2271. &lt;p&gt;OpenRocket is a favorite in schools, universities, and STEM clubs. It’s ideal for:&lt;/p&gt;
  2272.  
  2273.  
  2274.  
  2275. &lt;ul class=&quot;wp-block-list&quot;&gt;
  2276. &lt;li&gt;Physics and engineering lessons&lt;/li&gt;
  2277.  
  2278.  
  2279.  
  2280. &lt;li&gt;STEM competitions&lt;/li&gt;
  2281.  
  2282.  
  2283.  
  2284. &lt;li&gt;High school and university rocketry teams&lt;/li&gt;
  2285.  
  2286.  
  2287.  
  2288. &lt;li&gt;Maker clubs and hobbyist communities&lt;/li&gt;
  2289. &lt;/ul&gt;
  2290.  
  2291.  
  2292.  
  2293. &lt;p&gt;With OpenRocket, students don’t just learn theory — they test it, visualize it, and bring it to life.&lt;/p&gt;
  2294.  
  2295.  
  2296.  
  2297. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2298.  
  2299.  
  2300.  
  2301. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;💻&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f4bb.png&quot; style=&quot;height: 1em;&quot; /&gt; Cross-Platform and Easy to Use&lt;/h3&gt;
  2302.  
  2303.  
  2304.  
  2305. &lt;p&gt;OpenRocket runs smoothly on &lt;strong&gt;Windows, Linux, and macOS&lt;/strong&gt;, with a lightweight footprint and no complex setup required. Just download, install, and launch.&lt;/p&gt;
  2306.  
  2307.  
  2308.  
  2309. &lt;p&gt;Want to try the latest features? There are &lt;strong&gt;stable&lt;/strong&gt; and &lt;strong&gt;experimental&lt;/strong&gt; versions available, with an active community improving the project continuously.&lt;/p&gt;
  2310.  
  2311.  
  2312.  
  2313. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2314.  
  2315.  
  2316.  
  2317. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;🌍&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f30d.png&quot; style=&quot;height: 1em;&quot; /&gt; Join a Global Community&lt;/h3&gt;
  2318.  
  2319.  
  2320.  
  2321. &lt;p&gt;OpenRocket is powered by passionate volunteers and used worldwide. With an active community on forums and GitHub, it’s easy to get help, share ideas, and even contribute your own code or simulations.&lt;/p&gt;
  2322.  
  2323.  
  2324.  
  2325. &lt;p&gt;If you’re ready to explore the world of rocketry without burning through your budget, &lt;strong&gt;OpenRocket is your launchpad&lt;/strong&gt;.&lt;/p&gt;
  2326.  
  2327.  
  2328.  
  2329. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2330.  
  2331.  
  2332.  
  2333. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;🔗&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f517.png&quot; style=&quot;height: 1em;&quot; /&gt; Ready for Liftoff?&lt;/h3&gt;
  2334.  
  2335.  
  2336.  
  2337. &lt;p&gt;Visit &lt;a href=&quot;https://openrocket.info/&quot;&gt;openrocket.info&lt;/a&gt; and start building your dream rocket today.&lt;/p&gt;
  2338.  
  2339.  
  2340.  
  2341. &lt;p&gt;&lt;strong&gt;Design. Simulate. Launch. Learn. Repeat.&lt;/strong&gt;&lt;/p&gt;
  2342.  
  2343.  
  2344.  
  2345. &lt;p&gt;Welcome to the world of &lt;strong&gt;OpenRocket&lt;/strong&gt; — where rocket science is for everyone.&lt;/p&gt;
  2346. &lt;p&gt;The post &lt;a href=&quot;https://hamradio.my/2025/07/openrocket-design-simulate-and-launch-your-own-rockets-free-and-open-source/&quot;&gt;OpenRocket: Design, Simulate, and Launch Your Own Rockets — Free and Open Source&lt;/a&gt; appeared on &lt;a href=&quot;https://hamradio.my&quot;&gt;Hamradio.my - Amateur Radio, Tech Insights and Product Reviews&lt;/a&gt; by &lt;a href=&quot;https://hamradio.my/author/9m2pju/&quot;&gt;9M2PJU&lt;/a&gt;.&lt;/p&gt;</description>
  2347. <pubDate>Sat, 19 Jul 2025 16:15:07 +0000</pubDate>
  2348. </item>
  2349. <item>
  2350. <title>Faizul &quot;Piju&quot; 9M2PJU: Digital – Design, Simulate, and Understand Logic Circuits Like Never Before</title>
  2351. <guid isPermaLink="false">https://hamradio.my/?p=7763</guid>
  2352. <link>https://hamradio.my/2025/07/digital-design-simulate-and-understand-logic-circuits-like-never-before/</link>
  2353. <description>&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;/h2&gt;
  2354.  
  2355.  
  2356.  
  2357. &lt;p&gt;If you’ve ever wanted to dive into the world of &lt;strong&gt;digital electronics&lt;/strong&gt;, whether as a student, educator, engineer, or hobbyist, you’re going to love this tool: &lt;strong&gt;Digital&lt;/strong&gt; — a powerful, free, and open-source logic circuit simulator created by &lt;strong&gt;Helmut Neemann&lt;/strong&gt;. Available on GitHub at &lt;a href=&quot;https://github.com/hneemann/Digital&quot;&gt;hneemann/Digital&lt;/a&gt;, this Java-based application combines clarity, flexibility, and educational value in one sleek package.&lt;/p&gt;
  2358.  
  2359.  
  2360.  
  2361. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;⚙&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/2699.png&quot; style=&quot;height: 1em;&quot; /&gt; What Is Digital?&lt;/h3&gt;
  2362.  
  2363.  
  2364.  
  2365. &lt;p&gt;&lt;strong&gt;Digital&lt;/strong&gt; is a &lt;strong&gt;logic circuit simulator&lt;/strong&gt; designed with a clear goal: to make the teaching, learning, and development of digital logic &lt;strong&gt;intuitive and visual&lt;/strong&gt;. It lets you create, simulate, and analyze logic circuits ranging from basic gates to complex CPUs — all with a &lt;strong&gt;drag-and-drop interface&lt;/strong&gt; and &lt;strong&gt;real-time simulation&lt;/strong&gt;.&lt;/p&gt;
  2366.  
  2367.  
  2368.  
  2369. &lt;p&gt;Unlike other bloated EDA software, Digital is refreshingly simple, elegant, and lightweight. But don’t let its simplicity fool you — it’s capable of simulating complex architectures with &lt;strong&gt;clocked components, finite state machines, memory modules, and even custom microprocessors&lt;/strong&gt;.&lt;/p&gt;
  2370.  
  2371.  
  2372.  
  2373. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2374.  
  2375.  
  2376.  
  2377. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;🔑&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f511.png&quot; style=&quot;height: 1em;&quot; /&gt; Key Features&lt;/h3&gt;
  2378.  
  2379.  
  2380.  
  2381. &lt;ul class=&quot;wp-block-list&quot;&gt;
  2382. &lt;li&gt;&lt;img alt=&quot;🖱&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f5b1.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Intuitive Interface&lt;/strong&gt;&lt;br /&gt;Drag and drop components onto your canvas, connect wires, and see how your circuit behaves in real-time.&lt;/li&gt;
  2383.  
  2384.  
  2385.  
  2386. &lt;li&gt;&lt;img alt=&quot;🕒&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f552.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Real-Time Simulation&lt;/strong&gt;&lt;br /&gt;Changes are reflected immediately, with live logic levels and animations that bring your circuits to life.&lt;/li&gt;
  2387.  
  2388.  
  2389.  
  2390. &lt;li&gt;&lt;img alt=&quot;🧩&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f9e9.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Modular Design&lt;/strong&gt;&lt;br /&gt;Use subcircuits and hierarchical design to keep things organized, even in large-scale projects.&lt;/li&gt;
  2391.  
  2392.  
  2393.  
  2394. &lt;li&gt;&lt;img alt=&quot;⏱&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/23f1.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Clocked Components&lt;/strong&gt;&lt;br /&gt;Simulate registers, flip-flops, RAM, and sequential logic effortlessly.&lt;/li&gt;
  2395.  
  2396.  
  2397.  
  2398. &lt;li&gt;&lt;img alt=&quot;🧠&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f9e0.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Built-in CPU &amp;amp; Assembler&lt;/strong&gt;&lt;br /&gt;Digital includes a simple, yet powerful CPU with its own instruction set and assembler — ideal for teaching &lt;strong&gt;computer architecture&lt;/strong&gt;.&lt;/li&gt;
  2399.  
  2400.  
  2401.  
  2402. &lt;li&gt;&lt;img alt=&quot;🧑‍🏫&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f9d1-200d-1f3eb.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Made for Education&lt;/strong&gt;&lt;br /&gt;Widely used in universities and schools. Perfect for explaining logic gates, truth tables, FSMs, and microprocessor fundamentals.&lt;/li&gt;
  2403.  
  2404.  
  2405.  
  2406. &lt;li&gt;&lt;img alt=&quot;💻&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f4bb.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Cross-platform (Java-based)&lt;/strong&gt;&lt;br /&gt;Works on Windows, macOS, and Linux. Just download and run!&lt;/li&gt;
  2407.  
  2408.  
  2409.  
  2410. &lt;li&gt;&lt;img alt=&quot;🔓&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f513.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;strong&gt;Open Source (GPL-3.0 License)&lt;/strong&gt;&lt;br /&gt;Actively maintained and completely free. Fork it, contribute, or adapt it to your own projects.&lt;/li&gt;
  2411. &lt;/ul&gt;
  2412.  
  2413.  
  2414.  
  2415. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2416.  
  2417.  
  2418.  
  2419. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;📚&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f4da.png&quot; style=&quot;height: 1em;&quot; /&gt; Who Is It For?&lt;/h3&gt;
  2420.  
  2421.  
  2422.  
  2423. &lt;ul class=&quot;wp-block-list&quot;&gt;
  2424. &lt;li&gt;&lt;strong&gt;Students&lt;/strong&gt;: Learn digital logic step by step with instant feedback.&lt;/li&gt;
  2425.  
  2426.  
  2427.  
  2428. &lt;li&gt;&lt;strong&gt;Educators&lt;/strong&gt;: Use it in the classroom to teach logic circuits and CPU architecture interactively.&lt;/li&gt;
  2429.  
  2430.  
  2431.  
  2432. &lt;li&gt;&lt;strong&gt;Makers &amp;amp; Hobbyists&lt;/strong&gt;: Build and test your own logic-based inventions.&lt;/li&gt;
  2433.  
  2434.  
  2435.  
  2436. &lt;li&gt;&lt;strong&gt;Researchers &amp;amp; Developers&lt;/strong&gt;: Prototype logic systems before implementing them in hardware.&lt;/li&gt;
  2437. &lt;/ul&gt;
  2438.  
  2439.  
  2440.  
  2441. &lt;p&gt;Whether you’re building an &lt;strong&gt;ALU&lt;/strong&gt;, a &lt;strong&gt;traffic light controller&lt;/strong&gt;, or your own &lt;strong&gt;8-bit CPU&lt;/strong&gt;, Digital gives you the tools to simulate it with precision.&lt;/p&gt;
  2442.  
  2443.  
  2444.  
  2445. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2446.  
  2447.  
  2448.  
  2449. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;🚀&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/1f680.png&quot; style=&quot;height: 1em;&quot; /&gt; Get Started in Minutes&lt;/h3&gt;
  2450.  
  2451.  
  2452.  
  2453. &lt;ol class=&quot;wp-block-list&quot;&gt;
  2454. &lt;li&gt;Head over to the &lt;a href=&quot;https://github.com/hneemann/Digital&quot;&gt;Digital GitHub repository&lt;/a&gt;.&lt;/li&gt;
  2455.  
  2456.  
  2457.  
  2458. &lt;li&gt;Download the latest release (JAR file).&lt;/li&gt;
  2459.  
  2460.  
  2461.  
  2462. &lt;li&gt;Run it using Java (Java 8 or higher required).&lt;/li&gt;
  2463.  
  2464.  
  2465.  
  2466. &lt;li&gt;Start building your first circuit with just a few clicks.&lt;/li&gt;
  2467. &lt;/ol&gt;
  2468.  
  2469.  
  2470.  
  2471. &lt;p&gt;No complex installations. No licenses. No fees. Just pure learning and tinkering joy.&lt;/p&gt;
  2472.  
  2473.  
  2474.  
  2475. &lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot; /&gt;
  2476.  
  2477.  
  2478.  
  2479. &lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;img alt=&quot;❤&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/16.0.1/72x72/2764.png&quot; style=&quot;height: 1em;&quot; /&gt; Final Thoughts&lt;/h3&gt;
  2480.  
  2481.  
  2482.  
  2483. &lt;p&gt;In a world of expensive and overly complex simulation tools, &lt;strong&gt;Digital&lt;/strong&gt; shines as a &lt;strong&gt;free, open-source&lt;/strong&gt;, and &lt;strong&gt;educator-friendly&lt;/strong&gt; alternative. It’s ideal for classrooms, home labs, and anyone curious about what happens beneath the silicon.&lt;/p&gt;
  2484.  
  2485.  
  2486.  
  2487. &lt;p&gt;So if you’re ready to master digital logic — from basic gates to building your own CPU — it’s time to download &lt;strong&gt;Digital&lt;/strong&gt; and start creating.&lt;/p&gt;
  2488.  
  2489.  
  2490.  
  2491. &lt;p&gt;&lt;strong&gt;Explore. Simulate. Learn. With Digital.&lt;/strong&gt;&lt;/p&gt;
  2492. &lt;p&gt;The post &lt;a href=&quot;https://hamradio.my/2025/07/digital-design-simulate-and-understand-logic-circuits-like-never-before/&quot;&gt;Digital – Design, Simulate, and Understand Logic Circuits Like Never Before&lt;/a&gt; appeared on &lt;a href=&quot;https://hamradio.my&quot;&gt;Hamradio.my - Amateur Radio, Tech Insights and Product Reviews&lt;/a&gt; by &lt;a href=&quot;https://hamradio.my/author/9m2pju/&quot;&gt;9M2PJU&lt;/a&gt;.&lt;/p&gt;</description>
  2493. <pubDate>Fri, 18 Jul 2025 16:05:45 +0000</pubDate>
  2494. </item>
  2495. <item>
  2496. <title>Ubuntu Studio: Ubuntu Studio 24.10 Has Reached End-Of-Life (EOL)</title>
  2497. <guid isPermaLink="false">https://ubuntustudio.org/?p=3006</guid>
  2498. <link>https://ubuntustudio.org/2025/07/ubuntu-studio-24-10-has-reached-end-of-life-eol/</link>
  2499. <description>&lt;p&gt;As of July 10, 2025, all flavors of Ubuntu 24.10, including Ubuntu Studio 24.10, codenamed “Oracular Oriole”, have reached end-of-life (EOL). There will be no more updates of any kind, including security updates, for this release of Ubuntu.&lt;/p&gt;
  2500.  
  2501.  
  2502.  
  2503. &lt;p&gt;If you have not already done so, please upgrade to Ubuntu Studio 25.10 via the instructions &lt;a href=&quot;https://discourse.ubuntu.com/t/ubuntu-studio-25-04-release-notes/53099#p-132280-upgrading-to-ubuntu-studio-2504&quot;&gt;provided here&lt;/a&gt;. If you do not do so as soon as possible, you will lose the ability without additional advanced configuration.&lt;/p&gt;
  2504.  
  2505.  
  2506.  
  2507. &lt;p&gt;No single release of any operating system can be supported indefinitely, and Ubuntu Studio has no exception to this rule.&lt;/p&gt;
  2508.  
  2509.  
  2510.  
  2511. &lt;p&gt;Regular Ubuntu releases, meaning those that are between the Long-Term Support releases, are supported for 9 months and users are expected to upgrade after every release with a 3-month buffer following each release.&lt;/p&gt;
  2512.  
  2513.  
  2514.  
  2515. &lt;p&gt;Long-Term Support releases are identified by an even numbered year-of-release and a month-of-release of April (04). Hence, the most recent Long-Term Support release is 24.04 (YY.MM = 2024.April), and the next Long-Term Support release will be 26.04 (2026.April). LTS releases for official Ubuntu flavors (not Desktop or Server which are supported for five years) are three years, meaning LTS users are expected to upgrade after every LTS release with a one-year buffer.&lt;/p&gt;</description>
  2516. <pubDate>Thu, 10 Jul 2025 12:00:00 +0000</pubDate>
  2517. </item>
  2518. <item>
  2519. <title>Stuart Langridge: Making a Discord activity with PHP</title>
  2520. <guid isPermaLink="false">tag:www.kryogenix.org,2025-07-08:/days/2025/07/08/making-a-discord-activity-with-php/</guid>
  2521. <link>https://www.kryogenix.org/days/2025/07/08/making-a-discord-activity-with-php/</link>
  2522. <description>&lt;p&gt;Another post in what is slowly becoming a series, after describing &lt;a href=&quot;https://www.kryogenix.org/days/2024/01/14/making-a-discord-bot-with-php/&quot;&gt;how to make a Discord bot with PHP&lt;/a&gt;; today we're looking at how to make a Discord activity the same way.&lt;/p&gt;
  2523. &lt;p&gt;An activity is simpler than a bot; Discord activities are basically a web page which loads in an iframe, and can do what it likes in there. You're supposed to use them for games and the like, but I suspect that it might be useful to do quite a few bot-like tasks with activities instead; they take up more of your screen while you're using them, but it's much, much easier to create a user-friendly experience with an activity than it is with a bot. The user interface for bots tends to look a lot like the command line, which appeals to nerds, but having to type &lt;code&gt;!mybot -opt 1 -opt 2&lt;/code&gt; is incomprehensible gibberish to real people. Build a little web UI, you know it makes sense.&lt;/p&gt;
  2524. &lt;p&gt;Anyway, I have not yet actually published one of these activities, and I suspect that there is a whole bunch of complexity around that which I'm not going to get into yet. So this will get you up and running with a Discord activity that you can test, yourself. Making it available to others is step 2: keep an eye out for a post on that.&lt;/p&gt;
  2525. &lt;p&gt;There are lots of &quot;frameworks&quot; out there for building Discord activities, most of which are all about &quot;use React!&quot; and &quot;have this complicated build environment!&quot; and &quot;deploy a node.js server!&quot;, when all you &lt;em&gt;actually&lt;/em&gt; need is an SPA web page&lt;sup id=&quot;sf-making-a-discord-activity-with-php-1-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-making-a-discord-activity-with-php-1&quot; title=&quot;it's gotta be an SPA. Discord does not like it when the page navigates around&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, a JS library, a small PHP file, and that's it. No build step required, no deploying a node.js server, just host it in any web space that does PHP (i.e., all of them). Keep it simple, folks. Much nicer.&lt;/p&gt;
  2526. &lt;h2&gt;Step 1: set up a Discord app&lt;/h2&gt;
  2527. &lt;p&gt;To have an activity, it's gotta be tied to a Discord app. Get one of these as follows:&lt;/p&gt;
  2528. &lt;ul&gt;
  2529. &lt;li&gt;Create an application at &lt;a href=&quot;https://discord.com/developers/applications&quot;&gt;discord.com/developers/applications&lt;/a&gt;. Call it whatever you want&lt;/li&gt;
  2530. &lt;li&gt;Copy the &quot;Application ID&quot; from &quot;General Information&quot; and make a &lt;code&gt;secrets.php&lt;/code&gt; file; add the application ID as &lt;code&gt;$clientid = &quot;whatever&quot;;&lt;/code&gt;&lt;/li&gt;
  2531. &lt;li&gt;In &quot;OAuth2&quot;, &quot;Reset Secret&quot; under Client Secret and store it in &lt;code&gt;secrets.php&lt;/code&gt; as $clientsecret&lt;/li&gt;
  2532. &lt;li&gt;In &quot;OAuth2&quot;, &quot;Add Redirect&quot;: this URL doesn't get used but there has to be one, so fill it in as some URL you like (&lt;code&gt;http://127.0.0.1&lt;/code&gt; works fine)&lt;/li&gt;
  2533. &lt;li&gt;Get the URL of your activity web app (let's say it's &lt;code&gt;https://myserver/myapp/&lt;/code&gt;). Under URL Mappings, add &lt;code&gt;myserver/myapp&lt;/code&gt; (no &lt;code&gt;https://&lt;/code&gt;) as the Root Mapping. This tells Discord where your activity is&lt;/li&gt;
  2534. &lt;li&gt;Under Settings, tick Enable Activities. (Also tick &quot;iOS&quot; and &quot;Android&quot; if you want it to work in the phone app)&lt;/li&gt;
  2535. &lt;li&gt;Under Installation &amp;gt; Install Link, copy the Discord Provided Link. Open it in a browser. This will switch to the Discord desktop app. Add this app to the server of your choice (not to everywhere), and choose the server you want to add it to&lt;/li&gt;
  2536. &lt;li&gt;In the Discord desktop client, click the Activities button (it looks like a playstation controller, at the end of the message entry textbox). Your app should now be in &quot;Apps in this Server&quot;. Choose it and say Launch. Confirm that you're happy to trust it because you're running it for the first time&lt;/li&gt;
  2537. &lt;/ul&gt;
  2538. &lt;p&gt;And this will then launch your activity in a window in your Discord app. It won't do anything yet because you haven't written it, but it's now loading.&lt;/p&gt;
  2539. &lt;h2&gt;Step 2: write an activity&lt;/h2&gt;
  2540. &lt;ul&gt;
  2541. &lt;li&gt;You'll need the Discord Embedded SDK JS library. Go off to &lt;a href=&quot;https://www.jsdelivr.com/package/npm/@discord/embedded-app-sdk&quot;&gt;jsdelivr&lt;/a&gt; and see the URL it wants you to use (at time of writing this is &lt;code&gt;https://cdn.jsdelivr.net/npm/@discord/embedded-app-sdk@2.0.0/+esm&lt;/code&gt; but check). Download this URL to get a JS file, which you should call discordsdk.js. (Note: do not link to this directly. Discord activities can't download external resources without some semi-complex setup. Just download the JS file)&lt;/li&gt;
  2542. &lt;li&gt;Now write the home page for your app -- index.php is likely to be ideal for this, because you need the client ID that you put in &lt;code&gt;secrets.php&lt;/code&gt;. A very basic one, which works out who the user is, looks something like this:&lt;/li&gt;
  2543. &lt;/ul&gt;
  2544. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;x&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  2545. &lt;span class=&quot;x&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  2546. &lt;span class=&quot;x&quot;&gt;I am an activity! You are &amp;lt;output id=&quot;username&quot;&amp;gt;...?&amp;lt;/output&amp;gt;&lt;/span&gt;
  2547. &lt;span class=&quot;x&quot;&gt;&amp;lt;scr ipt type=&quot;module&quot;&amp;gt;&lt;/span&gt;
  2548. &lt;span class=&quot;x&quot;&gt;import {DiscordSDK} from './discordsdk.js';&lt;/span&gt;
  2549. &lt;span class=&quot;x&quot;&gt;const clientid = '&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$clientid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;';&lt;/span&gt;
  2550. &lt;span class=&quot;x&quot;&gt;async function setup() {&lt;/span&gt;
  2551. &lt;span class=&quot;x&quot;&gt;  const discordSdk = new DiscordSDK(clientid);&lt;/span&gt;
  2552. &lt;span class=&quot;x&quot;&gt;  // Wait for READY payload from the discord client&lt;/span&gt;
  2553. &lt;span class=&quot;x&quot;&gt;  await discordSdk.ready();&lt;/span&gt;
  2554. &lt;span class=&quot;x&quot;&gt;  // Pop open the OAuth permission modal and request for access to scopes listed in scope array below&lt;/span&gt;
  2555. &lt;span class=&quot;x&quot;&gt;  const {code} = await discordSdk.commands.authorize({&lt;/span&gt;
  2556. &lt;span class=&quot;x&quot;&gt;    client_id: clientid,&lt;/span&gt;
  2557. &lt;span class=&quot;x&quot;&gt;    response_type: 'code',&lt;/span&gt;
  2558. &lt;span class=&quot;x&quot;&gt;    state: '',&lt;/span&gt;
  2559. &lt;span class=&quot;x&quot;&gt;    prompt: 'none',&lt;/span&gt;
  2560. &lt;span class=&quot;x&quot;&gt;    scope: ['identify'],&lt;/span&gt;
  2561. &lt;span class=&quot;x&quot;&gt;  });&lt;/span&gt;
  2562. &lt;span class=&quot;x&quot;&gt;  const response = await fetch('/.proxy/token.php?code=' + code);&lt;/span&gt;
  2563. &lt;span class=&quot;x&quot;&gt;  const {access_token} = await response.json();&lt;/span&gt;
  2564. &lt;span class=&quot;x&quot;&gt;  const auth = await discordSdk.commands.authenticate({access_token});&lt;/span&gt;
  2565.  
  2566. &lt;span class=&quot;x&quot;&gt;  document.getElementById(&quot;username&quot;).textContent = auth.user.username;&lt;/span&gt;
  2567. &lt;span class=&quot;x&quot;&gt;  /* other properties you may find useful:&lt;/span&gt;
  2568. &lt;span class=&quot;x&quot;&gt;     server ID: discordSdk.guildId&lt;/span&gt;
  2569. &lt;span class=&quot;x&quot;&gt;     user ID: auth.user.id&lt;/span&gt;
  2570. &lt;span class=&quot;x&quot;&gt;     channel ID: discordSdk.channelId */&lt;/span&gt;
  2571. &lt;span class=&quot;x&quot;&gt;}&lt;/span&gt;
  2572. &lt;span class=&quot;x&quot;&gt;setup()&lt;/span&gt;
  2573. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2574.  
  2575. &lt;p&gt;You will see that in the middle of this, we call &lt;code&gt;token.php&lt;/code&gt; to get an access token from the &lt;code&gt;code&lt;/code&gt; that &lt;code&gt;discordSdk.commands.authorize&lt;/code&gt; gives you. While the URL is &lt;code&gt;/.proxy/token.php&lt;/code&gt;, that's just a &lt;code&gt;token.php&lt;/code&gt; file right next to &lt;code&gt;index.php&lt;/code&gt;; the &lt;code&gt;.proxy&lt;/code&gt; stuff is because Discord puts all your requests through their proxy, which is OK. So you need this file to exist. Following the &lt;a href=&quot;https://discord.com/developers/docs/activities/building-an-activity#step-5-authorizing-authenticating-users&quot;&gt;Discord instructions for authenticating users with OAuth&lt;/a&gt;, it should look something like this:&lt;/p&gt;
  2576. &lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
  2577. &lt;span class=&quot;k&quot;&gt;require_once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;secrets.php&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2578.  
  2579. &lt;span class=&quot;nv&quot;&gt;$postdata&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;http_build_query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  2580.    &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  2581.        &lt;span class=&quot;s2&quot;&gt;&quot;client_id&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$clientid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  2582.        &lt;span class=&quot;s2&quot;&gt;&quot;client_secret&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$clientsecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  2583.        &lt;span class=&quot;s2&quot;&gt;&quot;grant_type&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;authorization_code&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  2584.        &lt;span class=&quot;s2&quot;&gt;&quot;code&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$_GET&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;code&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  2585.    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  2586. &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2587.  
  2588. &lt;span class=&quot;nv&quot;&gt;$opts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'http'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt;
  2589.    &lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  2590.        &lt;span class=&quot;s1&quot;&gt;'method'&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'POST'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  2591.        &lt;span class=&quot;s1&quot;&gt;'header'&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
  2592.            &lt;span class=&quot;s1&quot;&gt;'Content-Type: application/x-www-form-urlencoded'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  2593.            &lt;span class=&quot;s1&quot;&gt;'User-Agent: mybot/1.00'&lt;/span&gt;
  2594.        &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  2595.        &lt;span class=&quot;s1&quot;&gt;'content'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$postdata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  2596.        &lt;span class=&quot;s1&quot;&gt;'ignore_errors'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;
  2597.    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  2598. &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2599.  
  2600. &lt;span class=&quot;nv&quot;&gt;$context&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;stream_context_create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$opts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2601.  
  2602. &lt;span class=&quot;nv&quot;&gt;$result_json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file_get_contents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'https://discord.com/api/oauth2/token'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2603. &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$result_json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FALSE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  2604.    &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;no response&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  2605.    &lt;span class=&quot;k&quot;&gt;die&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  2606. &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  2607.  
  2608. &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;json_decode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$result_json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2609. &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;array_key_exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;access_token&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  2610.    &lt;span class=&quot;nb&quot;&gt;error_log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Got JSON response from /token without access_token &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$result_json&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  2611.    &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;no token&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  2612.    &lt;span class=&quot;k&quot;&gt;die&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  2613. &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  2614. &lt;span class=&quot;nv&quot;&gt;$access_token&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;access_token&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
  2615. &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;json_encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;access_token&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$access_token&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  2616. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  2617.  
  2618. &lt;p&gt;And... that's all. At this point, if you Launch your activity from Discord, it should load, and should work out who the running user is (and which channel and server they're in) and that's pretty much all you need. Hopefully that's a relatively simple way to get started.&lt;/p&gt;&lt;ol class=&quot;simple-footnotes&quot;&gt;&lt;li id=&quot;sf-making-a-discord-activity-with-php-1&quot;&gt;it's gotta be an SPA. Discord does not like it when the page navigates around &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-making-a-discord-activity-with-php-1-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
  2619. <pubDate>Tue, 08 Jul 2025 07:11:00 +0000</pubDate>
  2620. </item>
  2621. <item>
  2622. <title>Stuart Langridge: A (limited) defence of footnotes</title>
  2623. <guid isPermaLink="false">tag:www.kryogenix.org,2025-07-03:/days/2025/07/03/a-limited-defence-of-footnotes/</guid>
  2624. <link>https://www.kryogenix.org/days/2025/07/03/a-limited-defence-of-footnotes/</link>
  2625. <description>&lt;p&gt;So, Jake Archibald wrote that we should &quot;&lt;a href=&quot;https://jakearchibald.com/2025/give-footnotes-the-boot/&quot;&gt;give footnotes the boot&lt;/a&gt;&quot;, and... I do not wholly agree. So, here are some arguments against, or at least perpendicular to. Whether this is in grateful thanks of or cold-eyed revenge about him making me drink a limoncello and Red Bull last week can remain a mystery.&lt;/p&gt;
  2626. &lt;p&gt;Commentary about footnotes on the web tends to boil down into two categories: that they're foot, and that they're notes. Everybody&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-1-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-1&quot; title=&quot;sensible&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; agrees that being foot is a problem. Having a meaningless little symbol in some text which you then have to scroll down to the end of a document to understand is stupid. But, and here's the point, &lt;em&gt;nobody does this&lt;/em&gt;. Unless a document on the web was straight up machine-converted from its prior life as a printed thing, any &quot;footnotes&quot; therein will have had some effort made to conceptually locate the content of the footnote inline with the text that it's footnoting. That might be a link which jumps you down to the bottom, or it might be placed at the side, or it might appear inline when clicked on, or it might appear in a popover, but the content of a &quot;footnote&quot; can be reached without your thread of attention being diverted from the point where you were previously&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-2-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-2&quot; title=&quot;for good implementations, anyway; if you make your footnotes a link down to the end of the document, and then don't provide a link back via either the footnote marker or by adding it to the end, then you are a bad web author and I condemn you to constantly find unpaired socks, forever&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
  2627. &lt;p&gt;He's right about the numbers&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-3-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-3&quot; title=&quot;or, ye gods and little fishes, a selection of mad typographic symbols which most people can't even type and need to be copied from the web search results for &amp;quot;that little squiggly section thingy&amp;quot;&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; being meaningless, though, and that they're bad link text; the number &quot;3&quot; gives no indication of what's hidden behind it, and the analogy with &quot;click here&quot; as link text is a good one. We'll come back to this, but it is a correct objection.&lt;/p&gt;
  2628. &lt;h3&gt;What is a footnote, anyway?&lt;/h3&gt;
  2629. &lt;p id=&quot;footnotes-being-set-off&quot;&gt;The issue with footnotes being set off this way (that is: that they're notes) isn't, though, that it's bad (which it is), it's that the alternatives are worse, at least in some situations. A footnote is an extra bit of information which is relevant to what you're reading, but not important enough that you &lt;em&gt;need&lt;/em&gt; to read it right now. That might be because it's explanatory (that is: it expands and enlarges on the main point being made, but isn't directly required), or because it's a reference (a citation, or a link out to where this information was found so it can be looked up later and to prove that the author didn't just make this up), or because it's commentary (where you don't want to disrupt the text that's written with additions inline, maybe because you didn't write it). Or, and this is important, because it's funnier to set it off like this. A footnote used this way is like the voice of the narrator in The Perils of Penelope Pitstop being funny about the situation. Look, I'll choose a random book from my bookshelf&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-4-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-4&quot; title=&quot;alright, I chose a random Terry Pratchett book to make the point, I admit; I'm not stupid. But it really was the closest one to hand; I didn't spend extra time looking for particularly good examples&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;, &lt;em&gt;Reaper Man&lt;/em&gt; by Terry Pratchett.&lt;/p&gt;
  2630.  
  2631. &lt;p&gt;&lt;img alt=&quot;A photograph of a book page. Most of the text is a little blurred to distract attention from it. Midway down the page, unblurred text reads: 'Even the industrial-grade crystal ball was only there as a sop to her customers. Mrs Cake could actually read the future in a bowl of porridge.¹ She could have a revelation in a panful of frying bacon.' At the bottom of the page is the text referenced by the footnote marker, which reads: '¹ It would say, for example, that you would shortly undergo a painful bowel movement.'&quot; src=&quot;https://kryogenix.org/images/pratchett-footnote-example.jpg&quot; /&gt;&lt;/p&gt;
  2632. &lt;p&gt;This is done because it's funny. Alternatives... would not be funny.&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-5-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-5&quot; title=&quot;This is basically &amp;quot;explaining the joke&amp;quot;, something which squashes all the humour out of it like grapes in a press. Sorry, PTerry.&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
  2633. &lt;p&gt;If this read:&lt;/p&gt;
  2634. &lt;blockquote&gt;Even the industrial-grade crystal ball was only there as a sop to her customers. Mrs Cake could actually read the future in a bowl of porridge. (It would say, for example, that you would shortly undergo a painful bowel movement.) She could have a revelation in a panful of frying bacon.&lt;/blockquote&gt;
  2635.  
  2636. &lt;p&gt;then it's too distracting, isn't it? That's giving the thing too much prominence; it derails the point and then you have to get back on board after reading it. Similarly with making it a long note via &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; or via making it &lt;code&gt;&amp;lt;section role=&quot;aside&quot;&amp;gt;&lt;/code&gt;, and Jake does make the point that that's for longer notes.&lt;/p&gt;
  2637. &lt;blockquote&gt;&lt;p&gt;Even the industrial-grade crystal ball was only there as a sop to her customers. Mrs Cake could actually read the future in a bowl of porridge.&lt;/p&gt;
  2638. &lt;details&gt;NoteIt would say, for example, that you would shortly undergo a painful bowel movement.&lt;/details&gt;
  2639. &lt;p&gt;She could have a revelation in a panful of frying bacon.&lt;/p&gt;&lt;/blockquote&gt;
  2640.  
  2641. &lt;p&gt;Now, admittedly, half the reason Pratchett's footnotes are funny is because they're imitating the academic use. But the other half is that there is a place for that &quot;voice of the narrator&quot; to make snarky asides, and we don't really have a better way to do it.&lt;/p&gt;
  2642. &lt;p&gt;Sometimes the parenthesis is the best way to do it. Look at the explanations of &quot;explanatory&quot;, &quot;reference&quot;, and &quot;commentary&quot; in &lt;a href=&quot;http://feeds.feedburner.com/kryogenix#footnotes-being-set-off&quot;&gt;the paragraph above about what a footnote is&lt;/a&gt;. They needed to be inline; the definition of what I mean by &quot;explanatory&quot; should be read along with the word, and you need to understand my definition to understand why I think it's important. It's directly relevant. So it's inline; you must not proceed without having read it. It's not a footnote. But that's not always the case; sometimes you want to expand on what's been written without requiring the reader to read that expansion in order to proceed. It's a help; an addition; something relevant but not &lt;em&gt;too&lt;/em&gt; relevant. (I think this is behind the convention that footnotes are in smaller text, personally; it's a typographic convention that this represents the niggling or snarky or helpful &quot;voice in your head&quot;, annotating the ongoing conversation. But I haven't backed this up with research or anything.)&lt;/p&gt;
  2643. &lt;h3&gt;What's the alternative?&lt;/h3&gt;
  2644. &lt;p&gt;See, this is the point. Assume for the moment that I'm right&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-6-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-6&quot; title=&quot;I always do&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; and that there is some need for this type of annotation -- something which is important enough to be referenced here but not important enough that you must read it to proceed. How do we represent that in a document?&lt;/p&gt;
  2645. &lt;p&gt;Jake's approaches are all reasonable in some situations. A note section (a &quot;sidebar&quot;, I think newspaper people would call it?) works well for long clarifying paragraphs, little biographies of a person you've referenced, or whatever. If that content is less obviously relevant then hiding it behind a collapsed revealer triangle is even better. Short stuff which is that smidge more relevant gets promoted to be entirely inline and put in brackets. Stuff which is entirely reference material (citations, for example) doesn't really need to be in text in the document at all; don't footnote your point and then make a citation which links to the source, just link the text you wrote directly to the source. That certainly is a legacy of print media. There are annoying problems with most of the alternatives (a &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; can't go in a &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; even if inline, which is massively infuriating; sidenotes are great on wide screens but you still need to solve this problem on narrow, so they can't be the answer alone.) You can even put the footnote text in a tooltip as well, which helps people with mouse pointers or (maybe) keyboard navigation, and is what I do right here on this site.&lt;/p&gt;
  2646. &lt;p&gt;But... if you've got a point which isn't important enough to be inline and isn't long enough to get its own box off to the side, then it's gotta go &lt;em&gt;somewhere&lt;/em&gt;, and if that somewhere isn't &quot;right there inline&quot; then it's gotta be somewhere &lt;em&gt;else&lt;/em&gt;, and... that's what a footnote &lt;em&gt;is&lt;/em&gt;, right? Some text elsewhere that you link to.&lt;/p&gt;
  2647. &lt;p&gt;We can certainly take advantage of being a digital document to display the annotation inline if the user chooses to (by clicking on it or similar), or to show a popover (which paper can't do). But if the text isn't displayed to you up front, then you have to click on something to show it, and that thing you click on must not itself be distracting. That means the thing you click on must be small, and not contentful. Numbers (or little symbols) are not too bad an approach, in that light. The technical issues here are dispensed with easily enough, as &lt;a href=&quot;https://front-end.social/@leaverou/114784950642671149&quot;&gt;Lea Verou&lt;/a&gt; points out: yes, put a bigger hit target around your little undistracting numbers so they're not too hard to tap on, that's important.&lt;/p&gt;
  2648. &lt;p&gt;But as Lea goes on to say, and Jake mentioned above... how do we deal with the idea that &quot;3&quot; needs to be both &quot;small and undistracting&quot; but also &quot;give context so it's not just a meaningless number&quot;? This is a real problem; pretty much by definition, if your &quot;here is something which will show you extra information&quot; marker gives you context about what that extra information &lt;em&gt;is&lt;/em&gt;, then it's long enough that you actually have to &lt;em&gt;read&lt;/em&gt; it to understand the context, and therefore it's distracting.&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-7-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-7&quot; title=&quot;I've seen people do footnote markers which are little words rather than numbers, and it's dead annoying. I get what they're trying to do, which is to solve this context problem, but it's worse&quot;&gt;7&lt;/a&gt;&lt;/sup&gt; This isn't really a circle that can be squared: these two requirements are in opposition, and so a compromise is needed.&lt;/p&gt;
  2649. &lt;p&gt;Lea makes the same point with &quot;How to provide context without increasing prominence? Wrapping part of the text with a link could be a better anchor, but then how to distinguish from actual links? Perhaps we need a convention.&quot; And I agree. I think we need a convention for this. But... I think we've already &lt;em&gt;got&lt;/em&gt; a convention, no? A little superscript number or symbol means &quot;this is a marker for additional information, which you need to interact with&lt;sup id=&quot;sf-a-limited-defence-of-footnotes-8-back&quot;&gt;&lt;a class=&quot;simple-footnote&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-8&quot; title=&quot;you might 'interact' with this marker by clicking on it in a digital document, or by looking it up at the bottom of the page in a print doc, but it's all interaction&quot;&gt;8&lt;/a&gt;&lt;/sup&gt; to get that additional information&quot;. Is it a perfect convention? No: the numbers are semantically meaningless. Is there a &lt;em&gt;better&lt;/em&gt; convention? I'm not sure there is.&lt;/p&gt;
  2650. &lt;h3&gt;An end on't&lt;/h3&gt;
  2651. &lt;p&gt;So, Jake's right: a whole bunch of things that are currently presented on the web as &quot;here's a little (maybe clickable) number, click it to jump to the end of the document to read a thing&quot; could be presented much better with a little thought. We web authors could do better at this. But should footnotes go away? I don't think so. Once all the cases of things that should be done better &lt;em&gt;are&lt;/em&gt; done better, there'll still be some left. I don't hate footnotes. I do hate limoncello and Red Bull, though.&lt;/p&gt;&lt;ol class=&quot;simple-footnotes&quot;&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-1&quot;&gt;sensible &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-1-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-2&quot;&gt;for good implementations, anyway; if you make your footnotes a link down to the end of the document, and then &lt;em&gt;don't&lt;/em&gt; provide a link &lt;em&gt;back&lt;/em&gt; via either the footnote marker or by adding it to the end, then you are a bad web author and I condemn you to constantly find unpaired socks, forever &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-2-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-3&quot;&gt;or, ye gods and little fishes, a selection of mad typographic symbols which most people can't even type and need to be copied from the web search results for &quot;&lt;a href=&quot;https://nerdtechy.com/how-to-type-double-s-vertical-symbol&quot;&gt;that little squiggly section thingy&lt;/a&gt;&quot; &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-3-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-4&quot;&gt;alright, I chose a random &lt;em&gt;Terry Pratchett&lt;/em&gt; book to make the point, I admit; I'm not stupid. But it really was the closest one to hand; I didn't spend extra time looking for particularly good examples &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-4-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-5&quot;&gt;This is basically &quot;explaining the joke&quot;, something which squashes all the humour out of it like grapes in a press. Sorry, PTerry. &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-5-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-6&quot;&gt;I always do &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-6-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-7&quot;&gt;I've seen people do footnote markers which are little words rather than numbers, and it's dead annoying. I get what they're trying to do, which is to solve this context problem, but it's worse &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-7-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;li id=&quot;sf-a-limited-defence-of-footnotes-8&quot;&gt;you might 'interact' with this marker by clicking on it in a digital document, or by looking it up at the bottom of the page in a print doc, but it's all interaction &lt;a class=&quot;simple-footnote-back&quot; href=&quot;http://feeds.feedburner.com/kryogenix#sf-a-limited-defence-of-footnotes-8-back&quot;&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
  2652. <pubDate>Thu, 03 Jul 2025 06:12:00 +0000</pubDate>
  2653. </item>
  2654. <item>
  2655. <title>Jos&amp;eacute; Antonio Rey: 2025: Finding a job, and the understanding the market</title>
  2656. <guid isPermaLink="false">http://joseeantonior.wordpress.com/?p=325</guid>
  2657. <link>https://joseeantonior.wordpress.com/2025/06/25/2025-finding-a-job-and-the-understanding-the-market/</link>
  2658. <description>&lt;p&gt;So, I’ve been in the job market for a bit over a year. I was part of a layoff cycle in my last company, and finding a new gig has been difficult. I haven’t been able to find something as of yet, but it’s been a learning curve. The market is not what it has been in the last couple of years. With AI in the mix, lots of roles have been eliminated, or have shifted towards where human intervention is needed to interpret or verify the data AI is interpreting. Job hunting is a job in an of itself, and may even take a 9 to 5 role. I know of a lot of people who have gone through the same process as myself, and wanted to share some of insights and tips from what I’ve learned throughout the last year.&lt;/p&gt;
  2659.  
  2660.  
  2661.  
  2662. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Leveraging your network&lt;/h2&gt;
  2663.  
  2664.  
  2665.  
  2666. &lt;p&gt;First, and I think most important, is to understand that there’s a lot of great people around that you might have worked with. You can always ask for recommendations, touch base, or even have a small chat to see how things are going on their end. Conversations can be very refreshing, and can help you get a new perspective as how the industries are shifting, where you might want to learn new skills, or how to improve your positioning in the market. Folks can talk around and see if there’s additional positions where you might be a good fit, and it’s always good to have a helping hand (or a few). At the end of the day, these folks are your own community. I’ve gotten roles in the past by being referred, and these connections have been critical for my understanding of how different businesses may approach the same problem, or even to solve internal conflicts. So, reach out to people you know!&lt;/p&gt;
  2667.  
  2668.  
  2669.  
  2670. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Understanding the market&lt;/h2&gt;
  2671.  
  2672.  
  2673.  
  2674. &lt;p&gt;Like I mentioned in the opening paragraph, the market is evolving constantly. AI has taken a very solid role nowadays, and lots of companies ask about how you’ve used AI recently. Part of understanding the market is understanding the bleeding edge tools that are used to improve workflows and day-to-day efficiency. Research tools that are coming up, and that are shaping the market. &lt;/p&gt;
  2675.  
  2676.  
  2677.  
  2678. &lt;p&gt;To give you an example. Haven’t tried AI yet? Give it a spin, even for simple questions. Understand where it works, where it fails, and how you, as a human, can make it work for you. Get a sense of the pitfalls, and where human intervention is needed to interpret or verify the data that’s in there. Like one of my former managers said, “trust, but verify”. Or, you can even get to the point of not trusting the data, and sharing that as a story!&lt;/p&gt;
  2679.  
  2680.  
  2681.  
  2682. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Apply thoughtfully&lt;/h2&gt;
  2683.  
  2684.  
  2685.  
  2686. &lt;p&gt;Someone gave me the recommendation to apply to everything that I see where I “could be a fit”. While this might have its upsides, you might also end up in situations where you are not actually a fit, or where you don’t know the company and what it does. Always take the time, at least a few minutes, to understand the company that you’re applying for, research their values, and how they align to yours. Read about the product they’re creating, selling, or offering, and see if it’s a product where you could contribute your skills. Then, you can make the decision of applying. While doing this you may discover that you are applying to a position in a sector that you’re not interested in, or where your skillset might not be used to its full potential. And you might be missing out on some other opportunities that are significantly more aligned to you.&lt;/p&gt;
  2687.  
  2688.  
  2689.  
  2690. &lt;p&gt;Also take the time to fully review the job description. JDs are pretty descriptive, and you might stumble upon certain details that don’t align with yourself, such as the salary, hours, location, or certain expectations that you might feel don’t fit within the role or that you are not ready for.&lt;/p&gt;
  2691.  
  2692.  
  2693.  
  2694. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Prepare for your interviews&lt;/h2&gt;
  2695.  
  2696.  
  2697.  
  2698. &lt;p&gt;You landed an interview – congratulations! Make sure that you’ve researched the company before heading in. If you’ve taken a look at the company and the role before applying, take a glimpse again. You might find more interesting things, and it will demonstrate that you are actually preparing yourself for the interview. Also, interviewing is a two-way street. Make sure that you have some questions at the end. Double-check the role of your interviewer in the company, and ensure that you have questions that are tailored to their particular roles. Think about what you want to get from the interview (other than the job!).&lt;/p&gt;
  2699.  
  2700.  
  2701.  
  2702. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Job sourcing&lt;/h2&gt;
  2703.  
  2704.  
  2705.  
  2706. &lt;p&gt;There are many great job sources today – LinkedIn being the biggest of all of them. Throughout my searches I’ve also found weworkremotely.com and hnhiring.com are great sources. I strongly advise that you expand your search and find sources that are relevant to your particular role or industry. This has opened up a lot of opportunities for me!&lt;/p&gt;
  2707.  
  2708.  
  2709.  
  2710. &lt;h2 class=&quot;wp-block-heading&quot;&gt;Take some time for yourself&lt;/h2&gt;
  2711.  
  2712.  
  2713.  
  2714. &lt;p&gt;I know that having a job is important. However, it’s also important to take time for yourself. Your mental health is important. You can use this time to develop some skills, play some games, take care of your garden, or even reorganize your home. Find a hobby and distract yourself every now and then. Take breaks, and ensure you’re not over-stressing yourself. Read a bit about burnout, and take care of yourself, as burnout can also happen from job hunting. And if you need a breather, make sure you take one, but don’t overdo it! Time is valuable, so it’s all about finding the right balance.&lt;/p&gt;
  2715.  
  2716.  
  2717.  
  2718. &lt;p&gt;&lt;/p&gt;
  2719.  
  2720.  
  2721.  
  2722. &lt;p&gt;Hopefully this is helpful for some folks that are going through my same situation. What other things have worked for you? Do you have any other tips you could share? I’d be happy to read about them! Share them with me on &lt;a href=&quot;https://linkedin.com/in/joseantonio-rey&quot;&gt;LinkedIn&lt;/a&gt;. I’m also happy to chat – you can always find me at jose@ubuntu.com.&lt;/p&gt;</description>
  2723. <pubDate>Wed, 25 Jun 2025 21:39:35 +0000</pubDate>
  2724. </item>
  2725. <item>
  2726. <title>Aaron Rainbolt: The bug that code couldn't fix...</title>
  2727. <guid isPermaLink="true">https://arraybolt3.substack.com/p/the-bug-that-code-couldnt-fix</guid>
  2728. <link>https://arraybolt3.substack.com/p/the-bug-that-code-couldnt-fix</link>
  2729. <description>&lt;p&gt;This isn’t a tech-related post, so if you’re only here for the tech, feel free to skip over.&lt;/p&gt;&lt;p&gt;Any of y’all hate spiders? If you had asked me that last week, I would have said “no”. Turns out you just need to get in a fight with the wrong spider to change that. I’m in the central United States, so thankfully I don’t have to deal with the horror spiders places like Australia have. But even in my not-intrinsically-hostile-to-human-life area of the world, we have some horror spiders of our own turns out. The two most common ones (the Brown Recluse and Black Widow) are basically memes at this point because they get mentioned so often; I’ve been bitten by both so far. The Brown Recluse bite wasn’t really that dramatic before, during, or after treatment, so there’s not really a story to tell there. The Black Widow bite on the other hand… oh boy. Holy moly.&lt;/p&gt;&lt;p&gt;I woke up last Saturday since the alternative was to sleep for 24 hours straight and that sounded awful. There’s lots of good things to do with a Sabbath, why waste the day on sleep? Usually I spend (or at least am &lt;em&gt;supposed&lt;/em&gt; to spend) this day with my family, generally doing Bible study and board games. Over the last few weeks though, I had been using the time to clean up various areas of the house that needed it, and this time I decided to clean up a room that had been flooded some time back. I entered the Room of Despair, with the Sword of Paper Towels in one hand and the Shield of Trash Bags in the other. In front of me stood the vast armies of UghYuck-Hai. (LotR fans will get the joke.&lt;a class=&quot;footnote-anchor&quot; data-component-name=&quot;FootnoteAnchorToDOM&quot; href=&quot;https://arraybolt3.substack.com/feed#footnote-1&quot; id=&quot;footnote-anchor-1&quot; target=&quot;_self&quot;&gt;1&lt;/a&gt;) Convinced that I was effectively invulnerable to anything the hoards could do to me, I entered the fray, and thus was the battle joined in the land of MyHome.&lt;/p&gt;&lt;p&gt;Fast forward two hours of sorting, scrubbing, and hauling. I had made a pretty decent dent in the mess. I was also pretty tired at that point, and our family’s dog needed me to take him outside, so I decided it was time to take a break. I put the leash on the dog, and headed into the great outdoors for a much-needed breath of fresh air.&lt;/p&gt;&lt;p&gt;It was at about that time I realized there was something that felt weird on my left hip. In my neck of the woods, we have to deal with pretty extreme concentrations of mosquitoes, so I figured I probably just had some of my blood repurposed by a flying mini-vampire. Upon closer inspection though, I didn’t see localized swelling indicating a mosquito bite (or any other bite for that matter). The troubled area was just far enough toward my back that I couldn’t see if it had a bite hole or not, and I didn’t notice any kind of discoloration to give me a heads-up either. All I knew is that there was a decent-sized patch of my left hip that HURT if I poked it lightly. I’d previously had random areas of my body hurt when poked (probably from minor bruises), so I just lumped this event in with the rest of the mystery injuries I’ve been through and went on with my day.&lt;/p&gt;&lt;p&gt;Upon coming back from helping the dog out, I still felt pretty winded. I chalked that up to doing strenuous work in an area with bad air for too long, and decided to spend some time in bed to recover. One hour in bed turned into two. Two turned into three. Regardless of how long I laid there, I still just felt &lt;em&gt;exhausted.&lt;/em&gt; “Did I really work that hard?”, I wondered. It didn’t seem like I had done enough work to warrant this level of tiredness. Thankfully I did get to chat with my mom about Bible stuff for a good portion of that time, so I thought the day had been pretty successful nonetheless.&lt;/p&gt;&lt;p&gt;The sun went down. I was still unreasonably tired. Usually this was when me and my mom would play a board game together, but I just wasn’t up for it. I ended up needing to use the restroom, so I went to do that, and that’s when I noticed my now-even-sorer hip wasn’t the only thing that was wrong.&lt;/p&gt;&lt;p&gt;While in the restroom, I felt like my digestive system was starting to get sick. This too was pretty easily explainable, I had just worked in filth and probably got exposed to too much yuck for my system to handle. My temperature was a bit higher than normal. Whatever, not like I hadn’t had fevers before. My head felt sore and stuffed up, which again just felt like I was getting sick in general. My vision also wasn’t great, but for all I know that could have just been because I was focusing more on feeling bad and less on the wall of the bathroom I was looking at. At this point, I didn’t think that the sore hip and the sudden onset fever might be related.&lt;/p&gt;&lt;p&gt;After coming out of the bathroom, I huddled in bed to try to help the minor fever burn out whatever crud I had gotten into. My mom came to help take care of me while I was sick. To my surprise, the fever didn’t stay minor for long - I suddenly started shivering like &lt;em&gt;crazy&lt;/em&gt; even though I wasn’t even remotely cold. My temperature skyrocketed, getting to the point where I was worried it could be dangerously high. I started aching all over and my muscles felt like they got a lot weaker. My heart started pounding furiously, and I felt short of breath. We always keep colloidal silver in the house since it helps with immunity, so my mom gave me some sprays of it and had me hold it under my tongue. I noticed I was salivating a bunch for absolutely no reason while trying to hold the silver spray there as long as I could. Things weren’t really improving, and I noticed my hip was starting to hurt more. I mentioned the sore hip issue to my mom, and we chose to put some aloe vera lotion and colloidal silver on it, just in case I had been bitten by a spider of some sort.&lt;/p&gt;&lt;p&gt;That turned out to be a very good, very very VERY painful idea. After rubbing in the lotion, the bitten area started experiencing severe, relentless stabbing pains, gradually growing in intensity as time progressed. For the first few minutes, I was thinking “wow, this really hurts, what in the world bit me?”, but that pretty quickly gave way to “AAAAA! AAAAA! AAAAAAAAAAAAAA!” I kept most of the screaming in my mind, but after a while it got so bad I just rocked back and forth and groaned for what felt like forever. I’d never had pain like this just keep going and going, so I thought if I just toughed it out for long enough it would eventually go away. This thing didn’t seem to work like that though. After who-knows-how-long, I finally realized this wasn’t going to go away on its own, and so, for reasons only my pain-deranged mind could understand, I tried rolling over on my left side to see if squishing the area would get it to shut up. Beyond all logic, that actually seemed to work, so I just stayed there for quite some time.&lt;/p&gt;&lt;p&gt;At this point, my mom realized the sore hip and the rest of my sickness might be related (I never managed to put the two together). The symptoms I had originally looked like scarlet fever plus random weirdness, but they turned out to match extremely well with the symptoms of a &lt;a href=&quot;https://my.clevelandclinic.org/health/diseases/black-widow-spider-bite&quot;&gt;black widow bite&lt;/a&gt; (I didn’t have the sweating &lt;em&gt;yet&lt;/em&gt; but that ended up happening too). The bite area also started looking discolored, so something was definitely not right. At about this point my kidneys started hurting pretty badly, not as badly as the bite but not too far from it.&lt;/p&gt;&lt;p&gt;I’ll try to go over the rest of the mess relatively quickly. In summary:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;I passed out and fell over while trying to walk back from the restroom at one point. From what I remember, I had started blacking out while in the restroom, realized I needed to get back to bed ASAP, managed to clumsily walk out of the bathroom and most of the way into the bed, then felt myself fall, bump into a lamp, and land on the bed back-first (which was weird, my back wasn’t facing the bed yet). My mom on the other hand, who was not virtually unconscious, reports that I came around the corner, proceeded to fall face first into the lamp with arms outstretched like a zombie, had a minor seizure, and she had to pull me off the lamp and flip me around. All I can think is my brain must have still been active but lost all sensory input and motor control.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I couldn’t get out of bed for over 48 hours straight thereafter. I’d start blacking out if I tried to stand up for very long.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A dime-sized area around the bite turned purple, then black. So, great, I guess I can now say a part of me is dead :P At this point we were also able to clearly see dual fang marks, confirming that this was indeed a spider bite.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I ended up drinking way more water than usual. I usually only drink three or four cups a day, but I drank more like nine or ten cups the day after the bite.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I had some muscle paralysis that made it difficult to urinate. Thankfully that went away after a day.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;My vision got very, very blurry, and my eyes had tons of pus coming out of them for no apparent reason. This was more of an annoyance than anything, I was keeping my eyes shut most of the time anyway, but the crud kept drying and gluing my eyes shut! It was easy enough to just pick off when that happened, but it was one of those things that makes you go “come on, really?”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the third day of recovery, my whole body broke out in a rash that looked like a bunch of purple freckles. They didn’t hurt, didn’t bump up, didn’t even hardly itch, but they looked really weird. Patches of the rash proceeded to go away and come back every so often, which they’re still doing now.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I ended up missing three days of work while laid up.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We kept applying peppermint oil infused aloe vera lotion and colloidal silver to the bite, which helped reduce pain (well, except for the first time anyway :P) and seems to have helped keep the toxins from spreading too much.&lt;/p&gt;&lt;p&gt;A couple of questions come to mind at this point. For one, how do I know that it was a black widow that bit me? Unfortunately, I never saw or felt the spider, so I can’t know for an absolute certainty that I was bitten by a black widow (some people report false widows can cause similar symptoms if they inject you with enough venom). But false widows don’t live anywhere even remotely close to where I live, and black widows are both known to live here and we’ve seen them here before. The symptoms certainly aren’t anything remotely close to a brown recluse bite, and while I am not a medical professional, they seem to match the symptoms of black widow bites very, very well. So even if by some chance this wasn’t a black widow, whatever bit me had just as bad of an effect on me as a black widow would have.&lt;/p&gt;&lt;p&gt;For two, why didn’t I go to a hospital? Number one, everything I looked up said the most they could do is give you antivenom (which can cause &lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/21641165/&quot;&gt;anaphylaxis&lt;/a&gt;, no thank you), or painkillers like fentanyl (which I don’t want anywhere near me, I’d rather feel like I’m dying from a spider bite than take a narcotic painkiller, thanks anyway). Number two, last time a family member had to go to the hospital, the ambulance just about killed him trying to get him there in the first place. I lost most of my respect for my city’s medical facilities that day; if I’m not literally dying, I don’t need a hospital, and if I am dying, my hospitals will probably just kill me off quicker.&lt;/p&gt;&lt;p&gt;I’m currently on day 4 of recovery (including the day I was bitten). I’m still lightheaded, but I can stand without passing out finally. The kidney pain went away, as did the stabbing pain in the bite area (though it still aches a bit, and hurts if you poke it). The fever is mostly gone, my eyes are working normally again and aren’t constantly trying to superglue themselves closed, and my breathing is mostly fine again. I’m definitely still feeling the effects of the bite, but they aren’t crippling anymore. I’ll probably be able to work from home in the morning (I’d try to do household chores too but my mom would probably have a heart attack since I just about killed myself trying to get out of the bathroom).&lt;/p&gt;&lt;p&gt;Speaking of working from home, it’s half past midnight here, I should be going to bed. Thanks for reading!&lt;/p&gt;&lt;div class=&quot;footnote&quot; data-component-name=&quot;FootnoteToDOM&quot;&gt;&lt;a class=&quot;footnote-number&quot; contenteditable=&quot;false&quot; href=&quot;https://arraybolt3.substack.com/feed#footnote-anchor-1&quot; id=&quot;footnote-1&quot; target=&quot;_self&quot;&gt;1&lt;/a&gt;&lt;div class=&quot;footnote-content&quot;&gt;&lt;p&gt;The army of Saruman sent against the fortress of Helm’s Deep was made up of half-elven, half-orc creatures known as Uruk-Hai. “Ugh, yuck!” and “Uruk” sounded humorously similar, so I just went with it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</description>
  2730. <pubDate>Wed, 18 Jun 2025 05:35:05 +0000</pubDate>
  2731.        <enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/>
  2732. </item>
  2733. <item>
  2734. <title>Paul Tagliamonte: The Promised LAN</title>
  2735. <guid isPermaLink="true">https://notes.pault.ag/tpl/</guid>
  2736. <link>https://notes.pault.ag/tpl/</link>
  2737. <description>&lt;p&gt;The Internet has changed a lot in the last 40+ years. Fads have come and gone.
  2738. Network protocols have been designed, deployed, adopted, and abandoned.
  2739. Industries have come and gone. The types of people on the internet have changed
  2740. a lot. The number of people on the internet has changed a lot, creating an
  2741. information medium unlike anything ever seen before in human history. There’s a
  2742. lot of good things about the Internet as of 2025, &lt;strong&gt;but there’s also an
  2743. inescapable hole in what it used to be, for me&lt;/strong&gt;.&lt;/p&gt;
  2744. &lt;p&gt;I miss being able to throw a site up to send around to friends to play with
  2745. without worrying about hordes of AI-feeding HTML combine harvesters DoS-ing my
  2746. website, costing me thousands in network transfer for the privilege. I miss
  2747. being able to put a lightly authenticated game server up and not worry too much
  2748. at night – wondering if that process is now mining bitcoin. I miss being able
  2749. to run a server in my home closet. Decades of cat and mouse games have rendered
  2750. running a mail server nearly impossible. Those who are “brave” enough to try
  2751. are met with weekslong stretches of delivery failures and countless hours
  2752. yelling ineffectually into a pipe that leads from the cheerful lobby of some
  2753. disinterested corporation directly into a void somewhere 4 layers below ground
  2754. level.&lt;/p&gt;
  2755. &lt;p&gt;I miss the spirit of curiosity, exploration, and trying new things. I miss
  2756. building things for fun without having to worry about being too successful,
  2757. after which “security” offices start demanding my supplier paperwork in
  2758. triplicate as heartfelt thanks from their engineering teams. I miss communities
  2759. that are run because it is important to them, not for ad revenue. I miss
  2760. community operated spaces and having more than four websites that are all full
  2761. of nothing except screenshots of each other.&lt;/p&gt;
  2762. &lt;p&gt;Every other page I find myself on now has an AI generated click-bait title,
  2763. shared for rage-clicks all brought-to-you-by-our-sponsors–completely covered
  2764. wall-to-wall with popup modals, telling me how much they respect my privacy,
  2765. with the real content hidden at the bottom bracketed by deceptive ads served by
  2766. companies that definitely know which new coffee shop I went to last month.&lt;/p&gt;
  2767. &lt;p&gt;This is wrong, and those who have seen what was know it.&lt;/p&gt;
  2768. &lt;p&gt;&lt;strong&gt;I can’t keep doing it. I’m not doing it any more. I reject the notion that
  2769. this is as it needs to be. It is wrong. The hole left in what the Internet used
  2770. to be must be filled. I will fill it.&lt;/strong&gt;&lt;/p&gt;
  2771. &lt;h2 id=&quot;what-comes-before-part-b&quot;&gt;What comes before part b?&lt;/h2&gt;
  2772. &lt;p&gt;Throughout the 2000s, some of my favorite memories were from LAN parties at my
  2773. friends’ places. Dragging your setup somewhere, long nights playing games,
  2774. goofing off, even building software all night to get something working—being
  2775. able to do something fiercely technical in the context of a uniquely social
  2776. activity. It wasn’t really much about the games or the projects—it was an
  2777. excuse to spend time together, just hanging out. A huge reason I learned so
  2778. much in college was that campus was a non-stop LAN party – we could freely
  2779. stand up servers, talk between dorms on the LAN, and hit my dorm room computer
  2780. from the lab. Things could go from individual to social in the matter of
  2781. seconds. The Internet used to work this way—my dorm had public IPs handed out
  2782. by DHCP, and my workstation could serve traffic from anywhere on the internet.
  2783. I haven’t been back to campus in a few years, but I’d be surprised if this were
  2784. still the case.&lt;/p&gt;
  2785. &lt;p&gt;In December of 2021, three of us got together and connected our houses together
  2786. in what we now call The Promised LAN. The idea is simple—fill the hole we feel
  2787. is gone from our lives. Build our own always-on 24/7 nonstop LAN party. Build a
  2788. space that is intrinsically social, even though we’re doing technical things.
  2789. We can freely host insecure game servers or one-off side projects without
  2790. worrying about what someone will do with it.&lt;/p&gt;
  2791. &lt;p&gt;Over the years, it’s evolved very slowly—we haven’t pulled any all-nighters.
  2792. Our mantra has become “old growth”, building each layer carefully. As of May
  2793. 2025, the LAN is now 19 friends running around 25 network segments. Those 25
  2794. networks are connected to 3 backbone nodes, exchanging routes and IP traffic
  2795. for the LAN. We refer to the set of backbone operators as “The Bureau of LAN
  2796. Management”. Combined decades of operating critical infrastructure has
  2797. driven The Bureau to make a set of well-understood, boring, predictable,
  2798. interoperable and easily debuggable decisions to make this all happen.
  2799. &lt;a href=&quot;https://tpl.house/&quot;&gt;Nothing here is exotic or even technically interesting&lt;/a&gt;.&lt;/p&gt;
  2800. &lt;h2 id=&quot;applications-of-trusting-trust&quot;&gt;Applications of trusting trust&lt;/h2&gt;
  2801. &lt;p&gt;The hardest part, however, is rejecting the idea that anything outside our own
  2802. LAN is untrustworthy—nearly irreversible damage inflicted on us by the
  2803. Internet. We have solved this by not solving it. We strictly control
  2804. membership—the absolute hard minimum for joining the LAN requires 10 years of
  2805. friendship with at least one member of the Bureau, with another 10 years of
  2806. friendship planned. Members of the LAN can veto new members even if all other
  2807. criteria is met. Even with those strict rules, there’s no shortage of friends
  2808. that meet the qualifications—but we are not equipped to take that many folks
  2809. on. It’s hard to join—-both socially and technically. Doing something malicious
  2810. on the LAN requires a lot of highly technical effort upfront, and it would
  2811. endanger a decade of friendship. We have relied on those human, social,
  2812. interpersonal bonds to bring us all together. It’s worked for the last 4 years,
  2813. and it should continue working until we think of something better.&lt;/p&gt;
  2814. &lt;p&gt;We assume roommates, partners, kids, and visitors all have access to The
  2815. Promised LAN. If they’re let into our friends' network, there is a level of
  2816. trust that works transitively for us—I trust them to be on mine. This LAN is
  2817. not for “security”, rather, the network border is a social one. Benign
  2818. “hacking”—in the original sense of misusing systems to do fun and interesting
  2819. things—is encouraged. Robust ACLs and firewalls on the LAN are, by definition,
  2820. an interpersonal—not technical—failure. We all trust every other network
  2821. operator to run their segment in a way that aligns with our collective values
  2822. and norms.&lt;/p&gt;
  2823. &lt;p&gt;Over the last 4 years, we’ve grown our own culture and fads—around half of the
  2824. people on the LAN have thermal receipt printers with open access, for printing
  2825. out quips or jokes on each other’s counters. It’s incredible how much network
  2826. transport and a trusting culture gets you—there’s a 3-node IRC network, exotic
  2827. hardware to gawk at, radios galore, a NAS storage swap, LAN only email, and
  2828. even a SIP phone network of “redphones”.&lt;/p&gt;
  2829. &lt;h2 id=&quot;diy&quot;&gt;DIY&lt;/h2&gt;
  2830. &lt;p&gt;We do not wish to, nor will we, rebuild the internet. We do not wish to, nor
  2831. will we, scale this. We will never be friends with enough people, as hard as we
  2832. may try. Participation hinges on us all having fun. As a result, membership
  2833. will never be open, and we will never have enough connected LANs to deal with
  2834. the technical and social problems that start to happen with scale. This is a
  2835. feature, not a bug.&lt;/p&gt;
  2836. &lt;p&gt;This is a call for you to do the same. Build your own LAN. Connect it with
  2837. friends’ homes. Remember what is missing from your life, and fill it in. Use
  2838. software you know how to operate and get it running. Build slowly. Build your
  2839. community. Do it with joy. Remember how we got here. Rebuild a community space
  2840. that doesn’t need to be mediated by faceless corporations and ad revenue. Build
  2841. something sustainable that brings you joy. Rebuild something you use daily.&lt;/p&gt;
  2842. &lt;p&gt;Bring back what we’re missing.&lt;/p&gt;</description>
  2843. <pubDate>Mon, 16 Jun 2025 15:58:00 +0000</pubDate>
  2844. </item>
  2845. <item>
  2846. <title>Simon Quigley: Thanks, Mailbox!</title>
  2847. <guid isPermaLink="false">https://medium.com/p/0eb072dabbc1</guid>
  2848. <link>https://medium.com/@tsimonq2/thanks-mailbox-0eb072dabbc1?source=rss-abe8950a00ea------2</link>
  2849. <description>&lt;a href=&quot;https://medium.com/media/553e1df568153a684bfe861e27692fcb/href&quot;&gt;https://medium.com/media/553e1df568153a684bfe861e27692fcb/href&lt;/a&gt;&lt;p&gt;A gentleman by the name of Arif Ali reached out to me on LinkedIn. I won’t share the actual text of the message, but I’ll paraphrase:&lt;br /&gt;&lt;em&gt;“I hope everything is going well with you. I’m applying to be an Ubuntu ‘Per Package Uploader’ for the SOS package, and I was wondering if you could endorse my application.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Arif, thank you! I have always appreciated our chats, and I truly believe you’re doing great work. I don’t want to interfere with anything by jumping on the wiki, but just know you have my full backing.&lt;/p&gt;&lt;p&gt;“So, who actually lets Arif upload new versions of SOS to Ubuntu, and what is it?”&lt;br /&gt;&lt;strong&gt;Great question!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Firstly, I realized that I needed some more info on what SOS is, so I can explain it to you all. On a quick search, &lt;a href=&quot;https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/generating_sos_reports_for_technical_support/generating-an-sos-report-for-technical-support_generating-sos-reports-for-technical-support&quot;&gt;this was the first result&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Okay, so genuine question…&lt;/p&gt;&lt;p&gt;Why does the first DuckDuckGo result for “sosreport” point to an article for a release of Red Hat Enterprise Linux that is two versions old? In other words, hey DuckDuckGo, your grass is starting to get long. Or maybe Red Hat? Can’t tell, I give you both the benefit of the doubt, in good faith.&lt;/p&gt;&lt;p&gt;So, I clarified the search and found &lt;a href=&quot;https://documentation.ubuntu.com/pro/open-case/&quot;&gt;this&lt;/a&gt;. Canonical, you’ve done a great job. Red Hat, you could work on your &lt;a href=&quot;https://en.wikipedia.org/wiki/Search_engine_optimization&quot;&gt;SEO&lt;/a&gt; so I can actually find the &lt;a href=&quot;https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux&quot;&gt;RHEL 10&lt;/a&gt; docs quicker, but hey… B+ for effort. ;)&lt;/p&gt;&lt;p&gt;Anyway, let me tell you about Arif. Just from my own experiences.&lt;/p&gt;&lt;p&gt;He’s incredible. He shows love to others, and whenever I would sponsor one of his packages during my time in Ubuntu, he was always incredibly receptive to feedback. I really appreciate the way he reached out to me, as well. That was really kind, and to be honest, I needed it.&lt;/p&gt;&lt;p&gt;As for character, he has my +1. In terms of &lt;a href=&quot;https://launchpad.net/~developer-membership-board/+members&quot;&gt;the members of the DMB&lt;/a&gt; (aside from one person who I will not mention by name, who has caused me immense trouble elsewhere), here’s what I’d tell you if you asked me privately…&lt;/p&gt;&lt;p&gt;&lt;em&gt;“It’s just PPU. Arif works on SOS as part of his job. Please, do still grill him. The test, and ensuring people know that they actually need to pass a test to get permissions, that’s pretty important.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;That being said, I think he deserves it.&lt;/p&gt;&lt;p&gt;Good luck, Arif. I wish you well in your meeting. I genuinely hope this helps. :)&lt;/p&gt;&lt;p&gt;And to my friends in Ubuntu, I miss you. Please reach out. I’d be happy to write you a public letter, too. Only if you want. :)&lt;/p&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://medium.com/_/stat?event=post.clientViewed&amp;amp;referrerSource=full_rss&amp;amp;postId=0eb072dabbc1&quot; width=&quot;1&quot; /&gt;</description>
  2850. <pubDate>Mon, 09 Jun 2025 17:20:27 +0000</pubDate>
  2851. </item>
  2852. <item>
  2853. <title>Simon Quigley: People in the Arena</title>
  2854. <guid isPermaLink="false">https://medium.com/p/abe0d865357f</guid>
  2855. <link>https://medium.com/@tsimonq2/people-in-the-arena-abe0d865357f?source=rss-abe8950a00ea------2</link>
  2856. <description>&lt;p&gt;Theodore Roosevelt is someone I have admired for a long time. I especially appreciate what has been coined &lt;a href=&quot;https://worldfuturefund.org/Documents/maninarena.htm&quot;&gt;the &lt;em&gt;Man in the Arena&lt;/em&gt; speech&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A specific excerpt comes to mind after reading world news over the last twelve hours:&lt;/p&gt;&lt;p&gt;&lt;em&gt;“It is well if a large proportion of the leaders in any republic, in any democracy, are, as a matter of course, drawn from the classes represented in this audience to-day; but only provided that those classes possess the gifts of sympathy with plain people and of devotion to great ideals. You and those like you have received special advantages; you have all of you had the opportunity for mental training; many of you have had leisure; most of you have had a chance for enjoyment of life far greater than comes to the majority of your fellows. To you and your kind much has been given, and from you much should be expected. Yet there are certain failings against which it is especially incumbent that both men of trained and cultivated intellect, and men of inherited wealth and position should especially guard themselves, because to these failings they are especially liable; and if yielded to, their- your- chances of useful service are at an end. Let the man of learning, the man of lettered leisure, beware of that queer and cheap temptation to pose to himself and to others as a cynic, as the man who has outgrown emotions and beliefs, the man to whom good and evil are as one. The poorest way to face life is to face it with a sneer. There are many men who feel a kind of twister pride in cynicism; there are many who confine themselves to criticism of the way others do what they themselves dare not even attempt. There is no more unhealthy being, no man less worthy of respect, than he who either really holds, or feigns to hold, an attitude of sneering disbelief toward all that is great and lofty, whether in achievement or in that noble effort which, even if it fails, comes to second achievement. A cynical habit of thought and speech, a readiness to criticise work which the critic himself never tries to perform, an intellectual aloofness which will not accept contact with life’s realities — all these are marks, not as the possessor would fain to think, of superiority but of weakness. They mark the men unfit to bear their part painfully in the stern strife of living, who seek, in the affection of contempt for the achievements of others, to hide from others and from themselves in their own weakness. The rôle is easy; there is none easier, save only the rôle of the man who sneers alike at both criticism and performance.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The riots in LA are seriously concerning to me. If something doesn’t happen soon, &lt;a href=&quot;https://www.youtube.com/watch?v=rb8z2BMrd60&quot;&gt;this is going to get out of control&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you are participating in these events, or know someone who is, tell them to &lt;a href=&quot;https://www.youtube.com/watch?v=QuNOwCBYeE4&quot;&gt;calm down&lt;/a&gt;. Physical violence is &lt;strong&gt;never&lt;/strong&gt; the answer, no matter your political party.&lt;/p&gt;&lt;p&gt;De-escalate &lt;strong&gt;immediately&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Be well. &lt;em&gt;Show love to one another!&lt;/em&gt;&lt;/p&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; src=&quot;https://medium.com/_/stat?event=post.clientViewed&amp;amp;referrerSource=full_rss&amp;amp;postId=abe0d865357f&quot; width=&quot;1&quot; /&gt;</description>
  2857. <pubDate>Mon, 09 Jun 2025 05:58:26 +0000</pubDate>
  2858. </item>
  2859. <item>
  2860. <title>Launchpad News: Phasing out Bazaar code hosting</title>
  2861. <guid isPermaLink="false">https://blog.launchpad.net/?p=4464</guid>
  2862. <link>https://blog.launchpad.net/general/phasing-out-bazaar-code-hosting</link>
  2863. <description>&lt;h2&gt;What is Bazaar code hosting?&lt;/h2&gt;
  2864.  
  2865.  
  2866.  
  2867. &lt;p&gt;Bazaar is a distributed revision control system, originally developed by Canonical. It provides similar functionality compared to the now dominant Git.&lt;/p&gt;
  2868.  
  2869.  
  2870.  
  2871. &lt;p&gt;Bazaar code hosting is an offering from Launchpad to both provide a Bazaar backend for hosting code, but also a web frontend for browsing the code. The frontend is provided by the Loggerhead application on Launchpad.&lt;/p&gt;
  2872.  
  2873.  
  2874.  
  2875. &lt;h2&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189#p-160870-sunsetting-bazaar&quot;&gt;&lt;/a&gt;Sunsetting Bazaar&lt;/h2&gt;
  2876.  
  2877.  
  2878.  
  2879. &lt;p&gt;Bazaar passed its peak a decade ago. &lt;a href=&quot;https://launchpad.net/brz&quot;&gt;Breezy&lt;/a&gt; is a fork of Bazaar that has kept a form of Bazaar alive, but the last release of Bazaar was in 2016. Since then the impact has declined, and there are modern replacements like Git.&lt;/p&gt;
  2880.  
  2881.  
  2882.  
  2883. &lt;p&gt;Just keeping Bazaar running requires a non-trivial amount of development, operations time, and infrastructure resources – all of which could be better used elsewhere.&lt;/p&gt;
  2884.  
  2885.  
  2886.  
  2887. &lt;p&gt;Launchpad will now begin the process of discontinuing support for Bazaar.&lt;/p&gt;
  2888.  
  2889.  
  2890.  
  2891. &lt;h2&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189#p-160870-timelines&quot;&gt;&lt;/a&gt;Timelines&lt;/h2&gt;
  2892.  
  2893.  
  2894.  
  2895. &lt;p&gt;We are aware that the migration of the repositories and updating workflows will take some time, that is why we planned sunsetting in two phases.&lt;/p&gt;
  2896.  
  2897.  
  2898.  
  2899. &lt;h3&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189#p-160870-phase-1&quot;&gt;&lt;/a&gt;Phase 1&lt;/h3&gt;
  2900.  
  2901.  
  2902.  
  2903. &lt;p&gt;Loggerhead, the web frontend, which is used to browse the code in a web browser, will be shut down imminently. Analyzing access logs showed that there are hardly any more requests from legit users, but almost the entire traffic comes from scrapers and other abusers. Sunsetting Loggerhead will not affect the ability to pull, push and merge changes.&lt;/p&gt;
  2904.  
  2905.  
  2906.  
  2907. &lt;h3&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189#p-160870-phase-2&quot;&gt;&lt;/a&gt;Phase 2&lt;/h3&gt;
  2908.  
  2909.  
  2910.  
  2911. &lt;p&gt;From September 1st, 2025, we do not intend to have Bazaar, the code hosting backend, any more. Users need to migrate all repositories from Bazaar to Git between now and this deadline.&lt;/p&gt;
  2912.  
  2913.  
  2914.  
  2915. &lt;h2&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189#p-160870-migration-paths&quot;&gt;&lt;/a&gt;Migration paths&lt;/h2&gt;
  2916.  
  2917.  
  2918.  
  2919. &lt;p&gt;The following blog post describes all the necessary steps on how to convert a Bazaar repository hosted on Launchpad to Git.&lt;/p&gt;
  2920.  
  2921.  
  2922.  
  2923. &lt;h3&gt;&lt;a href=&quot;https://jugmac00.github.io/blog/migrate-a-repository-from-bazaar-to-git/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Migrate a Repository From Bazaar to Git&lt;/a&gt;&lt;/h3&gt;
  2924.  
  2925.  
  2926.  
  2927. &lt;h2&gt;&lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189#p-160870-call-for-action&quot;&gt;&lt;/a&gt;Call for action&lt;/h2&gt;
  2928.  
  2929.  
  2930.  
  2931. &lt;p&gt;Our users are extremely important to us. Ubuntu, for instance, has a long history of Bazaar usage, and we will need to work with the Ubuntu Engineering team to find ways to move forward to remove the reliance on the integration with Bazaar for the development of Ubuntu. If you are also using Bazaar and you have a special use case, or you do not see a clear way forward, please reach out to us to discuss your use case and how we can help you.&lt;/p&gt;
  2932.  
  2933.  
  2934.  
  2935. &lt;p&gt;&lt;strong&gt;You can reach us in #launchpad:&lt;a href=&quot;http://ubuntu.com/&quot;&gt;ubuntu.com&lt;/a&gt; on Matrix, or submit a &lt;a href=&quot;https://answers.launchpad.net/launchpad&quot;&gt;question&lt;/a&gt; or send us an e-mail via &lt;a href=&quot;mailto:feedback@launchpad.net&quot;&gt;feedback@launchpad.net&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
  2936.  
  2937.  
  2938.  
  2939. &lt;p&gt;It is also recommended to join the ongoing discussion at &lt;a href=&quot;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189&quot;&gt;https://discourse.ubuntu.com/t/phasing-out-bazaar-code-hosting/62189&lt;/a&gt;.&lt;/p&gt;</description>
  2940. <pubDate>Fri, 06 Jun 2025 09:26:22 +0000</pubDate>
  2941. </item>
  2942. <item>
  2943. <title>Serge Hallyn: Attitudes on privacy and tracking</title>
  2944. <guid isPermaLink="false">http://s3hh.wordpress.com/?p=700</guid>
  2945. <link>https://s3hh.wordpress.com/2025/05/25/attitudes-on-privacy-and-tracking/</link>
  2946. <description>&lt;p&gt;It’s amazing how quickly public opinion changes. Or, how quickly&lt;br /&gt;
  2947. people cave. Remember just 10 years ago, how people felt about&lt;br /&gt;
  2948. google glass?&lt;/p&gt;
  2949. &lt;ul&gt;
  2950. &lt;li&gt;&lt;a href=&quot;https://www.businessinsider.com/i-was-assaulted-for-wearing-google-glass-2014-4&quot; rel=&quot;nofollow&quot;&gt;https://www.businessinsider.com/i-was-assaulted-for-wearing-google-glass-2014-4&lt;/a&gt;&lt;/li&gt;
  2951. &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=m8coAuWZL20&quot; rel=&quot;nofollow&quot;&gt;https://www.youtube.com/watch?v=m8coAuWZL20&lt;/a&gt;&lt;/li&gt;
  2952. &lt;/ul&gt;
  2953. &lt;p&gt;Or how they felt when they found out target was analyzing their&lt;br /&gt;
  2954. purchases and perhaps knew them better than themselves or their&lt;br /&gt;
  2955. family?&lt;/p&gt;
  2956. &lt;ul&gt;
  2957. &lt;li&gt;&lt;a href=&quot;https://techland.time.com/2012/02/17/how-target-knew-a-high-school-girl-was-pregnant-before-her-parents/&quot; rel=&quot;nofollow&quot;&gt;https://techland.time.com/2012/02/17/how-target-knew-a-high-school-girl-was-pregnant-before-her-parents/&lt;/a&gt;&lt;/li&gt;
  2958. &lt;li&gt;&lt;a href=&quot;https://www.forbes.com/sites/kashmirhill/2012/02/16/how-target-figured-out-a-teen-girl-was-pregnant-before-her-father-did/&quot; rel=&quot;nofollow&quot;&gt;https://www.forbes.com/sites/kashmirhill/2012/02/16/how-target-figured-out-a-teen-girl-was-pregnant-before-her-father-did/&lt;/a&gt;&lt;/li&gt;
  2959. &lt;/ul&gt;
  2960. &lt;p&gt;People used to worry about being tracked by companies and government.&lt;br /&gt;
  2961. Today, they feel insecure unless they are certain they are being&lt;br /&gt;
  2962. tracked. For their own well-being of course. If an online store does&lt;br /&gt;
  2963. *not* send an email 10 hours after you’ve “left items in your cart,&lt;br /&gt;
  2964. don’t miss out!”, and another the next day, you feel disappointed. I&lt;br /&gt;
  2965. believe they’re now seen as sub-par.&lt;/p&gt;</description>
  2966. <pubDate>Sun, 25 May 2025 13:00:15 +0000</pubDate>
  2967. </item>
  2968. <item>
  2969. <title>Julian Andres Klode: A SomewhatMaxSAT Solver</title>
  2970. <guid isPermaLink="true">https://blog.jak-linux.org/2025/05/24/somewhatmax-sat-solver/</guid>
  2971. <link>https://blog.jak-linux.org/2025/05/24/somewhatmax-sat-solver/</link>
  2972. <description>&lt;p&gt;&lt;strong&gt;As you may recall&lt;/strong&gt; from previous posts and elsewhere I have been busy writing a new solver for APT.
  2973. Today I want to share some of the latest changes in how to approach solving.&lt;/p&gt;
  2974. &lt;p&gt;The idea for the solver was that manually installed packages are always protected from removals –
  2975. in terms of SAT solving, they are facts. Automatically installed packages become optional unit
  2976. clauses. Optional clauses are solved after manual ones, they don’t partake in normal unit propagation.&lt;/p&gt;
  2977. &lt;p&gt;This worked fine, say you had&lt;/p&gt;
  2978. &lt;pre tabindex=&quot;0&quot;&gt;&lt;code&gt;A                                   # install request for A
  2979. B                                   # manually installed, keep it
  2980. A depends on: conflicts-B | C
  2981. &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Installing &lt;code&gt;A&lt;/code&gt; on a system with &lt;code&gt;B&lt;/code&gt; installed installed &lt;code&gt;C&lt;/code&gt;, as it was not allowed to
  2982. install the &lt;code&gt;conflicts-B&lt;/code&gt; package since &lt;code&gt;B&lt;/code&gt; is installed.&lt;/p&gt;
  2983. &lt;p&gt;&lt;strong&gt;However,&lt;/strong&gt; I also introduced a mode to allow removing manually installed packages, and that’s
  2984. where it broke down, now instead of &lt;code&gt;B&lt;/code&gt; being a fact, our clauses looked like:&lt;/p&gt;
  2985. &lt;pre tabindex=&quot;0&quot;&gt;&lt;code&gt;A                               # install request for A
  2986. A depends on: conflicts-B | C
  2987. Optional: B                     # try to keep B installed
  2988. &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As a result, we installed &lt;code&gt;conflicts-B&lt;/code&gt; and removed &lt;code&gt;B&lt;/code&gt;; the steps the solver takes are:&lt;/p&gt;
  2989. &lt;ol&gt;
  2990. &lt;li&gt;&lt;code&gt;A&lt;/code&gt; is a fact, mark it&lt;/li&gt;
  2991. &lt;li&gt;&lt;code&gt;A depends on: conflicts-B | C&lt;/code&gt; is the strongest clause, try to install &lt;code&gt;conflicts-B&lt;/code&gt;&lt;/li&gt;
  2992. &lt;li&gt;We unit propagate that &lt;code&gt;conflicts-B&lt;/code&gt; conflicts with &lt;code&gt;B&lt;/code&gt;, so we mark &lt;code&gt;not B&lt;/code&gt;&lt;/li&gt;
  2993. &lt;li&gt;&lt;code&gt;Optional: B&lt;/code&gt; is reached, but not satisfiable, ignore it because it’s optional.&lt;/li&gt;
  2994. &lt;/ol&gt;
  2995. &lt;p&gt;This isn’t correct: Just because we allow removing manually installed packages doesn’t mean that we should remove manually installed packages if we don’t need to.&lt;/p&gt;
  2996. &lt;p&gt;&lt;strong&gt;Fixing&lt;/strong&gt; this turns out to be surprisingly easy. In addition to adding our optional (soft) clauses, let’s first assume all of them!&lt;/p&gt;
  2997. &lt;p&gt;But to explain how this works, we first need to explain some terminology:&lt;/p&gt;
  2998. &lt;ol&gt;
  2999. &lt;li&gt;The solver operates on a stack of decisions&lt;/li&gt;
  3000. &lt;li&gt;“enqueue” means a fact is being added at the current decision level, and enqueued for propagation&lt;/li&gt;
  3001. &lt;li&gt;“assume” bumps the decision level, and then enqueues the assumed variable&lt;/li&gt;
  3002. &lt;li&gt;“propagate” looks at all the facts and sees if any clause becomes unit, and then enqueues it&lt;/li&gt;
  3003. &lt;li&gt;“unit” is when a clause has a single literal left to assign&lt;/li&gt;
  3004. &lt;/ol&gt;
  3005. &lt;p&gt;To illustrate this in pseudo Python code:&lt;/p&gt;
  3006. &lt;ol&gt;
  3007. &lt;li&gt;
  3008. &lt;p&gt;We introduce all our facts, and if they conflict, we are unsat:&lt;/p&gt;
  3009. &lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python3&quot; data-lang=&quot;python3&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #66d9ef;&quot;&gt;for&lt;/span&gt; fact &lt;span style=&quot;color: #f92672;&quot;&gt;in&lt;/span&gt; facts:
  3010. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    enqueue(fact)
  3011. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #66d9ef;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #f92672;&quot;&gt;not&lt;/span&gt; propagate():
  3012. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color: #66d9ef;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #66d9ef;&quot;&gt;False&lt;/span&gt;
  3013. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
  3014. &lt;li&gt;
  3015. &lt;p&gt;For each optional literal, we register a soft clause and assume it. If the assumption fails,
  3016. we ignore it. If it succeeds, but propagation fails, we undo the assumption.&lt;/p&gt;
  3017. &lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python3&quot; data-lang=&quot;python3&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #66d9ef;&quot;&gt;for&lt;/span&gt; optionalLiteral &lt;span style=&quot;color: #f92672;&quot;&gt;in&lt;/span&gt; optionalLiterals:
  3018. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    registerClause(SoftClause([optionalLiteral]))
  3019. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color: #66d9ef;&quot;&gt;if&lt;/span&gt; assume(optionalLiteral) &lt;span style=&quot;color: #f92672;&quot;&gt;and&lt;/span&gt; &lt;span style=&quot;color: #f92672;&quot;&gt;not&lt;/span&gt; propagate():
  3020. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;        undo()
  3021. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
  3022. &lt;li&gt;
  3023. &lt;p&gt;Finally we enter the main solver loop:&lt;/p&gt;
  3024. &lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python3&quot; data-lang=&quot;python3&quot;&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #66d9ef;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #66d9ef;&quot;&gt;True&lt;/span&gt;:
  3025. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color: #66d9ef;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #f92672;&quot;&gt;not&lt;/span&gt; propagate():
  3026. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color: #66d9ef;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #f92672;&quot;&gt;not&lt;/span&gt; backtrack():
  3027. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color: #66d9ef;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #66d9ef;&quot;&gt;False&lt;/span&gt;
  3028. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color: #66d9ef;&quot;&gt;elif&lt;/span&gt; &lt;span style=&quot;color: #f92672;&quot;&gt;&amp;lt;&lt;/span&gt;all clauses are satisfied&lt;span style=&quot;color: #f92672;&quot;&gt;&amp;gt;&lt;/span&gt;:
  3029. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color: #66d9ef;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #66d9ef;&quot;&gt;True&lt;/span&gt;
  3030. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color: #66d9ef;&quot;&gt;elif&lt;/span&gt; it &lt;span style=&quot;color: #f92672;&quot;&gt;:=&lt;/span&gt; find(&lt;span style=&quot;color: #e6db74;&quot;&gt;&quot;best unassigned literal satisfying a hard clause&quot;&lt;/span&gt;):
  3031. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;        assume(it)
  3032. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color: #66d9ef;&quot;&gt;elif&lt;/span&gt; it &lt;span style=&quot;color: #f92672;&quot;&gt;:=&lt;/span&gt; find(&lt;span style=&quot;color: #e6db74;&quot;&gt;&quot;best literal satisfying a soft clause&quot;&lt;/span&gt;):
  3033. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display: flex;&quot;&gt;&lt;span&gt;        assume(it)
  3034. &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
  3035. &lt;/ol&gt;
  3036. &lt;p&gt;The key point to note is that the main loop will undo the assumptions in order; so
  3037. if you assume &lt;code&gt;A,B,C&lt;/code&gt; and &lt;code&gt;B&lt;/code&gt; is not possible, we will have also undone &lt;code&gt;C&lt;/code&gt;. But since
  3038. &lt;code&gt;C&lt;/code&gt; is also enqueued as a soft clause, we will then later find it again:&lt;/p&gt;
  3039. &lt;ol&gt;
  3040. &lt;li&gt;Assume &lt;code&gt;A&lt;/code&gt;: &lt;code&gt;State=[Assume(A)]&lt;/code&gt;, &lt;code&gt;Clauses=[SoftClause([A])]&lt;/code&gt;&lt;/li&gt;
  3041. &lt;li&gt;Assume &lt;code&gt;B&lt;/code&gt;: &lt;code&gt;State=[Assume(A),Assume(B)]&lt;/code&gt;, &lt;code&gt;Clauses=[SoftClause([A]),SoftClause([B])]&lt;/code&gt;&lt;/li&gt;
  3042. &lt;li&gt;Assume &lt;code&gt;C&lt;/code&gt;: &lt;code&gt;State=[Assume(A),Assume(B),Assume(C)]&lt;/code&gt;, &lt;code&gt;Clauses=[SoftClause([A]),SoftClause([B]),SoftClause([C])]&lt;/code&gt;&lt;/li&gt;
  3043. &lt;li&gt;Solve finds a conflict, backtracks, and sets &lt;code&gt;not C&lt;/code&gt;: &lt;code&gt;State=[Assume(A),Assume(B),not(C)]&lt;/code&gt;&lt;/li&gt;
  3044. &lt;li&gt;Solve finds a conflict, backtracks, and sets &lt;code&gt;not B&lt;/code&gt;: &lt;code&gt;State=[Assume(A),not(B)]&lt;/code&gt; – C is no longer assumed either&lt;/li&gt;
  3045. &lt;li&gt;Solve, assume &lt;code&gt;C&lt;/code&gt; as it satisfies &lt;code&gt;SoftClause([C])&lt;/code&gt; as next best literal: &lt;code&gt;State=[Assume(A),not(B),Assume(C)]&lt;/code&gt;&lt;/li&gt;
  3046. &lt;li&gt;All clauses are satisfied, solution is &lt;code&gt;A&lt;/code&gt;, &lt;code&gt;not B&lt;/code&gt;, and &lt;code&gt;C&lt;/code&gt;.&lt;/li&gt;
  3047. &lt;/ol&gt;
  3048. &lt;p&gt;&lt;strong&gt;This is not (correct) MaxSAT&lt;/strong&gt;, because we actually do not guarantee that we satisfy as many soft clauses as possible. Consider you have the following clauses:&lt;/p&gt;
  3049. &lt;pre&gt;&lt;code&gt;Optional: A
  3050. Optional: B
  3051. Optional: C
  3052. B Conflicts with A
  3053. C Conflicts with A
  3054. &lt;/code&gt;&lt;/pre&gt;
  3055. &lt;p&gt;There are two possible results here:&lt;/p&gt;
  3056. &lt;ol&gt;
  3057. &lt;li&gt;&lt;code&gt;{A}&lt;/code&gt;   – If we assume &lt;code&gt;A&lt;/code&gt; first, we are unable to satisfy &lt;code&gt;B&lt;/code&gt; or &lt;code&gt;C&lt;/code&gt;.&lt;/li&gt;
  3058. &lt;li&gt;&lt;code&gt;{B,C}&lt;/code&gt; – If we assume either &lt;code&gt;B&lt;/code&gt; or &lt;code&gt;C&lt;/code&gt; first, &lt;code&gt;A&lt;/code&gt; is unsat.&lt;/li&gt;
  3059. &lt;/ol&gt;
  3060. &lt;p&gt;The question to ponder though is whether we actually need a global maximum or whether a local maximum is satisfactory in practice for a dependency solver
  3061. If you look at it, a naive MaxSAT solver needs to run the SAT solver &lt;code&gt;2**n&lt;/code&gt; times for &lt;code&gt;n&lt;/code&gt; soft clauses, whereas our heuristic only needs &lt;code&gt;n&lt;/code&gt; runs.&lt;/p&gt;
  3062. &lt;p&gt;For dependency solving, it seems we do not seem have a strong need for a global maximum:
  3063. There are various other preferences between our literals, say priorities;
  3064. and empirically, from evaluating hundreds of regressions &lt;em&gt;without&lt;/em&gt; the initial assumptions,
  3065. I can say that the assumptions do fix those cases and the result is correct.&lt;/p&gt;
  3066. &lt;p&gt;&lt;strong&gt;Further improvements&lt;/strong&gt; exist, though, and we can look into them if they are needed, such as:&lt;/p&gt;
  3067. &lt;ul&gt;
  3068. &lt;li&gt;
  3069. &lt;p&gt;Use a &lt;em&gt;better heuristic&lt;/em&gt;:&lt;/p&gt;
  3070. &lt;p&gt;If we assume 1 clause and solve, and we cause 2 or more clauses to become unsatisfiable,
  3071. then that clause is a local minimum and can be skipped.
  3072. This is a more common heuristical MaxSAT solver.
  3073. This gives us a &lt;em&gt;better&lt;/em&gt; local maximum, but not a global one.&lt;/p&gt;
  3074. &lt;p&gt;This is more or less what the &lt;a href=&quot;https://labix.org/smart&quot;&gt;Smart package manager&lt;/a&gt; did,
  3075. except that in Smart, all packages were optional, and the entire solution was scored.
  3076. It calculated a basic solution without optimization and then toggled each variable and saw if the score improved.&lt;/p&gt;
  3077. &lt;/li&gt;
  3078. &lt;li&gt;
  3079. &lt;p&gt;Implement &lt;em&gt;an actual search for a global maximum&lt;/em&gt;:&lt;/p&gt;
  3080. &lt;p&gt;This involves reading the literature.
  3081. There are various versions of this, for example:&lt;/p&gt;
  3082. &lt;ol&gt;
  3083. &lt;li&gt;
  3084. &lt;p&gt;Find unsatisfiable cores and use those to guide relaxation of clauses.&lt;/p&gt;
  3085. &lt;/li&gt;
  3086. &lt;li&gt;
  3087. &lt;p&gt;A bounds-based search, where we translate sum(satisifed clauses) &amp;gt; k into SAT, and then search in one of the following ways:&lt;/p&gt;
  3088. &lt;ol&gt;
  3089. &lt;li&gt;from 0 upward&lt;/li&gt;
  3090. &lt;li&gt;from n downward&lt;/li&gt;
  3091. &lt;li&gt;perform a binary search on [0, k] satisfied clauses.&lt;/li&gt;
  3092. &lt;/ol&gt;
  3093. &lt;p&gt;&lt;em&gt;Actually&lt;/em&gt; we do not even need to calculate sum constraints into CNF, because we can just add a specialized new type of constraint to our code.&lt;/p&gt;
  3094. &lt;/li&gt;
  3095. &lt;/ol&gt;
  3096. &lt;/li&gt;
  3097. &lt;/ul&gt;</description>
  3098. <pubDate>Sat, 24 May 2025 10:14:58 +0000</pubDate>
  3099. </item>
  3100.  
  3101. </channel>
  3102. </rss>
  3103.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//planet.ubuntu.com/rss20.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda